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

时间:2010-11-05 03:53:58

标签: php url xss

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

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

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

所以我想只允许正确形成的URL,并阻止除http / https协议之外的任何内容。由于我不允许任何看起来像网址的内容,并且用户没有提供html,因此通过解析和重构网址来检查它应该非常简单。

我的想法是,parse_url应该在格式错误的网址上出现错误,或者用“_”替换非法字符。我也可以检查URL的分隔部分以获取允许的协议。然后通过使用http_build_url构建一个url,我将由parse_url分隔的部分放在一起,并将它们放回到一个已知正确形成的url中。因此,首先以这种方式将它们分解,我可以在用户失败时向用户提供错误消息,而不是在我的页面中放置已清理的已破坏的URL。

问题是,如果用户点击链接,这会阻止xss攻击做坏事吗?解析和重建的URL是否需要进一步转义?有一个更好的方法吗?现在使用标准php库中的函数不应该是一个已解决的问题吗?

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

谢谢!

4 个答案:

答案 0 :(得分:0)

不,parse_url 意味着是一个网址验证工具。

您可以使用filter_var

filter_var($someURL, FILTER_VALIDATE_URL);

答案 1 :(得分:0)

您需要做的只是在构建HTML时正确转义内容。这意味着当值中包含"时,您可以使用&quot构建html;

保护XSS并不主要是关于验证URL是否正确转义。 (尽管您可能希望确定它是http:https:链接)

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

答案 2 :(得分:0)

所以,在PHP中,你会使用类似的东西:

<?php

$userlink = "http://google.com";
$newlink = htmlentities($userlink);
$link = "<a href=\"$newlink\">$newlink</a>";

?>

答案 3 :(得分:-2)

根据其他一些事项,您可以通过检查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,您只需返回http标头,然后检查它返回的错误代码。即错误404 =未找到页面,200 =正常,201 =已创建,202 =已接受,等等

祝你好运!

〜约翰 http://iluvjohn.com/