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

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

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

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

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

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

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

Эта функция:

 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() в вашем комбо.

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

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