Кавычки, слеши и безопасность скриптов

svetasmirnova

маленький монстрик
ребята, ну что читать облом или тупо так сделано, что и отвечать не хочется. задолбал я наверное всех с этой темой.
Угадал.
Кстати, то, что я тебе написала, ты так и не просёк :(
 

krafty

new Exception
ну почему не просек? хакер, пытаясь подставить например вместо поля id какуя-нубудь строку, обламается, потому что функция int преобразует ее в 0
 

svetasmirnova

маленький монстрик
Ага, а у тебя в базе строка появится с id=0 или ошибка, если таковая уже есть.

-~{}~ 01.09.05 20:12:

И это даже не самое страшное. Даже не знаю как объяснять почему ВСЕГДА надо проверять ВСЕ входные данные. В конце концов, строку может ввести не хакер, а "самый важный клиент", который и обломается. Вместо того, чтобы получить корректное сообщение. Потом не только с числами такая проблема есть.
Ну да ладно: пиши главное, не боись. Ничего страшного с твоей проверкой не случится, а дальше сам поймёшь
 

krafty

new Exception
ага это чревато тем, что если в запросе INSERT или UPDATE, то не к той записи применется. если в SELECT, то не так страшно. (это все справедливо если в таблице есть запись с id=0).
что же делать. может сделать проверку типа, если id==0, то запрос вообще не выполняем (в таблице записи с id=0 тогда быть не должно).
ты написала, что нужно проверять все входные данные. КАК? я-то проверяю. может неправильно.

-~{}~ 01.09.05 19:20:

кстати зачем самому важному клиенту вводит строку, которая будет подставлятся в целочисленное поле. тогда он хакер или просто не соображает, что творит. ошибки можно подавлять, тогда будет показываться пустая страница
 

svetasmirnova

маленький монстрик
>кстати зачем самому важному клиенту вводит строку, которая будет подставлятся в целочисленное поле

Да полем может ошибиться элементарно

>КАК? я-то проверяю. может неправильно.
По смыслу. Т.е. если в поле должно быть целое число: проверяй, является ли переданное значение [m]is_numeric[/m]; если дата, то формат; если логин-пароль, то наличие недопустимых символов и т.п.
 

krafty

new Exception
спасибо! буду пытаться все твои советы в библиотеку внедрить

-~{}~ 01.09.05 19:35:

я вот подумал об альтернативе: проверка полей на JavaScript. хотя... от ввода в адресную строку это не спасет естественно.
 

svetasmirnova

маленький монстрик
>проверка полей на JavaScript
Это нужно, чтобы клиент не ждал, пока перезагрузится страничка с ошибочной формой. А от кулхацкеров не спасёт, к сожалению. И JS может быть отключён.
Т.е. это не альтернатива, а юзабилити. Важная и полезная вещь.
 

krafty

new Exception
слушай проблемка тут нарисовалась. addCslashes творит чудеса в моей библиотеке: в выражении LIKE она выдает \\%text\\%
а эксперимент
echo addcslashes("%text%","%_") - все ОК \%text\%
 

Фанат

oncle terrible
Команда форума
Второй случай - получение данных от пользователя, сохранение их в базе и вывод в браузер:
так не бывает
либо сохранение, либо вывод

3. далее проверяем включен ли режим волшебных кавычек. если включен, то убиваем слеши в данных, поступающих от пользователя (get, post, cookie, ...).
непонятно, при чём тут пост, если мы выводим из базы.
и вообще мы от кавычек давно уже избавились, в самом начале любого скриитпа. зачем об этом отдельно писать?
 

krafty

new Exception
>так не бывает либо сохранение, либо вывод
я имел ввиду те процессы, к которым нужно применять описанные мною действия.

-~{}~ 01.09.05 19:55:

Света, я тоже смутно пока представляю, но я всецело доверился статье на phpfaq.ru. вобщем если интересует, то спроси у Фаната
 

Фанат

oncle terrible
Команда форума
тогда объясни, чем отличается первый случай от второго.

svetasmirnova
если бы он писал полностью то вопроса бы не было
addCslashes ('_%')
 

krafty

new Exception
с точки зрения методики решения проблем уязвимости, как я уже понял, ничем.
>если бы он писал полностью то вопроса бы не было
что это значит? что полностью писал: содержание проблемы, применение функции
 

krafty

new Exception
моей что-ли?

function for_like_expr($str)
{
return addcslashes($str,'%_');
}
?>

mysql_query("SELECT * FROM t WHERE date1='".for_query($date1,'str')."' AND id='".for_query($id,'int')."' AND text LIKE '".for_like_expr("%$text%")."'");
 

Фанат

oncle terrible
Команда форума
а почему фор лайк не вызывает фор квери?

-~{}~ 01.09.05 21:30:

я считаю, что насильственное приведение типов - баловство
 

master_x

Pitavale XXI wieku
to krafty:
а почему бы вообще на входе, не проверять весь массив $_POST спец. валидатором, если что не так показывать пользователю сообщение?
 

krafty

new Exception
function for_query($param,$type)
{
switch ($type) {
case 'int': $param=(int)$param; break;
case 'float': $param=(float)$param; break;
}
$param=addcslashes($param,'%_');
return mysql_escape_string($param);
}

но это проблему не решает.

>я считаю, что насильственное приведение типов - баловство
альтернатива?
 
Сверху