正确的验证和SQL查询

时间:2019-05-03 作者:Jaron

此数据库操作方法是否安全正确?

 if(isset($_POST[\'name\'])){

    $table = $wpdb->prefix.\'_my_table\';

    $post = trim(sanitize_user($_POST[\'name\'], true));

    $part = $this->wpdb->prepare("WHERE name = %s", $post)

    $results = $this->wpdb->get_results("SELECT * FROM {$table} $part", ARRAY_A)

  }

2 个回复
最合适的回答,由SO网友:Stephan Samuel 整理而成

你所做的是安全的。

然而,一些注意事项:

参见WP_User_Queryin the Codex. 这是执行类似操作的“官方”方法,尽管您将得到一个整数索引数组WP_User 对象。而不是ARRAY_A 您指定的_my_table, 除非你的桌子被称为wp__my_table (注意后面的双下划线wp). 从返回的前缀$wpdb->prefix 包括许多安装在前缀后使用的下划线

  • trim() 之后致电sanitize_user() 是多余的。这不会造成任何伤害,但也是对计算周期的浪费$results = $wpdb->get_results($wpdb->prepare("select * from {$wpdb->prefix}my_table where name = %s", sanitize_user($_POST[\'name\'])), ARRAY_A); 这对你来说是好是坏
  • SO网友:MikeNGarrett

    很接近。有几件事很突出。

    首先,我假设您在共享代码之前就这样做了。在接受用户输入之前验证nonce很重要。了解更多信息Nonce in the Codex.

    接下来,您要使用sanitize_text_field 结合wp_unslash. Trim更像是一个助手函数,而不是用于消毒,但它在这里有助于确保预期的结果。

    最后,将整个SQL查询组合到$wpdb->prepare(). 回想起$wpdb->prefix 通常包括下划线。您的代码将生成wp__my_table, 例如(2个下划线)。

    Note: 我改变了$this->wpdb 向全球$wpdb. 这对你来说可能是不必要的,但我想确保其他得到这个答案的人有正确的背景。为了进行测试,我还将表名更改为posts,将表名更改为title。

    if ( isset( $_POST[\'name\'] ) ) {
        global $wpdb;
        $post_name = sanitize_text_field( wp_unslash( trim( $_POST[\'name\'] ) ) ) );
    
        $sql = $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}posts WHERE post_title = %s", $post_name );
    
        $results = $wpdb->get_results( $sql, ARRAY_A );
    }
    
    有关清理输入数据的WordPress编码标准的更多信息,请访问The WordPress Coding Standards.

    相关推荐

    JQuery在加载时立即执行(一次按钮点击和更改css)

    我正在按照另一个线程将jQuery转到我的管理设置页面:https://stackoverflow.com/questions/28248113/jquery-is-not-defined-in-wordpress-but-my-script-is-enqueued-properly我的设置页面生成功能:function buildSettingsPage() { require \'views/newCouponForm.php\'; // pure html wp_e