Что такое «достаточная дезинфекция» для URL

URL-адрес будет

  1. Сохранено в базе данных MySQL
  2. Используется для отображения изображения в профиле пользователя

достаточно ли strip_tags () и mysql_real_escape_string ()?

«Достаточная санитарная обработка» полностью зависит от того, о какой среде вы говорите. Санитария для MySQL должна рассматриваться полностью отдельно от саниции для веб-выхода, и вы должны обращаться с ними отдельно, чтобы избежать много хлопот.

Санитация для MySQL

  • mysql_real_escape_string() будет дезинфицировать кусок данных и сделать его безопасным для размещения внутри SQL-запроса.
  • Любые другие вредоносные данные, такие как теги HTML внутри строки, должны быть абсолютно проигнорированы. Попытка манипулировать им здесь приведет к головным болям, когда вы попытаетесь «не манипулировать» им позже, после того как вытащить его из базы данных. Плохие «веб-данные» не могут повредить вашу базу данных.

Обеззараживание на выходе

  • 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?