如何使用WordPress函数正确验证来自$_GET或$_REQUEST的数据?

时间:2012-09-12 作者:Michael Ecklund

我正在开发一个插件,它需要对内容输出进行即时操作。这完全取决于电流$_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;
    }
}

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

WordPress没有为SUPERGLOBALS提供任何特定的数据验证功能filter_input 函数然后将其转义为任何不受信任的变量

$url = filter_input( INPUT_GET, \'some_query_string\', FILTER_VALIDATE_URL );

echo \'<a href="\'. esc_url( $url ). \'">Click Me</a>\';
PHP过滤器输入接受:

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网友:Ciprian

我建议使用mysql_real_escape_string($_GET) 任何GET请求。这是一个非常强大的PHP功能。

然后您可以使用str_replace() 替换任何不需要的字符。

SO网友:Ahmad Awais

消毒$_GET 非常特定于上下文。取决于您想要什么值以及如何验证它。

对于这个问题,没有一刀切的答案。这是非常具体的上下文。例如,您可以编写一个从输入中删除所有标记和斜杠的函数,这是非常安全的,但如果您希望保存一个p标记呢?没什么害处。wp\\u kses()系列是一项有趣的研究,但并不是一个很好的解决方案,因为它考虑了上下文、用户级别等因素。例如,作为管理员用户,您可以在帖子标题和帖子内容中保存JavaScript,但作为较低的角色,您不能。

如果其值是已知数量,您还可以检查in_array( $array_valid_strings ) 而且要特别确定这些。

也就是说,有不同程度的消毒,所以记住你的最终目标很重要。我会参考此列表,找到适合您需要的功能或功能组合。这里应该使用的是sanitize\\uux函数,而不是esc\\ux函数。卫生处理和逃跑继续被混淆。。。

在我的情况下,我将使用sanitize_text_field() 因为它从用户输入或数据库中清理字符串。

检查无效的UTF-8,

  • 转换单(&L);字符到实体
  • 删除所有标记
  • 删除换行符、制表符和额外空格
  • 删除八位字节
    • 祝您好运:)。

      P、 这个答案引用了三种不同的开发人员的观点(Josh、Michal、Kevin)。

    结束

    相关推荐

    Security and .htaccess

    大约一个月前,我在一个与爱好相关的托管服务器上创建了一个WordPress博客。所以,我目前还不熟悉这一点。由于我担心安全性,我做的一件事就是安装插件WP安全扫描。根据插件结果,我的网站会被检查出来,但我在结果中看到的是一个红旗:文件。wp admin中不存在htaccess/(我在那里ssh了,它不存在)好的,所以我在这个问题上做了大量的搜索,找到了太多的信息。htaccess。我在WordPress上经历了强化WordPress。org网站等,也遇到了这篇文章:http://digwp.com/201