Статьи, пособия, примеры начинающим вебмастерам.

Горячий поиск: PHP CSS SEO
Главная » ГлавнаяPHP/MySQL Учимся писать безопасно

Учимся писать безопасно

На нескольких форумах мне довелось увидеть жалобы - мол "хостер сволочь поставил register_globals=Off и мой скрипт теперь не работает, что делать?". Давайте попробуем разобраться, зачем отключают глобальные переменные а заодно обсудим некоторые моменты уязвимости и защиты веб-приложений.

register_globals=...
Для начала определимся с понятием "внешние переменные".
Любые переменные, которые передает пользователь (например когда вводит свой e-mail или пароль) являются внешними. Передают и принимают их методом GET (прямо в адресной строке) или POST через html-формы.
Например, в строке браузера пользователь набирает http://www.your_site.com/index.php?data=1 - в результате чего в файле index.php создается переменная $data со значением 1. В принципе ничего страшного, если эта переменная больше нигде не будет использоваться... а если будет?
А ведь достаточно перед использованием переменной просто обьявить ее для любого используемоего метода:
$data=$_GET['data'];
$data=$_POST['data'];
чтобы навсегда забыть о жалобах на злобных хостеров, отключающих register_globals :)
Проверка переменных.
Для начала стоит проверить переменную на ее существование:
if ($data!=""){ 
//работаем дальше
}
else{
//можно вывести сообщение об ошибке, а можно накидать хакеру баннеров и поп-апов :)
}
Но только обьявить переменную и проверить ее наличие недостаточно. Очень часто уязвимости в различных cms или форумах находят там, где отсутствует проверка на корректность переменной.
Например, если вышеназванная переменная $data обозночает какое-то число - допустим, цену товара или номер телефона, а нерадивый посетитель в поле ввода ввел несколько букв то вполне естественно что скрипт выполнится с ошибкой.
Чтобы этого избежать можно воспользоваться таким регулярным выражением:
if (preg_match('/^-?\d+[\.|\,]?\d+$/', $data)) $data = ""; 
А если переменная должна содержать и цифры, и буквы и некоторые другие символы (например логин пользователя), регулярное выражение можно изменить:
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/", $data)) $data = ""; 
Нелишней предосторожностью будет использование функции htmlspecialchars(), заменяющей спецсимволы html на их значения:
$data=htmlspecialchars ($data); 
Также потенциально опасна переменная, которая имеет значение, совпадающее со служебными командами MySQL - например select или delete.
чтобы их отсечь можно воспользоваться функцией str_replace:
$data=str_replace ("query","",$data);
$data=str_replace ("select","",$data);
$data=str_replace ("from","",$data);
$data=str_replace ("delete","",$data);
$data=str_replace ("insert","",$data);
$data=str_replace ("update","",$data);
$data=str_replace (";","",$data);
$data=str_replace ("'","",$data);
$data=str_replace ("","",$data);
$data=str_replace ("@","",$data);
$data=str_replace ("$","",$data);
$data=str_replace ("^","",$data);
В примере я также запретил использование символов, которые пропускает htmlspecialchars, но которые тоже являются потенциально опасными.
А вообще str_replace можно использовать во многих случаях - запретить имя пользователя, совпадающее с именем сайта, отфильтровать маты, преобразовать символьные значения в смайлики и т.д.
Проверка длины переменной.
Если в ячейке таблицы MySQL указана определенная длина, а пользователь заведомо или по ошибке своей введет значение, ее превышающее - будет не совсем хорошо :)
ограничить количество символов можно в самой форме:
<input type="Text" name="data" maxlength="20">
но гораздо лучше это сделать на сервере:
$data = substr($HTTP_POST_VARS['data'], 0, 20);
Надеюсь приведенные примеры помогут вам писать более "правильные" с точки зрения безопасности скрипты, а общее правило можно описать одной фразой - никогда не доверяем пользователю, перед использованием полученных данных проверяем все что возможно и невозможно.
Категория: PHP/MySQL
Опубликовано: 12 апреля 2008, Обновлено: 19.01.2013 - 20:56 просмотров: 1577
 (Голосов: 3)

Комментирование данной новости запрещено.
Чужих не бывает

Валидация

Правильний CSS!

Valid XHTML 1.0 Transitional

Статистика

Генерация страницы: 0.34 секунд, SQL-запросов: 10.

Copyright

© 2008-2013 webamator.ru

Условия заимствования материалов.