Как мне защитить от внедрения HTML в поле формы URL с помощью PHP? - PullRequest
0 голосов
/ 28 октября 2010

Например, если я собираю [URL-значение] в форме, сохраняю [URL-значение] в базе данных, а затем использую его на такой странице:

<a href="[URL value]" > The Link </a>

Как защитить от этого [значение URL]:

http://www.somelink.com"> Evil text or can be empty </a>  ALL THE EVIL HTML I WANT  <a href="

Как можно защитить от такого внедрения HTML-кода для полей формы URL, не нарушая URL-адрес в случае егоявляется действительным ?

Ответы [ 5 ]

6 голосов
/ 28 октября 2010

При получении URL-адреса в форме:

  • Используйте filter_var(url, FILTER_VALIDATE_URL), чтобы убедиться, что URL-адрес имеет правильный формат.
  • Убедитесь, что URL начинается с http:// или https:// (или, по крайней мере, отклоните все javascript: URL, поскольку они могут содержать злокачественный код)
  • Используйте подготовленные операторы при вставке URL (и других данных формы) в базу данных или правильно экранируйте эти данные, чтобы предотвратить инъекции SQL.


При отображении страницы:

  • Используйте htmlspecialchars(), чтобы экранировать URL (и весь другой текст), который вы вставляете в HTML.
1 голос
/ 28 октября 2010

Самый простой способ сделать это - проверить, что входные данные содержат что-то похожее на синтаксически действительный URL, без символов, таких как>, которые не разрешены в URL.Самый простой способ сделать это - использовать расширение фильтра .Код для этого будет выглядеть так:

if (filter_var($url, FILTER_VALIDATE_URL)) {
    //Valid URL submitted
} else {
    //Invalid URL submitted
}
0 голосов
/ 30 октября 2010

Для экранирования при отображении используйте htmlentities ($ var, ENT_QUOTES) или htmlspecialchars ($ var, ENT_QUOTES).Необходимо избегать как одинарных, так и двойных кавычек из-за специфичных для браузера нагрузок XSS.Проверьте здесь - http://ha.ckers.org/xss2.html

Кроме того, при проверке URL javascript: URI не единственный опасный.Другой - данные: URI.

В любом случае, всегда безопаснее исключить все, кроме белого списка, а затем включить все, кроме черного списка.

0 голосов
/ 28 октября 2010

РЕДАКТИРОВАТЬ: Просто используйте urlencode, а также не используйте htmlentities

Всякий раз, когда вы помещаете данные в пары ключ / значение URL, вы должны кодировать эти данные с помощью функции urlencode (). Эта функция позаботится о любых специальных символах, которые имеют синтаксическое значение в способе конструирования URL. Амперсанды, знаки равенства и знаки вопроса будут закодированы для вас. Все угловые скобки И символы новой строки в HTML-коде также будут закодированы!

<?php $TheVariable = $_REQUEST['suspect_var']; // Untrusted data ?>


<a href="http://www.mysite.com/script.php?untrusted_data=<?php echo urlencode($TheVariable) ?>">The Link</a>
0 голосов
/ 28 октября 2010

Используйте urlencode для кодирования только знака " при печати URL, например:

echo '<a href="'.str_replace('"', urlencode('"'), $url).'">link name</a>';
...