【问题标题】:How to prevent SQL injection while executing a MySQL statement through shell?通过shell执行MySQL语句时如何防止SQL注入?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2012-12-27
    • 2012-01-05
    • 2017-03-14
    • 2012-11-27
    相关资源
    最近更新 更多