我正在开发一个插件,它需要对内容输出进行即时操作。这完全取决于电流$_GET
变量或$_REQUEST
变量
根据变量的设置,它将调用某个类方法来处理用户的请求并显示适当的内容。
我完全了解Data Validation 然而,我不确定我的方案或任何消毒方案的最佳方法是什么$_GET
变量或$_REQUEST
这方面的变量。
如何使用WordPress函数清理$_GET
变量或$_REQUEST
将匹配以调用特定类方法的字符串的变量?
Could this be exploited or fail given the following code?:
public function display_admin_page(){
if(is_admin() && isset($_GET[\'page\'])){
global $content;
$page = sanitize_title($_GET[\'page\']);
$method_name = \'page_\'.str_replace(\'-\', \'_\', $page);
if(method_exists(\'content\', $method_name)){
// Display requested page from content class
$thePage = $content->$method_name();
} else{
$thePage = $content->error(404);
}
echo $thePage;
}
}
SO网友:SeventhSteel
针对您的具体示例:
您适当地清理了$\\u GET数据(我想我会使用sanitize_key
而不是sanitize_title
-- 说不上有什么不同,但是sanitize_title
用于URL)。
这个method_exists
对于私有和受保护的方法,函数将返回true,因此如果用户尝试调用私有或受保护的方法,它将失败,而不会转到404。(除非display_admin_page
方法在同一类中。)
这就带来了一个主要的潜在漏洞:任何人都可以强制运行类中的任何公共方法。如果可能的话,最好将可以接受的内容明确列入白名单。这样,您可以通过以下方式进行验证:
if ( !in_array( $_GET[\'page\'], array( \'accepted_method\', \'another_accepted_method\' ) ) )
$content->error(404);
SO网友:Ahmad Awais
消毒$_GET
非常特定于上下文。取决于您想要什么值以及如何验证它。
对于这个问题,没有一刀切的答案。这是非常具体的上下文。例如,您可以编写一个从输入中删除所有标记和斜杠的函数,这是非常安全的,但如果您希望保存一个p标记呢?没什么害处。wp\\u kses()系列是一项有趣的研究,但并不是一个很好的解决方案,因为它考虑了上下文、用户级别等因素。例如,作为管理员用户,您可以在帖子标题和帖子内容中保存JavaScript,但作为较低的角色,您不能。
如果其值是已知数量,您还可以检查in_array( $array_valid_strings )
而且要特别确定这些。
也就是说,有不同程度的消毒,所以记住你的最终目标很重要。我会参考此列表,找到适合您需要的功能或功能组合。这里应该使用的是sanitize\\uux函数,而不是esc\\ux函数。卫生处理和逃跑继续被混淆。。。
在我的情况下,我将使用sanitize_text_field() 因为它从用户输入或数据库中清理字符串。
检查无效的UTF-8,
转换单(&L);字符到实体删除所有标记删除换行符、制表符和额外空格删除八位字节