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