
В этой статье изложены простые советы по защите сайта от взлома с помощью обработки данных, поступающих от пользователя.
Эти приемы не дают 100% гарантию от взлома Вашего сайта, поэтому для защиты важной коммерческой информации этого будет недостаточно.
Для обеспечения безопасности веб-сайта от взлома необходимо выполнять фильтрацию вводимых данных. Фильтрация защищает от XSS-атак и SQL-инъекций.
Для этих целей в PHP есть специальные функций для работы со строками:
strip_tags() - вырезает теги HTML и PHP из строки.
htmlspecialchars() — конвертирует только специальные символы (’&’, ‘”‘, ”’, ‘<’ и ‘>’) в HTML сущности (’&’, ‘"’…). Используется для фильтрации вводимых пользователем данных для защиты от XSS-атак.
htmlentities() - конвертирует все символы в строке (кроме букв) в мнемоники HTML. Используется для защиты от XSS, являясь более гибким аналогом htmlspecialchars.
stripslashes() - удаляет заэкранированные символы (после преобразования в сущности предыдущими функциями их незачем экранировать). Обычно используется в связке с проверочной функцией
get_magic_quotes_gpc(), показывающей текущую установку конфигурации magic_quotes_gpc. Эта конфигурация влияет на то, как будут обрабатываться специальные символы, содержащиеся в данных, передаваемых пользователем (массивы $_GET, $_POST, $_COOKIE). При magic_quotes_gpc = 1 эти спецсимволы (одиночные и двойные кавычки, обратный слэш, байт NULL) автоматически экранируются. При magic_quotes_gpc = 0 все данные передаются в таком виде, в каком их ввел пользователь. В последнем случае в целях безопасности требуется обрабатывать передаваемые данные.
mysql_real_escape_string - мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов в кодировке соединения. Иными словами, функция превращает любую строку в правильную и безопасную для MySQL-запроса. Используется для очистки всех данных, передающихся в MySQL-запрос для защиты от SQL-инъекций (Подключение к базе должно быть активным!).
Пример:
<?php
function safevar($var, $sql=false) {
$var= htmlentities($var, ENT_QUOTES, `UTF-8`);
// мнемонизировали строку.
if(get_magic_quotes_gpc ())
{
$var= stripslashes ($var);
// убрали лишнее экранирование.
}
if ($sql)
{
$var= mysql_real_escape_string ($var);
// если нужен MySQL-запрос, то делаем соответствующую очистку.
}
$var= strip_tags($var);
//убираем теги.
return $var;
}
$var1 = "`><a href=`#test`> _</a>Тест¶";
$var2 = "``;!--"<XSS>=&{()}";
echo safevar($var1);
$link = mysql_connect("localhost", "root", "") or die("Could not connect");
echo safevar($var2, true);
?>