LINUX.ORG.RU
ФорумTalks

Задачки...

 , ,


2

6

Задачка для студентов:

Есть оракел. Есть cкрипт:

connect trainer@dbname;

create table students(
    login varchar2(64) unique not null,
    testresult number(2) default 2 not null
);

create procedure taketest(myresult number) is begin
    if myresult > 2 then
        raise_application_error(
            -20000,
            'Обломитесь. Препод не лох'
        );
    elsif myresult < 0 then
        raise_application_error(
            -20000,
            'Студент, тебя сейчас отчислят!'
        );
    end if;
    execute immediate
        'update students set testresult=' ||
            to_char(myresult) ||
            ' where login = '''||USER||'''';
end;
/

grant select on students to public;
grant execute on taketest to public;
grant create public synonym to public;

create user STUDENT1 identifified by "Password1";
create user STUDENT2 identifified by "Password2";
create user STUDENT3 identifified by "Password3";

grant connect, resource to student1;
grant connect, resource to student2;
grant connect, resource to student3;

insert into students(loginname) values ('STUDENT1');
insert into students(loginname) values ('STUDENT2');
insert into students(loginname) values ('STUDENT3');

Задача студента - используя свой логин (Student{1|2|3}) и пароль, вписать в таблицу к преподавателю свою оценку :-)

★★★★★

Последнее исправление: no-dashi (всего исправлений: 1)

begin;

taketest(select 1 from students where login = 'STUDENT1');

end;

commit;

Я бы свалил с такого факультета. Задача для сис. админа, но не DBA :)

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 4)
Ответ на: комментарий от CYB3R

Задачка-то простая совсем, нэ?

Я бы сказал немного глупая. Вопросами раскидывания прав DBA может не заниматься :) А в продакшене никого не парит, что такое извращение вообще надо делать. Не, ну если у вас сервис позволяет делать update/insert/select через банальный sql inject, то да - это надо знать любому пхпшнику)

gh0stwizard ★★★★★
()
Ответ на: комментарий от CYB3R

И да, про синоним не забыл, просто писал на память. Но всетаки нагуглил: http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm

Тогда верно делать так:



create public synonym test for taketest;

select * from table(test(select 1 from dual));

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Я бы свалил с такого факультета.

Ты походу задачку не понял. Объясняю - в схеме преподавателя лежит табличка students. В ней записано

('STUDENT1',2), ('STUDENT2',2), ('STUDENT3',2)

Твоя задача - записать в таблицу trainer.students свою желаемую оценку. По окончании экзамена оценка, хранящаяся в этой таблице, пойдет в ведомость напротив твоей фамилии.

P.S.: пока что ты получил 1 балл. То бишь «неудовлетворительно».

no-dashi ★★★★★
() автор топика
Ответ на: комментарий от gh0stwizard

select * from table(test(select 1 from dual));

Тафай-тафай. Опять мимо. taketest (как и твой test) это процедура. Тебя компилятор на три буквы и пять цифр пошлет. На ORA-00904 :-)

no-dashi ★★★★★
() автор топика
Ответ на: комментарий от gh0stwizard

Ок, делаем select 2 from dual, что меняет? Ты этого не предвидел?

Два балла. Опять таки неудовлетворительно. Продолжай в том же духе. «Удовлетворительно» это три балла, «хорошо» - четыре, «Отлично» - 5 и выше.

no-dashi ★★★★★
() автор топика
Ответ на: комментарий от gh0stwizard

Ты отчислен. Этот код скомпилирован, и оценки 1 и 2 он успешно проставляет :-) Задача - прописать себе хотя-бы оценку 3. Пока что ты лажаешься со страшной силой, увы.

no-dashi ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

Ты отчислен.

Да.. Привык зазубривать все подряд? Жаль ораклюшки нет под рукой, тогда бы правильный ответ был бы в первом посту.

Знаешь почему задача глупа? Методом тыка рано или поздно можно проставить себе все 99999 балов :)

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Жаль ораклюшки нет под рукой

Она тебе не поможет. Логика абсолютна прозрачна - можно вписать только 0,1,2 - а нужно вписать как минимум 3.

Код специально написан так, чтобы это можно было сделать - но «в лоб» сделать это не получится.

Наводящая подсказка - задача для студентов кафедры компьютерной безопасности. Нужно увидеть уязвимость и проэксплуатировать её.

no-dashi ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

Наводящая подсказка - задача для студентов кафедры компьютерной безопасности. Нужно увидеть уязвимость и проэксплуатировать её.

Вопрос от человека с Oracle не работавшего, да и кафедру компьютерной безопасности не заканчивавшего: дело во влиянии текущей локали на to_char (использовании запятой вместо точки для разделения целой и дробной части) и наличия в PL/SQL оператора ',' на манер сишного?

Begemoth ★★★★★
()

как-то ты... поздновато, прямо скажем.

имхо null пройдет твои проверки, nvl-а там имхо нехватает, но дальше...? есть какой-то оракловый фокус?

Rastafarra ★★★★
()

Я вообще не знаю это ваш оракл, но разве это нормально?

testresult number(2)
'update students set testresult=' ||
            to_char(myresult) ||
            ' where login = '''||USER||'''';

cdshines ★★★★★
()
Ответ на: комментарий от Begemoth

ну тогда taketest(0.5) с предварительно заданной NLS_NUMERIC_CHARACTERS=«+ »

Я сыграю тут роль оракуля, «Эксепшн XXXXX: задан неверный параметр или значение».

Но ход мысли интересный

no-dashi ★★★★★
() автор топика

С учетом наличия у public привилегии 'create public synonym', можно было бы создать функцию to_char и определить для нее публичный синоним.
Но во-первых: у студента вряд ли есть привилегия на создание функций;
во-вторых: вряд ли наличие публичного синонима на функцию to_char перекроет видимость встроенной SQL-функции.

Ja-Ja-Hey-Ho ★★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

Пробел-точка работает, а плюс-пробел выдаст ошибку. Не все варианты валидны.

no-dashi ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.