Правила защиты от атак на php (SQL инъекции и XSS атаки)

Правила защиты от SQL инъекций и XSS атак.

Для защиты от sql инъекций необходимо соблюдать следующие правила:
1) для целых и дробных величин, перед их использованием в запросе достаточно привести величину к нужному типу.
$id=(int)$id; $total=(float)$total;
или
$id = intval($id); $total = floatval($total);


2) для строковых параметров, которые не используются в like, regexp и тд, экранируем кавычки.
$str=mysql_real_escape_string($str);
(В целях безопасности рекомендуется использовать функцию mysql_real_escape_string() вместо addslashes() и mysql_escape_string(). Функция учитывает кодировку текущего соединения с базой данных, поэтому ей необходимо передавать указатель соединения.)

3) в строках, которые предполагается использовать внутри like, regexp и тд, необходимо так же заэкранировать специальные символы, применяющиеся в этих операторах, если это необходимо. В противном случае, можно задокументировать использование этих символов.

ВАЖНОЕ ЗАМЕЧАНИЕ:
Нужно четко разделить понятия, что мы будем делать: выдавать клиенту в браузер или сохранять в БД. Это две разные задачи. В БД не имеет значения, что в строке есть какие-нибудь теги, потому что они не обрабатываются никакими браузерами и т.п. эти теги просто лежат в БД. А если вы выдаете текст пользователю, то браузеру не имеет значения, какие SQL-инъекции вы выдаете в браузер – потому что имеют значения только XSS.

Поэтому нужно взять за правило всегда работать с реальной строкой. Если надо выдавать в браузер, то обработайте данные htmlspecialchars() и отдайте в браузер, при этом вы продолжаете работать с реальной строкой. Если нужно положить в БД, то обработайте полученные даннные mysql_real_escape_string() и сохраните в БД, при этом продолжайте работать с реальной строкой.

magic_quote – лучше всегда выключать.

PS:
Иногда имеет смысл включить логирование попыток взлома, например так:

if((string)$id<>(string)(int)$id) {
//в лог о попытке взлома
die('ops');
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *