首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令行中的注入验证SQL语句

问命令行中的注入验证SQL语句
EN

Stack Overflow用户
提问于 2019-03-27 10:26:08
回答 2查看 469关注 0票数 0

这个相关的问题询问在bash中使用命令行mysql工具时如何使用参数化查询。然而,最重要的答案似乎仍然很容易被注入(如; DROP TABLE user; --)。虽然答案确实解决了如何传递变量的问题,但它并没有解决如何使用参数化查询进行传递的问题。

我的问题:在链接问题中的链接被接受的答案是否提供了对SQL注入的保护,并且有所有有用的参数化保护?如果是,为什么?如果不是,如何安全地使用来自MySQL命令行工具的参数化查询?

注意:从技术上讲,是在运行mysql Ver 15.1 Distrib 10.3.13-MariaDB。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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/

为了提高效率,通常应该成批进行插入。但是,如果您愿意的话,您可以编写一个脚本来插入一行,如

代码语言:javascript
复制
python3 tableX_insert.py --field1 value1 --field2 value2

我确信,在其他语言中,DB、conn和cursor也存在类似的模块。对原始bash命令行进行同样操作的任何努力都是重新发明轮子。

票数 4
EN

Stack Overflow用户

发布于 2019-03-27 15:50:41

您可以在SQL脚本中运行准备和执行来执行参数化语句,但是bash脚本的棘手部分是获取分配给SQL脚本中的会话变量的值,而不引入session漏洞。

我是说你能做到

代码语言:javascript
复制
myshellvar=1234
mysql -e "set @myvar = $myshellvar ; prepare stmt from 'select ?'; execute stmt using @myvar"

+------+
| ?    |
+------+
| 1234 |
+------+

但这仍然容易受到SQL注入的影响,因为$myshellvar可能包含麻烦的内容。

我做了这个实验:

代码语言:javascript
复制
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查询,应该使用其他脚本语言。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55374938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档