我想允许我网站的用户发布网址。然后,这些网址将在标记的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库中的函数不应该是一个已解决的问题吗?
我真的不想自己写一个解析器,我甚至不会考虑正则表达式。
谢谢!
答案 0 :(得分:0)
答案 1 :(得分:0)
您需要做的只是在构建HTML时正确转义内容。这意味着当值中包含"
时,您可以使用"
构建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 =已接受,等等
祝你好运!