首页 > 解决方案 > 通过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 注入。使此代码免受该漏洞影响的最佳方法是什么?

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

标签: mysqlbashshellsql-injection

解决方案


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


推荐阅读