在$ POST中使用esc_attr或htmlspecialchars不提交给DB?

时间:2012-11-16 02:28:48

标签: php mysql escaping special-characters

我希望用户能够输入特殊字符并仍然可以提交给数据库。

我已经使用输入进行了测试: Dave& '“* ,但它不存储在数据库中。如果我不使用上面的特殊字符,只需使用 Dave ,它就可以存储得很好。

我尝试了两件事:

<p class="clearfix">
                        <label for="name">name</label>
                        <input class="validate[required]" id="name" name="name" type="text" value="'.esc_attr($_POST['name']).'">
                    </p>  

<p class="clearfix">
                        <label for="name">name</label>
                        <input class="validate[required]" id="name" name="name" type="text" value="'.htmlspecialchars($_POST['name']).'">
                    </p>  

都没有工作。

付款后的数据库插入代码:

if(strpos($response['body'], 'VERIFIED') !== false && $_POST['payment_status'] == "Completed") {
    //Assign IPN Post Values to Local Variables
    $comboString = $_POST['txn_id'].$_POST['payment_date'];

    $data = explode('~',$_POST['custom']);

    $ipn_data = array(
        'name'      => mysql_real_escape_string($_POST['name']),
        'sale_date'     => $_POST['payment_date']
    );
    $ipn_format = array('%s','%s');
    if($ipn_business == $paypal_email) {

        $wpdb->insert($wpdb->prefix.'orderdata', $ipn_data, $ipn_format);
        $ipn_data['currency'] = $_POST['mc_currency'];
        $ipn_data['admin_field'] = $_POST['admin_field'];

        send_email($ipn_data);
    }

} else {
    exit("IPN Request Failure");
}

1 个答案:

答案 0 :(得分:0)

这里适用的两个非常简单的规则:

  1. 只有在插入数据库时​​才能使字符串安全插入数据库
  2. 只有在屏幕上显示时才能使字符串在屏幕上显示。
  3. (添加到XML,添加到URL / GET参数,将数据放入电子邮件等的类似规则 - 每种都有处理它的方法。)

    因此,在插入数据库时​​,请使用PDO预处理语句或mysqli预处理语句,因为这将使数据安全。如果不能,则将字符串包装在mysql_real_escape_string()中。它不会改变进入(并因此出现)数据库的内容,只是让它安全进入。

    当您在第二个示例中显示屏幕时,请使用htmlentities()mysqlspecialchars()。如果你知道如何处理报价,mysqlspecialchars是最好的,但如果不确定,请使用htmlentities。

    我在看的时候,我看到你正在发送一封电子邮件。确保从添加到电子邮件标题的值中删除换行符和伪边界,并从正文中删除伪边界(换行符确定)。最好使用脚本来发送电子邮件,因为它们很难用来证明垃圾邮件。