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