此功能对防止SQL注入有多强大?

时间:2018-10-31 11:41:40

标签: javascript sql node.js regex sql-injection

我已经在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);
};

2 个答案:

答案 0 :(得分:1)

我只是简短地看了一下这段代码。我没有对所有条件进行彻底检查,但至少看到了一个问题:

const sqlUnion = new RegExp('((\%27)|(\'))union', 'i');

这不会捕获在'union之间有一个或多个空格的SQL注入。

我并不是建议修复正则表达式可以确保此安全。我建议使用正则表达式的方法基本上是不安全的。有太多的边缘情况可能会漏掉。

很难对所有这些情况进行测试,并且要求对Stack Overflow进行免费的代码审查不是一项测试计划。

有一个众所周知的解决方案,它更简单,更安全:使用查询参数。

您说您正在使用不允许的ORM。我会说ORM需要固定,否则就被放弃。无法以最普遍接受的方式处理安全性将使它成为一个入门者。

答案 1 :(得分:0)

使用准备好的语句和参数化查询 尽管可以使用诸如mysqli_real_escape_string之类的方法对条目进行清理,但更建议使用预备语句或参数化语句。

示例如下

Preventing SQL Inject using PHP