【发布时间】:2019-04-28 19:46:54
【问题描述】:
我有这个代码:
printf '%s' 'Enter deployment request ID: '
read request_id
[[ $request_id ]] || { printf '%s' 'Request ID is required' >&2; exit 2; }
...
mysql -h "$db_host" -u app_user --database dep_db -p -sNE "
update dep_requests set
state='FAILED', end_time=sysdate(), message='Cancelled manually'
where id='$request_id' limit 1;
"
由于request_id是一个字符串,作为用户输入被接收,它可能导致SQL注入。使此代码免受该漏洞影响的最佳方法是什么?
我可以通过正则表达式匹配来验证输入。有更好的方法吗?
【问题讨论】:
-
不是mysql,但这可以提供一些线索:caryrobbins.com/dev/postgres-scripting
-
正则表达式匹配似乎是一种有效的方法。
-
强制将
request_id的值转换为整数如何?request_id=$(($request_id + 0))。它对数字有帮助,但对其他类型(如字符串)没有帮助。 -
恕我直言,你最好用 python 重写它...
-
一个变量需要两次转义,第一次使其成为安全的mysql值,第二次使bash命令行安全。
printf '%q'可以用于第二个,但我不认为第一个有合理的解决方案,因为语言环境。
标签: mysql bash shell sql-injection