Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中正确清理URL作为链接?_Php_Url_Escaping - Fatal编程技术网

如何在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的整个方法是错误的。