保护操作数据库的发布请求



我正在开发一个react应用程序,它应该是WooCommerce商店管理区域的一部分。为了在我的react应用程序中获得更多的自由,a创建了一些ajax端点,这些端点调用操作数据库的函数:

  • 读取数据库表
  • 插入行
  • 更新行

由于它是一个react应用程序,每个访问JS代码的人都可以看到JS函数发出了post请求。这显然是非常不安全的,而且可能被滥用。为了避免这种情况,我集成了以下安全方法:

  • 函数只能操作我的自定义表
  • 禁止跨来源http请求
  • react应用程序仅在WooCommerce的管理区域可见
  • 我与Wordpress核实用户是否为管理员

JS函数

const insertDb = async (table, columns, values) => {
const data = {
action: 'insertDb',
table: table,
columns: columns,
values: values
}
const rsp = await axios.post("/wp-admin/admin-ajax.php", qs.stringify(data))
return rsp.data
}

PHP函数

function insertDb($table, $columns, $values) {
if (current_user_can('administrator') && substr($table, 0, 6) === "mytable") {
global $wpdb;
$table = $wpdb->prefix . $table;
$values = str_replace("\", "", $values);
$sql = "INSERT INTO $table ($columns) VALUES ($values);";
$wpdb->query($sql);
$id = $wpdb->insert_id;
return $id;
} else {
return false;
}
}

这还不安全吗?我该如何改进它?最佳做法是什么?

谢谢!!

最好在服务器代码中定义要允许的突变,而不是允许客户端(如果以适当的权限登录(在数据库中插入任意行。

至少:

  • $table添加一个allowlist,以检查它是否是应该更新的表

优选:

  • 将有效负载更改为例如JSON,这样您将获得更丰富的类型,然后
  • 从字符串数组解析$columns
  • 从数组解析CCD_ 3,然后使用准备好的查询和占位符

更优选,如前所述:

  • 将查询限制在一个已知的良好集合(例如"添加带有标题和文本的页面"、"添加其他内容"(-这样,您基本上会得到某种(REST(API

最新更新