如何在通过shell执行mysql语句时防止sql注入?

voase2hg  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(284)

我有这个密码:

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注入。使此代码免于该漏洞的最佳方法是什么?
我可以用正则表达式匹配验证输入。有更好的方法吗?

drnojrws

drnojrws1#

有些人建议使用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字符串中,它应该可以工作。
既然我们还在把字符串粘在一起:如果用 \'$request_id ,我认为攻击者无法逃脱。例如。: request_id="${request_id//\'/\\\'}"

相关问题