【问题标题】:How strong is this function to prevent SQL injection?这个防止SQL注入的功能有多强?
【发布时间】:2019-04-04 13:40:50
【问题描述】:

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

【问题讨论】:

  • 我没有能力回答最初的问题,但请问您为什么要执行此检查(在 js 中)?
  • 当然,检查是在 node.js 中的服务器端完成的。
  • 您的代码会阻止我将foo--#bobby-tables 插入到您的数据库中。也许告诉我们您真正想要防止的情况,以及您为什么不使用 SQL 占位符。
  • 我们的软件使用不使用 sql 语句的专有 ORM,所以我想知道这种类型的函数是否可以替代,甚至是临时的,来修改构建 sql 的类ORM。
  • ORM 还没有自己剥离值吗?

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


【解决方案1】:

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

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

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

我并不是说修复正则表达式会使其安全。我建议使用正则表达式的方法根本不安全。有太多的边缘情况可能会漏掉。

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

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

您说您使用的 ORM 不允许这样做。我会说 ORM 需要修复,否则就放弃。未能以最普遍接受的方式处理安全性使其无法启动。

【讨论】:

    【解决方案2】:

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

    示例如下

    Preventing SQL Inject using PHP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 2012-07-30
      • 2012-10-21
      • 2011-06-12
      • 1970-01-01
      • 2018-10-21
      • 2020-05-01
      相关资源
      最近更新 更多