Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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_Xss_Facebook Opengraph - Fatal编程技术网

跨站点脚本PHP获取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)中时,就会出现问题(因为人们可以在那里插入代码) 并

我的一个站点上存在跨站点脚本(XSS)问题。现在,我使用以下代码获取每个页面的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