|

PHP-BugZ
ManderX
Спецвыпуск Xakep, номер #030, стр. 030-020-2
Вот кстати посмотри рубрику Типс нашего сайта, там был хороший пример, как в поля e-mail и homepage можно было написать кое-что интересное=). Догадайся какие символы надо фильтровать?=)
Если же ты любитель регулярных выражение, то держи парочку примеров (а лучше сам разберись, тогда и научишься вырезать из строки то, что тебе надо, это не главная тема статьи).
Запретим пользователю использовать в своем нике любые символы, кроме букв русского и латинского алфавита, знака "_" (подчерк), пробела и цифр:
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)]/",$username)) {
echo "Я те хакну!";
exit;
}
Для поля ввода адреса e-mail добавим в список разрешенных символов знаки "@" и ".", но уберем русские буквы и пробел:
if (preg_match("/[^(\w)|(\@)|(\.)]/",$mail)) {
echo "Я те хакну!";
exit;
}
2.2. Ограничить поля ввода имени, ника и т.д. Добавив параметр maxlength в html-тэг, вот пример:
<input type=text name=nick maxlength=10>
А если злобный хацкер решил сохранить твою форму у себя на винте, и уже на винте убрать maxlength=10, то поставь в начала страницы проверку на REFERER:
<?
$referer=getenv("HTTP_REFERER");
if (!ereg("^http://www.страница_с_которой_нужно_было_зайти_сюды.com")) {
echo "Я те хакну!"; # или можешь написать - “Header("Location: index.php");” – эта строка отсылает юзера на главную пагу.
exit;
}
?>
Теперь если он попытается послать данные с паги, находящийся на своем винте, то мы его красиво посылаем. Вообще такие проверки рисую на каждой страницы, пусть маленькая, но защита.
80% хацкеров остановятся, но другие-то знают, что и проверка на реферер не трабла, ибо сам реферер формируется браузером, т.е. на стороне клиента.
Поэтому, получи данные от пользователя, мы всетаки отрежем все, что стоит после 10-ого символ переменной:
$username=substr($nick,0,10);
Еще в некоторых готовых скриптах вижу такое, что например в index.php пишут:
$PHP_SELF = "main.php";
Далее инклюдят, к примеру, engine.php и в engine.php идет проверка на $PHP_SELF:
if (eregi("engine.php",$PHP_SELF)) {
Header("Location: index.php");
die();
}
Т.е. мы в index.php устанавливаем $PHP_SELF, как main.php, и наш скрипт engine.php должен быть обязательно проинклюден. Если же пользователь наберет в URL engine.php то его пошлю на index.php, так как $PHP_SELF (это переменная окружения) равняется engine.php, а если этот скрипт будет проинклюден в главном файле, то никто никого не пошлет, т.к. $PHP_SELF будет равна main.php=).
3. Данные так же могут быть использованы в других сферах, например в SQL-запросе, но для всего это есть общее правило: фильтровать символ конца строки.
Для фильтрации данных, которые будут участвовать в SQL-запросе можешь воспользоваться функцией mysql_escape_string. Почитай статьи по SQL-Injection для большего ознакомления, их сейчас очень много!
Примечание: когда тип входящего параметра известен, то можно проверить еще и на тип переменной.
Назад на стр. 030-020-1 Содержание Вперед на стр. 030-020-3
|