黑客最常用的攻击手段——SQL注入的应对机制

  • 系统的安全性至关重要,尤其是当任擎服务器部署在互联网上时,时刻都有被攻击的风险,其中SQL注入就是黑客最常用的一种攻击手段,为此任擎提供了专门的应对机制。

    开发人员在构造SQL语句时如果采用字符串拼接的形式,直接将请求参数拼接到SQL语句中然后让数据库执行,就很容易被SQL注入,具体怎么注入,可以百度。

网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

为了有效防止SQL注入,首先,我们在构造SQL语句时,不要直接拼接请求参数,SQL语句中需要使用请求参数的地方用占位符?代替,然后将参数值保存到参数数组中统一传入,任擎数据访问对象(DAO)的execute、query、queryDataPage、update和delete等方法都支持在options.where参数中使用 ? 做为查询参数占位符,然后将查询参数保存在options.params数组中传入,采用这种方式,数据库会自动对参数值进行转义,从而有效规避注入。

示例代码如下:

var self = this;

dao.query({where: ‘org_id=? and parent_id=? and name=? and id<>?’,

params:[req.session.orgId,parent_id,req.name,req.id]}, function(rows) {

res.data = rows;

self.end(res);

});

对于非客户端请求参数,或者已经通过格式校验的参数,可以直接拼接,不用通过占位符传入,包括:

会话对象里的宏变量:例如req.session.orgId、req.session.userId等

已通过校验的数据:例如已经用utils.isInt()方法校验过的整数、用utils.isPhone()方法校验过的电话号码等,或者用自定义正则表达式校验过的代码、名称等等。

在使用占位符时有以下问题需要注意:

**(1)用like关键字的问题:**在SQL语句中,不能用 %?% 这种方式,需要把%号放到查询参数中,示例代码如下:

if(req.name){

where += ’ and (app_name like ?)';

params.push(‘%’+req.name+‘%’);

}

**(2)用in关键字的问题:**在SQL语句中,不能用in (?) 这种形式将多个值传入SQL,需要开发人员手动对这种参数进行校验,校验通过后再拼接到SQL语句中。如果请求参数正常应该是一个或多个整数,则可以使用utils.strToIntArray()方法先将该参数转换为整数数组,使用该方法转换时,如果某个值不是整数,会被忽略,最后返回的数组中存储的都是整数,然后使用数组的join()方法就可以将有效的所有整数值重新用英文单引号拼接为字符串,然后拼接到SQL语句的in关键字的()中,这样就可以过滤非法数据,防止注入。另外,还可以通过判断返回数组的长度,如果为0,表示没有有效的数据,关于该方法的示例代码如下:

if(!req.roleId) {

this.onLogicError(1, ‘请提供角色编号!’);

return;

}

if(!utils.isInt(req.roleId)) {

this.onLogicError(2, ‘请提供正确的角色编号!’);

return;

}

if(!req.user_id) {

this.onLogicError(3, ‘请提供用户编号!’);

return;

}

var userIds = utils.strToIntArray(req.user_id);

if(userIds.length==0) {

this.onLogicError(4, ‘请提供用户编号!’);

return;

}

userIds = userIds.join();

var self = this;

var dao = new Role_User(this);

dao.delete(‘role_id=’+req.roleId+’ and user_id in ('+userIds

+‘) and org_id=’+req.session.orgId, function() {

self.end(res);

});

任擎(Tasgine)默认会对所有请求参数进行SQL注入检查,如若发现请求参数中存在非法字符,例如英文单引号“’”、分号“;”、百分号“%”,以及and、or、select、update、delete、drop、union等SQL关键字,就会自动拦截该请求,返回“参数值存在非法字符”的错误。

如果某项业务的某个参数必须包含上述字符或关键字,则可以在该业务服务的构造方法中,将该字段的名称加入业务服务对象的sqlInject属性的exclude数组,sqlInject属性是在所有业务服务的父类Service中定义的,它是一个JSON对象,包含两个属性:

**check:**bool型,当前业务服务是否要进行SQL注入检查,默认为true;

**exclude:**数组,用来设置当前业务服务的哪些请求参数不需要SQL注入检查,该参数只有在上面的check==true时才有效,默认为空数组,表示当前服务的所有请求参数都会检查。

示例代码如下:

var UpdatePwd = function() {

Service.call(this);

this.sqlInject.exclude = [‘oldPwd’,’newPwd’];

};

function() {

Service.call(this);

this.sqlInject.exclude = [‘oldPwd’,’newPwd’];

};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cbs64dJA-1683206563326)(https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/5df0ef90bdb6448e923564f3f20cf247~noop.image?_iz=58558&from=article.pc_detail&x-expires=1683811313&x-signature=xMrbSrZ4INy4HRLjUyGw1zIbAyA%3D)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值