正在为wordpress构建自己的个人插件。
使用下面的代码,我可以通过wordpress查询记录并将其插入数据库。 使用下面的代码,我知道它容易受到SQL注入攻击。
我知道如何通过PDO和Mysqli防止注入,但我担心wordpress。WordPress是否使用预准备语句。
有人可以告诉我如何使用下面的代码防止WordPress中的SQL注入攻击。
global $wpdb;
// Add record
if(isset($_POST['submit'])){
$name = $_POST['txt_name'];
$uname = $_POST['txt_uname'];
$email = $_POST['txt_email'];
$tablename = $wpdb->prefix."myplugin";
if($name != '' && $uname != '' && $email != ''){
$check_data = $wpdb->get_results("SELECT * FROM ".$tablename." WHERE username='".$uname."' ");
if(count($check_data) == 0){
$insert_sql = "INSERT INTO ".$tablename."(name,username,email) values('".$name."','".$uname."','".$email."') ";
$wpdb->query($insert_sql);
echo "Save sucessfully.";
}
}
}
Wordpress 确实支持使用 $wpdb->prepare(( 的预准备语句(也称为参数化查询(。
global $wpdb;
// Add record
if(isset($_POST['submit'])){
$name = $_POST['txt_name'];
$uname = $_POST['txt_uname'];
$email = $_POST['txt_email'];
$tablename = $wpdb->prefix."myplugin";
if($name != '' && $uname != '' && $email != ''){
$check_data = $wpdb->get_results( $wpdb->prepare(
"SELECT * FROM {$tablename} WHERE username = %s ;"
, [$uname]
));
if(count($check_data) == 0){
$insert_sql = $wpdb->prepare(
"INSERT INTO {$tablename}(name,username,email) values(%s, %s, %s) ;"
, [$name, $uname, $email]
);
$wpdb->query($insert_sql);
echo "Save sucessfully.";
}
}
}
需要注意的两件事:
- 在这种情况下,所有参数都是字符串,因此被
%s
替换,但您也可以使用%d
表示整数,%f
表示浮点数,就像在 PHP sprintf(( 中一样。 - 不需要在字符串占位符 (
%s
( 两边添加引号。$wpdb->prepare()
方法可以解决这个问题。