动态创建table时如何规避SQL注入风险?
How to avoid SQL injection risk when creating table dynamically?
这是根据用户提供的输入创建 table 的简单过程:
PROCEDURE `hackProcedure`(
IN tab_name VARCHAR(63))
BEGIN
IF (tab_name REGEXP '^[A-Za-z0-9 ]+$')
THEN
SET @StB = CONCAT('CREATE TABLE tab_name
(id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
name VARCHAR(45),
guid VARCHAR(36));');
PREPARE statementB FROM @StB;
EXECUTE statementB;
DEALLOCATE PREPARE statementB;
ELSE
-- SIGNAL some error;
END IF;
#END
在创建 table 之前,我检查用户输入是否仅包含字母数字值,因此据我所知,试图对此程序进行 SQL 注入的坏人不会成功,因为它不是可以注释掉查询的其余部分,也可以添加其他列。这是安全的还是我遗漏了什么?
它不容易受到攻击,因为您向我们展示的代码使用了 table 名称的文字值,而不是参数。我想你想这样做:
CONCAT('CREATE TABLE ', tab_name, '
(id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
name VARCHAR(45),
guid VARCHAR(36));');
现在,如果我调用你的函数...
dummy (id INT NOT NULL); DROP TABLE mysql.users; CREATE TABLE dummy2
?
它会失败,因为分号和括号会被正则表达式拒绝,但这远不是一个可靠的解决方案。
在 table 名称周围添加反引号(只要正则表达式不允许)是一个小改进。
CONCAT('CREATE TABLE `', tab_name, '`
这是根据用户提供的输入创建 table 的简单过程:
PROCEDURE `hackProcedure`(
IN tab_name VARCHAR(63))
BEGIN
IF (tab_name REGEXP '^[A-Za-z0-9 ]+$')
THEN
SET @StB = CONCAT('CREATE TABLE tab_name
(id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
name VARCHAR(45),
guid VARCHAR(36));');
PREPARE statementB FROM @StB;
EXECUTE statementB;
DEALLOCATE PREPARE statementB;
ELSE
-- SIGNAL some error;
END IF;
#END
在创建 table 之前,我检查用户输入是否仅包含字母数字值,因此据我所知,试图对此程序进行 SQL 注入的坏人不会成功,因为它不是可以注释掉查询的其余部分,也可以添加其他列。这是安全的还是我遗漏了什么?
它不容易受到攻击,因为您向我们展示的代码使用了 table 名称的文字值,而不是参数。我想你想这样做:
CONCAT('CREATE TABLE ', tab_name, '
(id INT(10) PRIMARY KEY NOT NULL UNIQUE AUTO_INCREMENT,
name VARCHAR(45),
guid VARCHAR(36));');
现在,如果我调用你的函数...
dummy (id INT NOT NULL); DROP TABLE mysql.users; CREATE TABLE dummy2
?
它会失败,因为分号和括号会被正则表达式拒绝,但这远不是一个可靠的解决方案。
在 table 名称周围添加反引号(只要正则表达式不允许)是一个小改进。
CONCAT('CREATE TABLE `', tab_name, '`