URL-адрес будет
достаточно ли strip_tags () и mysql_real_escape_string ()?
«Достаточная санитарная обработка» полностью зависит от того, о какой среде вы говорите. Санитария для MySQL должна рассматриваться полностью отдельно от саниции для веб-выхода, и вы должны обращаться с ними отдельно, чтобы избежать много хлопот.
Санитация для MySQL
mysql_real_escape_string()
будет дезинфицировать кусок данных и сделать его безопасным для размещения внутри SQL-запроса. Обеззараживание на выходе
htmlspecialchars($val)
на выходе будет препятствовать визуализации любых вредоносных тегов, потому что символы <
и >
преобразуются в их представления сущностей и не отображаются как разделители тегов. ENT_QUOTES
, если вы ENT_QUOTES
что-то, что находится внутри атрибута ENT_QUOTES
элемента HTML, например <input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />
Это должно быть все, что вам нужно, если у вас нет особых требований. strip_tags()
не следует использовать для дезинфекции, так как его можно обмануть с плохо сформированным HTML. Санитация – это достойная цель, и если вы можете разделить свои контексты, у вас будет меньше проблем с манипуляциями данными между ними.
Скорее всего, безопаснее и лучше называть htmlentities () для строки вместо того, чтобы рассчитывать на strip_tags ().
strip_tags () не удаляет html специальные символы, такие как '"&
например, если ваш код:
<img src="<?= strip_tags($myVar) ?>">
а также
$myVar = '">something goes here<';
то вы получите:
<img src="">something goes here<">
Очевидно, что это корень отверстия XSS; фактический эксплойт оставлен в качестве упражнения для читателя.
Я сначала поддержал ответ Фрэнка, но подумал о проблеме: htmlentities () нарушит юридические URL-адреса:
http://www.mywebsite.com/profile?id=jojo&w=60&h=60
Возможно, хватит угловых скобок + mysql_real_escape?