2

我有一个网站,用户可以在其中共享指向其主页的链接,例如http://example.com/user. 目前,我正在使用 PHP 函数filter_var($_POST['url'], FILTER_VALIDATE_URL)在使用准备好的语句将其添加到数据库之前验证 URL。

但是,我意识到 PHP 过滤器函数接受输入,例如http://example.com/<script>alert('XSS');</script>可用于跨站点脚本的输入。为了解决这个问题,我在标签htmlspecialchars内的 URL<a>和标签rawurlencodehref属性上使用。

但是rawurlencode会导致/URL 中的 被转换为%2f,从而使 URL 无法识别。我正在考虑做一个preg_replacefor all %2fback to /。这是清理 URL 以显示为链接的方法吗?

4

3 回答 3

3

这现在已经过时了:

我正在使用 PHP 函数 filter_var($_POST['url'], FILTER_VALIDATE_URL) 在使用准备好的语句将 URL 添加到数据库之前对其进行验证。

而不是FILTER_VALIDATE_URL

您可以使用以下技巧:

$url = "your URL"
$validation = "/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";
if((bool)preg_match($validation, $url) === false)
    echo 'Not a valid URL';

我认为它可能对你有用。一切顺利 :)

于 2013-05-09T13:11:40.587 回答
0

不允许带有标签的网址。

用户将标签插入 url 意味着它可能是恶意的。拥有包含标签的“主页”是错误的。

于 2013-05-09T12:39:59.107 回答
0

清理后,URL使用,XSS相关脚本,只需更改%2f字符使用

str_replace('%2f', '/', $result)在您的代码之后,但在您的代码之前filter_var(),它会将其更改回其原始字符。所以,你的脚本可以继续。

于 2013-05-09T12:38:26.140 回答