PHP filter_var для URL против атак XSS - PullRequest
2 голосов
/ 15 июля 2010

Вот моя функция:

function is_url($url) {
    return (preg_match('#^(https?):\/\/#i', $url) && (filter_var($url, FILTER_VALIDATE_URL) !== FALSE));
}

И вот хороший URL, который он подтверждает как истинное:

http://blah.com"onclick="alert(document.cookie)

Представьте, если это входит в <a href="<?php echo $url; ?>">

Существуют ли лучшие валидаторы URL с регулярным выражением?Или URL-адрес, который я тестирую, на самом деле является действительным URL-адресом (в этом случае мне потребуется функция очистки XSS)?

1 Ответ

2 голосов
/ 15 июля 2010

Это встроенный фильтр :

filter_var($url, FILTER_VALIDATE_URL);

Это вернет false с вашим примером URL. Если бы это было действительно, это возвратило бы $url. Пример:

glopes@nebm:~$ php -r "var_dump(filter_var('http://blah.com\"onclick=\"alert(document.cookie)', FILTER_VALIDATE_URL));"
bool(false)

В любом случае, решение для предотвращения XSS заключается в использовании htmlspecialchars. Поскольку это атрибут, вы должны использовать ENT_QUOTES:

htmlspecialchars($data, ENT_QUOTES);

Но вы также должны проверить URL-адрес, поскольку в противном случае пользователь может включить javascript: -подобные «URL-адреса».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...