跨站点脚本PHP获取URL问题
我的一个站点上存在跨站点脚本(XSS)问题。现在,我使用以下代码获取每个页面的URL:跨站点脚本PHP获取URL问题,php,xss,facebook-opengraph,Php,Xss,Facebook Opengraph,我的一个站点上存在跨站点脚本(XSS)问题。现在,我使用以下代码获取每个页面的URL: $pageurl = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $pageurlencode = "http%3A%2F%2F".urlencode($pageurl); $pageurl = "http://".$pageurl; 但是,当我将$pageurl放入我的开放图url(og:url)中时,就会出现问题(因为人们可以在那里插入代码) 并
$pageurl = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$pageurlencode = "http%3A%2F%2F".urlencode($pageurl);
$pageurl = "http://".$pageurl;
但是,当我将$pageurl放入我的开放图url(og:url)中时,就会出现问题(因为人们可以在那里插入代码)
并在输出时始终使用htmlspecialchars()将动态值(用户输入)转换为HTML源值 并在HTML源值的动态值(用户输入)的输出上始终使用htmlspecialchars() 你最后的评论是正确的
查询字符串——就这一点而言,任何特殊字符都是经过编码的。唯一可能的注射方法是1)如果<>“
等都是或甚至是。请注意,这两个集合都排除了任何HTML字符。您唯一需要担心注入的时候是在PHP中使用$\u GET
或$\u POST
变量并直接输出它们——因为这些变量被解码为纯文本。然后,您可以使用htmlentities
对它们进行适当的清理
由于您直接访问的是一个有效的URL字符串(通过$\u SERVER['REQUEST\u URI']
),因此您永远不会得到一个无效的(符合规范的)URL
浏览器应该在发送到服务器之前自动处理此编码,如果没有,服务器应该防止任何格式错误的URL。无论哪种方式,您的脚本都不需要担心如何处理它
编辑
在Mac/Linux上,文件名中似乎可以包含
等字符,但是服务器永远不会正确加载这些字符,因为它们不遵循URL准则
编辑2
我刚刚在Node.JS服务器上测试了它,它似乎确实能够提供具有特殊字符的文件。为了安全起见,请始终按照本页上的建议使用htmlentities
或htmlspecialchars
进行编码,然而,我永远无法想象有人拥有一个带有特殊HTML字符的文件名——这基本上是XSSing——但要注意这是件好事
编辑3
好奇心压倒了我,我部署了一个名为“的文件,你的最后一条评论是正确的
查询字符串和任何特殊字符都是经过编码的。进行这种注入的唯一可能方法是1)如果>“
等是或2)偶数。请注意,这两个集合都排除了任何HTML字符。您唯一需要担心注入的时候是在PHP中使用$\u GET
或$\u POST
变量并直接输出它们——因为这些变量被解码为纯文本。然后,您可以使用htmlentities
对它们进行适当的清理
由于您直接访问的是一个有效的URL字符串(通过$\u SERVER['REQUEST\u URI']
),因此您永远不会得到一个无效的(符合规范的)URL
浏览器应该在发送到服务器之前自动处理此编码,如果没有,服务器应该防止任何格式错误的URL。无论哪种方式,您的脚本都不需要担心如何处理它
编辑
在Mac/Linux上,文件名中似乎可以包含
等字符,但是服务器永远不会正确加载这些字符,因为它们不遵循URL准则
编辑2
我刚刚在Node.JS服务器上测试了它,它似乎确实能够提供具有特殊字符的文件。为了安全起见,请始终按照本页上的建议使用htmlentities
或htmlspecialchars
进行编码,然而,我永远无法想象有人拥有一个带有特殊HTML字符的文件名——这基本上是XSSing——但要注意这是件好事
编辑3
好奇心压倒了我,我部署了一个名为“你正在经历什么样的注射?通过$\u服务器
变量传递的任何内容都应该已被清除。有人使用URL在我的网站上运行了一个测试。他们说,当他们进入浏览器,然后检查代码显示og:url作为example.com/?“>虽然很奇怪。。。当我输入相同的url时,我检查代码并查看。。。这是安全的。你能告诉我怎么向他解释没有问题吗?为什么他可能会以不同的方式看待代码?你经历了什么样的注入?通过$\u服务器
变量传递的任何内容都应该已被清除。有人使用URL在我的网站上运行了一个测试。他们说,当他们进入浏览器,然后检查代码显示og:url作为example.com/?“>虽然很奇怪。。。当我输入相同的url时,我检查代码并查看。。。这是安全的。你能告诉我怎么向他解释没有问题吗?为什么他可能会以不同的方式看待代码呢?所以,只需在上面代码的末尾添加一行,然后说$pageurl=htmlspecialchars($pageurl);这是正确的吗?这样:或者您在上面描述了它,但是请记住,如果您在其他地方使用变量的值,而不是HTML输出,则会更改变量的值。htmlspecialchars()仅用于connex交换到(!)HTML。htmlspecialchars()
远远不是一个一刀切的解决方案。您需要将其与公共逻辑配对,因为即使是经过消毒的用户输入也可能是恶意的,例如javascript:
URI模式和一系列不应包含用户输入的元素。因此,只需在上面的代码末尾添加一行,并说$pageurl=htmlspecialchars($pageurl);这是正确的吗?这样:或者您在上面描述了它,但是请记住,如果您在其他地方使用变量的值,而不是HTML输出,则会更改变量的值。htmlspecialchars()仅用于connex交换到(!)HTML。htmlspecialchars()
远远不是一个一刀切的解决方案。您需要将其与通用逻辑配对,因为即使是san
<meta property="og:url" content="<?php echo $pageurl; ?>" />
[DOCUMENT_URI] => /"<test.php
[REQUEST_URI] => /%22%3Ctest.php
[SCRIPT_NAME] => /"<test.php