如何正确清理URL作为PHP中的链接?

时间:2013-05-09 12:35:19

标签: php url escaping

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

但是,我意识到PHP过滤器函数接受可用于跨站点脚本的http://example.com/<script>alert('XSS');</script>等输入。为了解决这个问题,我在htmlspecialchars代码中的网址上使用<a>,在代码的rawurlencode属性上使用href

但是rawurlencode会导致网址中的/转换为%2f,这会使网址无法识别。我想为所有preg_replace%2f/。这是清理URL以显示为链接的方法吗?

3 个答案:

答案 0 :(得分:3)

现在已经过时了:

  

我正在使用PHP函数filter_var($ _ POST ['url'],   FILTER_VALIDATE_URL)在将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';

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

答案 1 :(得分:0)

清理后,网址使用,XSS相关脚本,只需使用

更改%2f个字符

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

答案 2 :(得分:0)

不允许带标签的网址。

将标记插入网址的用户意味着它可能是恶意的。 让“主页”包含标签是错误的。