我已经在javascript中完成了这个简单的功能,可以识别出带有SQL注入值的字符串。 有多强?哪些SQL攻击可以破解它?
感谢您的时间!
function hasSQL(value) {
if (_.isNull(value) || _.isUndefined(value)) {
return false;
}
// sql regex reference: http://www.symantec.com/connect/articles/detection-sql-injection-and-cross-site-scripting-attacks
const sqlMeta = new RegExp('(\%27)|(\')|(\-\-)|(\%23)|(#)', 'i');
// eslint-disable-next-line no-control-regex
const sqlMeta2 = new RegExp('((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;))', 'i');
const sqlTypical = new RegExp('\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))', 'i');
const sqlUnion = new RegExp('((\%27)|(\'))union', 'i');
const mssqlExec = new RegExp('/exec(\s|\\+)+(s|x)p\w+', "i");
const inlineOrBlock = new RegExp('.*;[\\t\\r\\n ]*(and )?[\\t\\r\\n ]*(select|insert|update|delete).*', "ig");
return sqlMeta.test(value) || sqlMeta2.test(value) || sqlTypical.test(value) ||
sqlUnion.test(value) || mssqlExec.test(value) || value.match(inlineOrBlock);
};
答案 0 :(得分:1)
我只是简短地看了一下这段代码。我没有对所有条件进行彻底检查,但至少看到了一个问题:
const sqlUnion = new RegExp('((\%27)|(\'))union', 'i');
这不会捕获在'
和union
之间有一个或多个空格的SQL注入。
我并不是建议修复正则表达式可以确保此安全。我建议使用正则表达式的方法基本上是不安全的。有太多的边缘情况可能会漏掉。
很难对所有这些情况进行测试,并且要求对Stack Overflow进行免费的代码审查不是一项测试计划。
有一个众所周知的解决方案,它更简单,更安全:使用查询参数。
您说您正在使用不允许的ORM。我会说ORM需要固定,否则就被放弃。无法以最普遍接受的方式处理安全性将使它成为一个入门者。
答案 1 :(得分:0)
使用准备好的语句和参数化查询 尽管可以使用诸如mysqli_real_escape_string之类的方法对条目进行清理,但更建议使用预备语句或参数化语句。
示例如下