清理Get_Query_var()URL参数

时间:2019-10-26 作者:user2924127

我目前正在一个网站上工作,并测试其安全性。其中一个页面具有排序功能,我在其中传递一个url参数,说明我希望如何对内容进行排序。

例如:

www.example.com/page/?sort=alpha
这很好,但我也尝试发送恶意代码:

www.example.com/page/?sort=alpha%3Cimg+src=xyz+onerror=alert(99)%3E%3Cxss/%3E
在internet explorer中,当我输入此url时,我的页面会显示出来,并弹出一个javascript警报,因此我能够在页面上执行一些代码。在Chrome内部,我得到一条消息,XSS审核员已经阻止了这个执行,但我宁愿它从未尝试过运行。据我所见,我的header.php 文件位于Sort : <?= get_query_var(\'sort\') ?>.

我想清理这个输入,这样它就永远不会执行这样的脚本,我该怎么做?

1 个回复
最合适的回答,由SO网友:butlerblog 整理而成

你的问题标题和实际问题之间有点脱节。

听起来你在使用插件(或开发插件?)这允许进行一些前端排序。如果它是您正在使用的插件,并且查询字符串参数未被清理,则需要通知该插件的开发人员,因为这是一个安全问题。

自己修复可能会暂时解决问题,但你真的不应该直接编辑插件(即使是编码很差的插件),因为这会让你在插件更新时需要重新应用任何更改。

的名称get_query_var() 函数可能会令人困惑。很多人认为这是一种方便的WP替代品$_GET[], 但事实并非如此。get_query_var() 仅适用于作为全局WP查询一部分设置的变量。这包括许多WP默认值,以及任何自定义变量(添加set_query_var()).

为其端点应用自定义URL重写的插件可能就是一个例子。但是,如果您认为可以使用它从URL中获取任何查询变量,那就行不通了,因为这不是get_query_var()

您只需搜索此查询参数的收集位置。很可能是用$_GET[\'sort\'].

不管是什么,它应该是:

$some_var = sanitize_text_field( $_GET[\'sort\'] );
甚至更好:

$some_var = ( isset( $_GET[\'sort\'] ) ) ? sanitize_text_field( $_GET[\'sort\'] ) : \'some default value\';
显然,我的回答是基于一些假设,你的问题中没有包括这些假设的细节。如果我不正确,请更新您的问题以包含更多信息,我会相应地进行编辑。