mysql - 通过shell执行MySQL语句时如何防止SQL注入?
问题描述
我有这个代码:
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 注入。使此代码免受该漏洞影响的最佳方法是什么?
我可以使用正则表达式匹配来验证输入。有没有更好的方法?
解决方案
有些人建议使用SET语法来做到这一点:
SET @requestId = '$request_id';
update dep_requests set
state='FAILED', end_time=sysdate(),
message='Cancelled manually'
where id=@request_id limit 1;
这$request_id
是对您的 bash 变量的引用。如果将其粘贴到双引号 bash 字符串中,它应该可以工作。
由于我们仍在将字符串粘贴在一起:如果您使用\'
in转义单引号$request_id
,我认为攻击者无法逃脱。例如:request_id="${request_id//\'/\\\'}"
推荐阅读
- xpath - 如何提取此页面顶部的 3 个“成本收益率”值:https://seekingalpha.com/symbol/GE/dividends/yield-on-cost?
- java - 当我将鼠标悬停在 JButton 上时如何更改它的颜色,但即使我在单击它之后将其悬停也将其永久更改为其他颜色?
- python-3.x - 如何使用冒泡排序返回具有增加交换的字典以对随机整数列表进行排序?
- git - 在 pipenv 中推送到 git
- android - 创建新密钥库时 Visual Studio 崩溃
- bash - 如何将 gitbash 与包含 ASCII 感叹号字符(如 !0-MyFolder)的文件名一起使用
- java - 为对象创建特定的时间戳?
- excel - 尝试从字符串中提取 6 或 5 位数字
- javascript - 关于全局对象的几个问题
- ruby-on-rails - Rails 创建一个简单的函数以在系统范围的控制台中运行