Задавал я недавно нескольким девелам простой, казалось бы, вопрос. Но на него не отвечали.
А вопрос такой: “Вот допустим, получили мы данные из формы, сразу же натравили на них addslashes(), отправили все это дело… не в БД, а на экран. И мы видим, что addslashes() применился дважды. Но смотрим в код – единожды. Почему такое случилось?”
А случится такое могло из-за того, что не проверили перед тем, как применять addslashes, установлены ли magic_quotes.
“Магические кавычки” – это, казалось бы, очень полезная вещь. Вы получаете данные из формы – и они уже с добавленными бэкслешами. Чего ж тут думать, берем и вносим их сразу в БД, подумали бы некоторые. И через пару дней работы такого сайта получим SQL-Injection или ошибки при выводе данных.
И вот зная это, надо было проверить, включены ли “магические кавычки”, и только после этого применять addslashes(). Кслову, я бы предпочел использовать mysql_real_escape_string() вместо кавычек.
Ну вот и ответ на вопрос. А для более любопытных – http://www.webmasterstop.com/63.html.
PS: а в PHP6 “магических кавычек” не будет. Все данные, как им и полагается, будут попадать в скрипт такими, какими их ввели. И по-моему это заставляет задуматься о фильтрации данных своими силами, что есть правильно.
А по-моему очень удобно.
Вот к примеру есть у тебя формочка, туда написали, допустим
Вова\nПутин
Просабмитили. Что ты получил? Строку “Вова\nПутин”, которую собственно и сабмитили. Юзер ведь не имел в виду перевод строки, верно?
anton
October 13th, 2006
Оно-то конечно может и удобней.
А кто говорит, что я буду вот так сразу проверять на эту строку? Я сам сделаю вырезание всего лишнего, или экранирование этого. Потому как полагаться на магические кавычки – все-равно надо перепроверять, а включены ли они. И что делать, если на горе-хостинге они выключены? Админ же не будет ради одного сайта их включать.
dm
October 16th, 2006
“И что делать, если на горе-хостинге они выключены? Админ же не будет ради одного сайта их включать.”
A string ini_get ( string varname ); i string ini_set ( string varname, string newvalue ); ne pomojet dlya borby s etim v nachale scripta?
Ili ya chto-to ne tak ponimayu?
P.S. sorry za translit
Kostiantyn Sokolinskyi
October 30th, 2006
Я обычно в конфиге (файл, который инклудится во все скрипты проекта) ставлю такую строку:
if(get_magic_quotes_gpc()!=1) die(“Security error! Contact developer.”);
и ни о чём не беспокоюсь
А по поводу PHP6.. сомневаюсь что магических кавычек там не будет. Скорее всего они просто по умолчанию буду выключены (например как выключены auto_globals).
#Dialer
October 30th, 2006
ну, зачем же так жестко – сразу сикьюрити эрор.
чем такой вариант инклуда в index.php плох?
function array_addslashes(&$item, $key){
if(is_array($item)){
array_walk($item, ‘array_addslashes’);
}else{
$item = addslashes($item);
}
}
if(!get_magic_quotes_gpc()){
array_walk($_POST, ‘array_addslashes’);
array_walk($_GET, ‘array_addslashes’);
array_walk($_COOKIE, ‘array_addslashes’);
}
Alex
November 3rd, 2006
юзайте filter и будет вам счастье =)
Скоро опишу работу с этим расширением
dm
November 3rd, 2006