Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #30, МАЙ 2003 г.

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