这个相关的问题询问在bash中使用命令行mysql工具时如何使用参数化查询。然而,最重要的答案似乎仍然很容易被注入(如; DROP TABLE user; --)。虽然答案确实解决了如何传递变量的问题,但它并没有解决如何使用参数化查询进行传递的问题。
我的问题:在链接问题中的链接被接受的答案是否提供了对SQL注入的保护,并且有所有有用的参数化保护?如果是,为什么?如果不是,如何安全地使用来自MySQL命令行工具的参数化查询?
注意:从技术上讲,是在运行mysql Ver 15.1 Distrib 10.3.13-MariaDB。
发布于 2019-03-27 10:36:10
面向客户的应用程序的常见做法是为每个数据库查询设置一个API端点,这将需要用户身份验证。然后,API服务器将在格式化查询时验证输入。
在服务器上直接暴露bash绝不是一个好主意。除了SQL注入之外,其他更糟糕的情况(如; scp ~/.ssh/id_rsa my_proxy ; )也很容易发生。
从下面的评论来看,安全性似乎不是OP的主要关注点。相反,主要关注的是生成有效的查询。
为此,最简单的解决方案可能是使用现有的库,并让它们处理格式化。例如,在Python中
https://dev.mysql.com/doc/connector-python/en/
为了提高效率,通常应该成批进行插入。但是,如果您愿意的话,您可以编写一个脚本来插入一行,如
python3 tableX_insert.py --field1 value1 --field2 value2我确信,在其他语言中,DB、conn和cursor也存在类似的模块。对原始bash命令行进行同样操作的任何努力都是重新发明轮子。
发布于 2019-03-27 15:50:41
您可以在SQL脚本中运行准备和执行来执行参数化语句,但是bash脚本的棘手部分是获取分配给SQL脚本中的会话变量的值,而不引入session漏洞。
我是说你能做到
myshellvar=1234
mysql -e "set @myvar = $myshellvar ; prepare stmt from 'select ?'; execute stmt using @myvar"
+------+
| ? |
+------+
| 1234 |
+------+但这仍然容易受到SQL注入的影响,因为$myshellvar可能包含麻烦的内容。
我做了这个实验:
echo "O'Reilly" > /tmp/name
mysql -e "set @myvar = replace(load_file('/tmp/name'), '\n', ''); prepare stmt from 'select ?'; execute stmt using @myvar"
+----------+
| ? |
+----------+
| O'Reilly |
+----------+这是一种确保内容不会导致SQL注入的安全方法,但您需要一个配置为允许MySQL的load_file()实例,这似乎需要做很多工作,因为您需要为要加载的每个变量创建一个单独的文件。
如果您想方便地编写参数化SQL查询,我同意@PMHui的回答:如果您想要编写参数化SQL查询,应该使用其他脚本语言。
https://stackoverflow.com/questions/55374938
复制相似问题