我有此代码:
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注入。使此代码摆脱该漏洞的最佳方法是什么?
我可以使用正则表达式匹配来验证输入。有更好的方法吗?
答案 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//\'/\\\'}"