我正在开发一个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