【发布时间】: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