Обрабокта переменных

Desh

Новичок
Обрабокта переменных

Есть у меня функция, которая обрабатывает переменные убирая опасные символы:

PHP:
function check_value($string) {
$string = trim($string);
if(get_magic_quotes_gpc()) $string = stripslashes($string);
$string = htmlspecialchars($string,ENT_QUOTES);
return $string;
}
Скажем есть переменная id, в файле я ее обрабатываю как $id = check_value($id), нужно ли делать такую обработку при register_globals = Off? Тоесть $id = check_value($_GET['id']), или нет необходимости?

И вообще, корректна ли моя функция обработки?
 

HraKK

Мудак
Команда форума
эх прочитай про фильтры и валидаторы хоть на Зенде)
 

Desh

Новичок
А подоступнее можно объяснить? При чем тут Зенд?
 

Фанат

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

Desh

Новичок
Обычно я просто все делал с register_globals = On и не парился, обрабатывая все переменные через выше приведенную функцию, а тут озадачился вопросом, а стоит ли при register_globals = Off обрабатывать переменные типа $_GET['id'] и т.п. посему решил задать вопрос. Ведь любая переменная может быть угрозой безопасности движка, а я стремлюсь максимально его обезопасить. Так вот в том и вопрос, как правильнее поступать в данном случае.
 

Фанат

oncle terrible
Команда форума
а почему ты решил, что при register_globals = Off ничего обрабатывать не нужно? что делает переменную $_GET['id'] полностью безопасной?
 

Desh

Новичок
так потому и спрашиваю, стоит ли такие переменные обрабатывать выше приведенной функцией, и корректна ли сама функция!:)
 

Фанат

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

да, надо. другое дело, что делать это надо осмысленно.
 

Desh

Новичок
что здесь осмысливать? для чего обрабатывать переменные? я понимаю для чего!
 

Фанат

oncle terrible
Команда форума
нет, не понимаешь.
иначе вопроса, обрабатывать ли $_GET['id'] не возникло бы.
 

Desh

Новичок
я при register_globals = Off недавно начал писать, раньше никогда не сталкивался, потому и спрашиваю!
 

Фанат

oncle terrible
Команда форума
не надо оправдываться.
ты не понимаешь, зачем нужна твоя проверка. надо задуматься над этим.

-~{}~ 26.09.08 17:55:

скажи, какие именно опасные символы убирает твоя функция, и какую именно опасность каждый из них представляет?
 

Desh

Новичок
проверка нужна чтобы убрать из переменной опасные символы, которые может ввести пользователь. разве нет?
 

Фанат

oncle terrible
Команда форума
а в переменных типа $_GET['id'] никаких опасных символов нет?
 

Desh

Новичок
хз, может php сам их обрабатывает...

-~{}~ 26.09.08 18:04:

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

Фанат

oncle terrible
Команда форума
PHP не знает, какие символы ты считаешь опасными.
ты сам, впрочем, как я понимаю - тоже.
 

Beavis

Banned
Desh
определись сначала какую опасность может представлять конкретная необработанная переменная

почитай про SQL Injection, XSS
 

Фанат

oncle terrible
Команда форума
На эту тему буквально только что очень хорошо написал Селенит. Но в нехорошем месте.
Поэтому ссылку я давать не буду, но скопирую, без его разрешения.
По-моему, получилось очень доходчиво:

Символы не могут представлять опасность.

Опасность может представлять несоблюдение правил чего-либо. Если носить деньги в открытой сумке, их могут украсть, если не мыть руки перед едой, может быть понос, если заниматься незащищенным сексом с кем попало, можно подцепить вензаразу. Это все опасности, но разные, и меры защиты от каждой должны применяться к месту (о чем говорил выше bars80080). Наивно думать, будто от всех этих напастей поможет заворачивание денег в чисто вымытый с мылом презерватив (или "волшебная фильтрация" от любых порчи и сглаза "опасных символов" на входе;)

База данных может хранит любые символы - опасных символов для нее не существует. А вот опасные запросы существуют - например, вместо "SELECT passw FROM users WHERE id=715" некто пропихнет запрос "SELECT passw FROM users WHERE id=751 OR 1" и получит полный список паролей. Тупо "фильтровать" ввод тут бесполезно - например, если тут просто вырезать OR, то гад может всунуть "...WHERE id=715 OORR 1" и после фильтрации получится как раз то, что ему надо. Нужно не "символы фильтровать", а обеспечить, чтобы независимо от входящих данных запрос получился такого вида, как надо нам. Фактически для этого достаточно соблюдать два простых правила, о которых хорошо написано здесь.

Точно так же HTML может выводить на экран абсолютно любые символы - просто нужно помнить, что < и > в нем ограничивают теги, поэтому чтобы вывести их как символы - нужен htmlspecialchars. А значения атрибутов должны обязательно быть в кавычках, иначе первый же пробел станет началом нового атрибута. И опять же, как и с запросами - нужно четко представлять, HTML какого вида надо построить в результате вывода: что вывести как теги, что - как текст, а что лучше вообще убрать. Тогда и никакой XSS не страшен. И лучше делать это не при вводе данных, а именно при выводе - иначе "раскодировать" исходную информацию, если она вдруг понадобится (скажем, для RSS-фида или WAP-версии сайта) будет ох как проблематично.

Ну а если мы явно видим, что нам шлют данные, совсем не похожие на то, что мы ожидаем для нашей задачи - такой запрос лучше просто послать лесом (редиректнуть на главную страницу, выдать 500-ю ошибку или навсегда забанить по IP - по вкусу, в зависимости от суровости автора сайта;). Но именно отбросить весь "неправильный" запрос. А не заниматься самолечением попытками наобум "оживить" его с помощью какой-то наивной "фильтрации"...
 

iceman

говнокодер
register_globals = On => из $_GET['id'] делает $id вот тока в чем и разница!

-~{}~ 27.09.08 14:04:

еще бы вы ему 10000 постов залечили бы про фильтрацию ваще кул было бы....
 
Сверху