如何通过Shell执行MySQL语句时防止SQL注入?

时间:2018-11-27 05:41:31

标签: mysql bash shell sql-injection

我有此代码:

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注入。使此代码摆脱该漏洞的最佳方法是什么?

我可以使用正则表达式匹配来验证输入。有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

有人建议使用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//\'/\\\'}"