Функция PHP для предотвращения SQL-инъекций и XSS - PullRequest
13 голосов
/ 28 июля 2011

Я стараюсь сделать свой PHP максимально безопасным, и я стараюсь избегать двух основных вещей:

  • MySQL Injection
  • Межсайтовый скриптинг (XSS)

Это скрипт, который я получил против MySQL Injection:

function make_safe($variable) {
$variable = mysql_real_escape_string(trim($variable)); 
return $variable;  }

http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


Против XSS я нашел это:

$username = strip_tags($_POST['username']);

Теперь я хочу объединить два в одну функцию. Будет ли это лучший способ сделать это? :

function make_safe($variable) {
$variable = strip_tags(mysql_real_escape_string(trim($variable)));
return $variable; }

Или mysql_real_escape_string уже предотвращает XSS? И, наконец, можно ли добавить что-либо еще в эту функцию, чтобы предотвратить другие формы взлома?

Ответы [ 3 ]

13 голосов
/ 28 июля 2011

Эта функция:

function make_safe($variable) 
{
   $variable = strip_tags(mysql_real_escape_string(trim($variable)));
   return $variable; 
}

Не будет работать

SQL-инъекция и XSS - два разных зверя. Поскольку каждый из них требует различного экранирования, вам нужно использовать каждую экранирующую функцию strip_tags и mysql_real_escape_string отдельно.
Присоединение к ним подорвет безопасность каждого.

Используйте стандарт mysql_real_escape_string() при вводе данных в базу данных.
Используйте strip_tags(), когда запрашиваете вещи из базы данных, прежде чем выводить их на экран.

Почему объединение двух функций опасно
Изо рта лошади: http://php.net/manual/en/function.strip-tags.php

Поскольку strip_tags () фактически не проверяет HTML, частичные или поврежденные теги могут привести к удалению большего количества текста / данных, чем ожидалось.

Таким образом, введя искаженный html в поле базы данных, умный злоумышленник может использовать вашу наивную реализацию, чтобы победить mysql_real_escape_string() в вашем комбо.

11 голосов
/ 28 июля 2011

mysql_real_escape_string () не мешает XSS.Это только сделает невозможным выполнение SQL-инъекций.

Для борьбы с XSS вам необходимо использовать htmlspecialchars () или strip_tags () .1-й преобразует специальные символы, такие как < в &lt;, которые будут отображаться как <, но не будут выполнены.Во-вторых, просто удалите все теги.

Я не рекомендую делать специальную функцию, чтобы сделать это, или даже делать одну функцию, чтобы сделать все это, но ваш пример будет работать.Я предполагаю.

2 голосов
/ 28 июля 2011

То, на что вы действительно должны обратить внимание, это использовать подготовленные операторы и PDO , чтобы обеспечить уровень абстракции для вашей базы данных, а также полностью устранить атаки с использованием SQL-инъекций.

Что касается XSS, просто убедитесь, что никогда не доверяете пользовательскому вводу. Либо запустите strip_tags или htmlentities , когда вы сохраняете данные, либо когда вы выводите их (не оба, так как это повлияет на ваш вывод), и все будет в порядке.

...