如何在PHP中正确清理URL作为链接?
我有一个网站,用户可以在其中共享指向其主页的链接,如如何在PHP中正确清理URL作为链接?,php,url,escaping,Php,Url,Escaping,我有一个网站,用户可以在其中共享指向其主页的链接,如http://example.com/user。目前,我正在使用PHP函数filter\u var($\u POST['url',filter\u VALIDATE\u url)在使用prepared语句将url添加到数据库之前验证url 但是,我意识到PHP过滤器函数接受输入,例如http://example.com/alert('XSS')可用于跨站点脚本编写。为了解决这个问题,我在标记的URL上使用htmlspecialchars,在标记
http://example.com/user
。目前,我正在使用PHP函数filter\u var($\u POST['url',filter\u VALIDATE\u url)
在使用prepared语句将url添加到数据库之前验证url
但是,我意识到PHP过滤器函数接受输入,例如http://example.com/alert('XSS')代码>可用于跨站点脚本编写。为了解决这个问题,我在
标记的URL上使用htmlspecialchars
,在标记的href
属性上使用rawurlencode
但是rawurlencode
会导致URL中的/
转换为%2f
,这会使URL无法识别。我正在考虑为所有%2f
返回/
进行预替换。这是清理URL以显示为链接的方法吗?清理后,URL使用,XSS
相关脚本,只需使用
str_replace(“%2f',“/”,$result)
在代码之后,但在filter_var()
之前,它会将其更改回原始字符。因此,您的脚本可以继续运行。不允许带有标记的URL
用户向url插入标记意味着其可能是恶意的。
让“主页”包含标签是错误的。现在已经过时了:
我使用的是PHP函数filter\u var($\u POST['url'],
筛选(验证URL)以在将URL添加到数据库之前验证URL
使用预先准备好的语句
而不是筛选\u验证\u 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';
我想这可能对你有用。祝您一切顺利:)您考虑过strip_tags()吗?@RobertPodwika,谢谢您的建议。我会调查的。这只是问题的一部分。urlencode也会破坏其他字符。所以,使用urlencode的整个方法是错误的。