我有一个网站,用户可以在其中共享指向其主页的链接,例如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以显示为链接的方法吗?
答案 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)
不允许带标签的网址。
将标记插入网址的用户意味着它可能是恶意的。 让“主页”包含标签是错误的。