保护自定义窗体免受SQL注入

时间:2015-01-28 作者:testermaster

我正在尝试了解如何保护我的自定义表单免受可能的攻击。

我通过表单发送数据,比如userdata,然后我读取它:

$userdata = $_POST[\'userdata\']
我将其放入一个数组中以使用wpdb->更新:

$updatevalues = array( $userdata );
还有我的where数组:

$where_data = array( $mydata ); //mydata is declared elsewhere
我连接到数据库:

$mydb = new wpdb(\'root\', \'password\', \'database\', \'localhost\');
我更新了表格:

$uptable = $mydb ->update(\'table\',$updatevalues,$where_data);
这够了吗?还是我应该做点什么来保护自己?wpdb->更新是否足够?

谢谢

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

是的,$wpdb->更新是足够的保护。您不应逃避或准备数据。

documentation of wpdb:

data (array) 要更新的数据(列=>值对)。$数据列和$数据值都应为“原始”(都不应为SQL转义)。这意味着,如果使用GET或POST数据,可能需要使用stripslashes(),以避免斜杠在数据库中结束。

作为补充说明,您可以通过在更新调用中包含format和where\\u format来帮助wordpress更好地理解准备数据库的内容。

$uptable = $mydb->update(
    \'table\',
    $updatevalues,
    $where_data,
    $data_format, // \'%d\' for numbers, \'%s\' for strings, can be an array
    $where_format // Same here
);

Update: In reply to your comment:

这取决于您保存的数据及其用途。

SQL注入之后的下一步是防止XSS攻击。在这里,用户可以将恶意Javascript输入到您的文本字段中,数据库将其保存,然后您的站点碰巧将其显示给其他用户。

虽然在显示数据库中的内容时使用esc\\u html()可以防止这种情况,但最好不要将这些内容放在数据库中!

如果要保存名称或地址等简单字符串,请使用sanitize\\u text\\u field()wp_kpses()

  • 如果要保存需要在URL中使用的内容,请使用sanitize\\u title()Here\'s more info on them. (整篇文章都很好)To include your link, the page of all Data Validation types
  • 至于执行此操作的代码,它将如下所示:

    $user_value = stripslashes($_POST[\'user_value\']);
    $user_value = sanitize_text_field($user_value);
    $user_data = array(\'table_column\' => $user_value);
    $user_format = array(\'%s\'); // Means $user_value is a string
    $where_data = array(\'id\' => 5); // example
    $where_format = array(\'%d\'); // Means \'id\' is a number
    $mydb->update(
        \'table\',
        $user_data,
        $where_data,
        $user_format,
        $where_format
    );
    
    如果您只希望数据是字母数字,那么可以在stripslashes之后用if(ctype\\u alnum($user\\u value))包装代码。最终,您只需要所需的确切数据,仅此而已。

    希望有帮助!

    结束

    相关推荐

    WP SQL查询多个WHERE子句

    我正在尝试获取在特定时间后注册的用户(本例为$today),并且他们的新闻稿字段为true,帐户为false。这是我到目前为止得到的结果,但结果总是0。$new_users_newsletter = $wpdb->get_results( \"SELECT * FROM $wpdb->users RIGHT JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->user