Как очистить строку, чтобы избежать SQL-инъекций и наиболее распространенных типов атак?(в PHP) - PullRequest
2 голосов
/ 25 июня 2011

Есть ли способ, как можно меньше кода, фильтровать строку как для внедрения SQL, так и для наиболее распространенных форм атаки?

В своих сценариях я использую следующее, я быхотелось бы знать, достаточно ли это безопасно и есть ли у кого-то еще предложение:

$cleanName    = htmlspecialchars(addslashes($dirtyName));

Посмотрите, как я отфильтровал его как для символов html, так и для кавычек и двойных кавычек.

ПРИМЕЧАНИЕ: IЯ использую addslashes() вместо mysql_real_escape_string(), потому что я не хочу жестко закодировать используемую в моем коде БД.

Это нормально?

Заранее спасибо

Ответы [ 4 ]

5 голосов
/ 25 июня 2011

Вероятно, нет ... вам нужно избегать вашего необработанного текста для каждой цели отдельно, для которой вы собираетесь его использовать:

  • Для запросов GET используйте urlencode.
  • Для вывода HTML используйте htmlentities.
  • Для вызова в качестве команды через system используйте escapeshellcmd.
  • Для передачи аргументов команде через system: используйте escapeshellargs.
  • Для передачи параметра базы данных: используйте mysql_real_escape_string.

Не существует «универсального» решения для магического экранирования текста. Храните необработанный текст внутри и избегайте его для соответствующей цели.

1 голос
/ 25 июня 2011

Если вы не возражаете перекодировать ваше соединение и пару дополнительных строк своего кода, вы не можете превзойти PDO для безопасности. Он использует бэкэнд C для подготовки и выполнения ваших запросов mysql. Таким образом, вместо конкатенации строк вы получаете предопределенные разделы в запросе, которые должны иметь значение XYZ. Один из парней из stackoverflow объяснил это так:

Представьте себе хот-дога. Вы подходите к стойке с хот-догами и говорите, что я хочу хот-дог с 3 начинками. Кетчуп, горчица, и мы дадим следующему случайному незнакомцу рассказать нам о третьем доле. Инженер sql может подойти и сказать: «кетчуп, горчица и« дай мне все деньги в ящике »». Стандартные запросы concat не могут определить, что это неверный ответ, и поэтому передают то, что было запрошено. Готовое заявление ответит: «У меня нет приправы,« дай мне все деньги в ящике ».

Подготовленные PDO заявления по существу являются инъекционными. У вас все еще есть другие уязвимости, такие как перехват файлов cookie / сессий и т. Д., Но по крайней мере инъекция не решена.

0 голосов
/ 28 февраля 2014

Если вы точно знаете, какой тип ввода вы ожидаете, лучше использовать preg_replace (). Если вы знаете, что ожидаете только буквенно-цифровых символов:

<?php
if (isset($_GET['page'])) {
 $page = preg_replace('/[^a-z0-9]/', '', $_GET['page']);
 include_once($includeDir.'/'.$page.'.php');
}
?>

Вышеприведенное должно предотвратить все атаки, выполняемые через GET илиPOST тоже, но предполагается, что вы ожидаете только буквенно-цифровой ввод.Ну, я в основном имел в виду атаку с обходом каталога, но если вы используете переменную GET для запроса к базе данных или отображаете ее как html-сущность, это должно предотвратить любую атаку.Запрос http://mydomain.tld? Index.php? Page = .. / .. / etc / passwd не будет считывать ваш файл passwd из корня документа вашего сайта / var / www, а будет пытаться только включитьфайл etcpasswd.php

0 голосов
/ 25 июня 2011

Не дождаться на параде Керрека, но есть одно, относительно, универсальное решение.Я использую следующее, и оно всегда работает:

$safe_value = mysql_real_escape_string( strip_tags( trim( $value ) ), $db_connection ); // This is if you aren't storing any html tags

$safe_value = mysql_real_escape_string( html_entities( trim( $value ) ), $db_connection ); // This is if you are storing html tags

Надеюсь, это поможет.

...