在php中,可以使用parse_url和http_build_url检测格式错误的url并防止xss攻击吗?有更好的吗?

在php中,可以使用parse_url和http_build_url检测格式错误的url并防止xss攻击吗?有更好的吗?,php,url,xss,Php,Url,Xss,我想允许我的网站的用户发布URL。然后,这些URL将在站点上的标签的href属性中呈现。基本上,用户A发布一个url,我的站点将其作为标签显示在页面上,然后用户B单击它以查看小猫的图片 我想防止javascript执行和xss攻击,并确保生成的输出中没有格式错误的URL 示例:用户A发布了一个格式错误的url,可能是小猫的图片。我的站点尝试从用户A的数据生成一个标记,然后用户B单击生成的链接。用户A实际上发布了一个格式错误的url,该url在中添加了一个javascript“onclick”事件

我想允许我的网站的用户发布URL。然后,这些URL将在站点上的标签的href属性中呈现。基本上,用户A发布一个url,我的站点将其作为标签显示在页面上,然后用户B单击它以查看小猫的图片

我想防止javascript执行和xss攻击,并确保生成的输出中没有格式错误的URL

示例:用户A发布了一个格式错误的url,可能是小猫的图片。我的站点尝试从用户A的数据生成一个标记,然后用户B单击生成的链接。用户A实际上发布了一个格式错误的url,该url在中添加了一个javascript“onclick”事件,以将受害者的cookie发送到另一个站点

因此,我只希望允许格式正确的URL,并阻止http/https协议以外的任何内容。因为我不允许任何看起来不像url的东西,而且用户也不向我提供html,所以通过解析和重新构造url来检查应该非常简单

我的想法是,解析url应该会失败,并在错误的url上出现错误,或者用“\uURL”替换非法字符。我还可以检查url的各个部分是否有允许的协议。然后,通过使用http_build_url构建一个url,我将通过parse_url分隔的部分重新组合成一个已知格式正确的url。因此,通过这种方式首先分解它们,我可以在失败时给用户一条错误消息,而不是在我的页面中放置一个经过清理的被破坏的url

问题是,如果用户单击链接,这是否可以防止xss攻击作恶?解析和重建的url是否需要进一步转义?有更好的方法吗?到目前为止,标准php库中的函数不应该解决这个问题吗

我真的不想自己编写解析器,我甚至不考虑正则表达式。


谢谢

不,
parse_url
不是意思是作为url验证程序

您可以为此使用:

filter_var($someURL, FILTER_VALIDATE_URL);

您需要做的只是在构建html时正确地转义内容。这意味着当一个值中有一个
时,您可以使用
”构建html

防范XSS主要不是验证URL的有效性,而是正确转义。(尽管您可能希望确保它是
http:
https:
链接)


有关构建html字符串时要转义的内容(即:href属性)的更详细列表,请参见

,根据其他一些事项,您可以通过检查URL是否指向任何内容来验证URL。以下是一个示例:

图1

<?php

// URL to test
// $url = "";

$content = file_get_contents($url);

if(!empty($content)){

echo "Success:<br /><iframe src=\"$url\" style=\"height:400px; width:400px; margin:0px auto;\"></iframe>";

}else{

echo "Failed: Nothing exists at this url.";

}

?>

Curl是另一个选项。使用Curl,您只需返回http头,然后检查它返回的错误代码。例如,错误404=未找到页面,200=确定,201=已创建,202=已接受,等等

祝你好运

~z~约翰
因此,在PHP中,您可以使用如下内容:


在生产网站上执行此操作,您很可能会得到$url,因为用户输入会造成严重的安全威胁,所以不要这样做。