1.一种基于c/s架构的sql注入检测方法,其特征在于:
接收客户端提交的数据;
在webserver端对所述数据执行sql注入检测,查看webserver端存储的黑名单,判断用户端网页ip地址否在所述黑名单中;
若是,则禁止访问所有请求的url地址;
若否,则基于预设的sql注入检测算法检测客户端提交的数据,所述预设的sql注入检测算法为静态分析和动态分析相结合的检测算法;
若检测结果为合法,则允许正常访问网站;
若检测结果为非法,则禁止访问所有请求的url地址,并更新webserver端的黑名单,将所述ip地址添加至黑名单。
2.根据权利要求1所述的sql注入检测方法,其特征在于,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:定义函数f,用于删除数据中sql查询语句的属性值;令fq为一条sql查询语句,则fdq=f(fq),fdq为fq删除在‘=’之后或括号内的字符串值以后的sql查询语句。
3.根据权利要求2所述的sql注入检测方法,其特征在于,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:在web应用程序运行过程中,遍历该web应用程序中所有固定sql查询语句,对于每一条固定sql查询语句fix_sqli,有:dyn_sqli=f(fix_sqli),得到对应的动态sql查询语句dyn_sqli;
依据下述公式计算得到中间结果result:
result=fix_sqli⊕dyn_sqli
其中⊕是异或操作;
判断所述中间结果result是否为零,若result=0,则说明数据正常,否则说明数据存在异常。
4.根据权利要求2所述的sql注入检测方法,其特征在于,所述删除数据中sql查询语句的属性值进一步包括:
定义函数deletfirst(),用于提取并删除输入sql查询语句中的第一个字符,并返回该字符;
定义两个状态常量is_start和is_end,表示sql查询语句中“‘”符号的开始和结束状态;
定义中间状态变量current_status,初始化值为is_end;
如果初始sql查询语句sql不为空,则循环执行下述操作:
步骤s1、令临时变量char=deletfrist(sql);
步骤s2、判断char是否为“‘”符号,如果是,则将char添加到待输出变量output中并执行步骤s3,返回步骤s1,否则,执行步骤s4;
步骤s3、判断char前一个字符是否为反斜杠“\”,如果是,则令current_status=is_start,返回步骤s1;
步骤s4、判断current_status是否等于is_end,如果是,则将char添加到待输出变量output中,返回步骤s1,否则,执行步骤s5;
步骤s5、判断char前一个字符是否为反斜杠“\”,如果是,则将char添加到待输出变量output中;
结束循环后返回所述变量output,作为删除属性值后的sql查询语句。
5.一种基于c/s架构的sql注入检测装置,其特征在于:
接收模块,用于接收客户端提交的数据;
检测模块,位于webserver端,用于在webserver端对所述数据执行sql注入检测;
所述检测模块包括黑名单判断模块和sql注入检测算法模块,其中黑名单那判断模块用于查看webserver端存储的黑名单,判断用户端网页ip地址否在所述黑名单中,若是,则禁止访问所有请求的url地址;
若否,则由sql注入检测算法模块基于预设的sql注入检测算法检测客户端提交的数据,所述预设的sql注入检测算法为静态分析和动态分析相结合的检测算法;
若检测结果为合法,则允许正常访问网站;
若检测结果为非法,则禁止访问所有请求的url地址,并更新webserver端的黑名单,将所述ip地址添加至黑名单。
6.根据权利要求5所述的sql注入检测装置,其特征在于,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:
定义函数f,用于删除数据中sql查询语句的属性值;令fq为一条sql查询语句,则fdq=f(fq),fdq为fq删除在‘=’之后或括号内的字符串值以后的sql查询语句。
7.根据权利要求6所述的sql注入检测装置,其特征在于,所述基于预设的sql注入检测算法检测客户端提交的数据进一步包括:
在web应用程序运行过程中,遍历该web应用程序中所有固定sql查询语句,对于每一条固定sql查询语句fix_sqli,有:dyn_sqli=f(fix_sqli),得到对应的动态sql查询语句dyn_sqli;
依据下述公式计算得到中间结果result:
result=fix_sqli⊕dyn_sqli
其中⊕是异或操作;
判断所述中间结果result是否为零,若result=0,则说明数据正常,否则说明数据存在异常。
8.根据权利要求6所述的sql注入检测装置,其特征在于,所述删除数据中sql查询语句的属性值进一步包括:
定义函数deletfirst(),用于提取并删除输入sql查询语句中的第一个字符,并返回该字符;
定义两个状态常量is_start和is_end,表示sql查询语句中“‘”符号的开始和结束状态;
定义中间状态变量current_status,初始化值为is_end;
如果初始sql查询语句sql不为空,则循环执行下述操作:
步骤s1、令临时变量char=deletfrist(sql);
步骤s2、判断char是否为“‘”符号,如果是,则将char添加到待输出变量output中并执行步骤s3,返回步骤s1,否则,执行步骤s4;
步骤s3、判断char前一个字符是否为反斜杠“\”,如果是,则令current_status=is_start,返回步骤s1;
步骤s4、判断current_status是否等于is_end,如果是,则将char添加到待输出变量output中,返回步骤s1,否则,执行步骤s5;
步骤s5、判断char前一个字符是否为反斜杠“\”,如果是,则将char添加到待输出变量output中;
结束循环后返回所述变量output,作为删除属性值后的sql查询语句。