验证和清理数据的最佳实践

时间:2017-01-13 作者:Mike

我开发了一个插件,可以在用户输入到前端的多个表单后处理数据。表单中的字段类型和数据输入差异很大。

为了处理数据,我将init 并使用以下功能;

function mh_post_actions() {
    if ( isset( $_POST[\'mh_action\'] ) ) {   
        do_action( \'mh_\' . sanitize_text_field( $_POST[\'mh_action\'] ), $_POST );
    }
} // mh_post_actions
add_action( \'init\', \'mh_post_actions\' );
然后在连接到的结果函数中进行验证和消毒mh_*.

然而,最近我决定通过WordPress发布插件。组织回购。

经审查,我的代码被拒绝,声明根据指导原则,我需要在WordPress处理之前验证和清理数据。

这很好,但如前所述,数据可以是任何内容,数组、int、str、url、电子邮件等。。。

我想保留我的功能,因为它对我来说很好,所以想知道是否有更简单的方法来清理常规$\\u POST数据,我可以将其添加到上述功能中,以满足指导原则?

2 个回复
SO网友:Mark Kaplun

在基于输入做出任何执行流决策之前,需要对输入进行验证/清理。事实上,对于抓到它的评论者(或编写自动工具的人),我的分数是+100,因为我可能会错过它。

净化是需要背景的东西。仅仅因为函数A在存储显示文本输入的上下文中进行清理,并不适合在执行流上下文中使用。

在您的特定情况下,“敌对”可以通过在mh_action 领域在触发任何操作之前,需要验证的是,该值是您希望从表单中获得的值之一。

If (in_array($_POST[\'mh_action\'], array(\'string\',int\',\'array\'....)
  do_action(\'mn_\'.$_POST[\'mh_action\'],$_POST);
不确定这对审查小组来说是否足够,但这将是一个(更)安全的代码。

SO网友:gmazzap

我在代码中看到的第一个问题是,您假设$_POST[\'mh_action\'] 是字符串,来自$_POST 你永远不能确定那是真的。

如果这是一个数组,你不能sanitize_text_field( $_POST[\'mh_action\'] ) 不会触发错误。

第二个问题是do_action 不返回任何内容。这意味着你正在改变超全球化$_POST 直接,我强烈建议你避免。

其中一个原因是处理数据的代码需要访问$_POST 即使您使用操作进行了清理,只查看使用数据的代码,也不会不清楚。

此外,其他一些代码(可能是恶意的,也可能不是)可能总是remove_action( \'mh_foo\' ) 您的“foo”字段永远不会被转义,因此访问$_POST[\'mh_foo\'] 并对其进行处理,将处理潜在的不安全数据。

你应该做的是从$_POST, 提取感兴趣的数据,验证它们(预期的字符串是字符串…)之后,您可以将validate数据作为参数传递给processing函数,在这里您可以首先清理它,然后使用它,例如存储、显示。。。

只是概念证明:

function mh_post_action() {

    $action = isset($_POST[\'mh_action\']) ? $_POST[\'mh_action\'] : \'\';
    if ( ! $action ) {
       return;
    }

    $validated_action = mh_post_action_validate( $action );
    if ( ! $validated_action ) {
       // handle the error

       return;
    }

    mh_post_action_process( $validated_action );
}


function mh_post_action_validate( $action ) {
    // as example I\'m validating it is a string that starts with "mh_"
    if ( is_string( $action ) && strpos( $action, \'mh_\' ) === 0 ) {
       return $action;
    }

    return \'\';
}


function mh_post_action_process( $action ) {
    $sanitized_action = sanitize_text_field( $action );
    // process sanitized_action here
}


add_action( \'init\', \'mh_post_action\' );
现在如果我看mh_post_action 我可以清楚地看到数据来自$_POST 正在验证,我可以清楚地看到mh_post_action_process() 在对数据进行任何操作之前,请先对其进行清理。

我认为,您可以轻松地将现有函数转换为遵循这样的方案,并且您将提高代码的可读性(这对您有好处)、可理解性(这对wp.org审查团队有好处)和安全性(这对每个人都有好处)。

相关推荐

Frontend Post Form Validation

好的,这里有几篇关于前端投递表单的帖子。我把它们都读了,这让我明白了我的意思。现在,我遇到的每一个表单都有某种形式的验证,它似乎可以检查您想要设置为必需的字段的值。我试过了,但什么都没用。我只是无法设置任何必填字段。表单的其他方面都很完美。但我希望强制执行我的必填字段(适当错误消息的奖励)。我试着在google上四处看看,我真的不认为JS是我想要使用的。以及任何其他我似乎也无法进行的php验证。我敢肯定,我把它们都弄错了。以下是我所拥有的:http://pastebin.com/rw4c6jZQ (应验证