来自命令行的注入证明 SQL 语句



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

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

注意:从技术上讲,我正在运行mysql Ver 15.1 Distrib 10.3.13-MariaDB.

面向客户的应用程序的常见做法是为每个数据库查询提供一个 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

我确信在其他语言中存在类似的数据库连接和游标模块。任何使用原始 bash 命令行做同样的事情都是在重新发明轮子。

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

我的意思是你可以这样做:

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注入的安全方法,但是您需要一个配置为允许load_file()的MySQL实例,这似乎需要做很多工作,因为您需要为每个要加载的变量创建一个单独的文件。

我同意@PMHui的回答,如果你想方便地编写参数化的SQL查询,你应该使用其他一些脚本语言。

最新更新