作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是根据用户提供的输入创建表的简单过程:
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
在创建表之前,我检查用户输入是否仅包含字母数字值,因此据我了解,尝试对此过程进行 SQL 注入(inject)的坏人无法成功,因为无法注释掉查询的其余部分,也无法成功添加其他列。这安全吗还是我错过了一些东西?
最佳答案
它不容易受到攻击,因为您向我们展示的代码使用表名的文字值 - 而不是参数。我想你想这样做:
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
?
它会失败,因为分号和括号将被正则表达式拒绝,但这远不是一个可靠的解决方案。
在表名周围添加反引号(只要正则表达式不允许)是一个微小的改进。
CONCAT('CREATE TABLE `', tab_name, '`
关于mysql - 动态建表时如何避免SQL注入(inject)风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55867056/
我是一名优秀的程序员,十分优秀!