Функция PHP для предотвращения SQL-инъекций и XSS

Я пытаюсь сделать мой PHP максимально безопасным, и две основные вещи, которые я пытаюсь избежать, - это

  • Инъекции mySQL
  • Скрипты с поперечной стороны (XSS)

Это script, который я получил против mySQL Injections:

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? И, наконец, есть ли что-нибудь еще, что я мог бы добавить в эту функцию, чтобы предотвратить другие формы взлома?

Ответ 1

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

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

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

Ответ 2

Эта функция:

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

Не работает

SQL-инъекция и XSS - это два разных зверя. Поскольку каждый из них требует различного экранирования, вам нужно использовать каждую функцию escape 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() в вашей комбо.

Ответ 3

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

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