友乾营 报表的 SQL 植入风险 规避风险 : 让你的报表变的安全起来
SQL 植入的概念 恶意的 SQL 归根结底 : 执行了不该允许执行的 SQL 命令, 达到非法的目的 常见案例 骗过登录验证非法获取账号信息篡改 删除数据
为什么存在 SQL 植入
植入原理 如何攻击 特殊的输入参数 未处理特殊字符 -- # 数据库配置不合理
植入原理 : 案例 1, 特殊输入参数 union or 猜表名 : union all select 条件恒真 * from t_user
植入原理 : 案例 1, 特殊输入参数 or: 骗过登录 userid : 1 OR 1=1; password : '1' OR 1=1; SELECT * FROM users WHERE userid=1 OR 1=1 and pw =' 1' OR 1=1;
植入原理 : 案例 2, 特殊符号 -- # 一般数据库注释均采用 -- mysql 注释
植入原理 : 案例 2, 特殊符号 骗过登录 userid : '' or 1=1 -- ; userid : '' or 1=1 # ;
植入原理 : 案例 3, 数据库配置不合理 篡改 删除 拼 update ; update Users set pwd='1' 拼 delete drop ; delete from users ;drop from users
报表和 SQL 植入有啥关系 报表参数
报表和 SQL 植入有啥关系 : 普通用法 普通用法 :select * from t where date>=? and date<=? 一般写死的相对安全
报表和 SQL 植入有啥关系 : 通用查询 SQL1: mac1: SQL2:
报表和 SQL 植入有啥关系 : 通用查询 SQL1: mac1: SQL1:
报表和 SQL 植入有啥关系 : 通用查询 SQL1: mac1: rr
报表和 SQL 植入有啥关系 : 通用查询 SQL1: mac1: rr
报表工具提供防 SQL 植入的方法 xml 配置选项 自定义
报表防植入 : 报表工具 xml 配置 raqsoftconfig.xml
报表防植入 : 报表工具 xml 配置
报表防植入 : 报表工具 xml 配置 Url: 错误提示 :
报表防植入 : 报表工具自定义参数检查类接口 1 对所有参数值检查 2 针对某些参数进行检查 3 自定义检查后返回的错误提示信息 public class ResistSQLInject implements IParamChecker { // 校验不通过返回 false, 提供 paramname 以便用户只检查某种形式的参数 // 检验不通过是可获取详细信息
自定义类的具体实现方法
程序方式 :1 实现接口类 ( 所有参数检查 ) public class ResistSQLInject implements IParamChecker { private String cause = ""; private List<String> wordlist = new ArrayList<String>(); public boolean check(string paramname, String inputvalue) { if(inputvalue == null inputvalue.length() == 0){// 如果参数值为空, 则无需检查 return true; if(wordlist == null){ // 如果检测关键字列表是空, 则不作检查 return true; for(int i = 0; i < wordlist.size(); i++){ inputvalue = inputvalue.tolowercase();// 这里做, 是为了不区分大小写 if(inputvalue.indexof(wordlist.get(i).tolowercase()) >= 0){ StringBuffer sb = new StringBuffer(); sb.append(" 校验未通过,").append(paramName).append(" 参数中含有以下词汇 :").append(wordlist.get(i)).append("\n 位置 :").append(inputvalue.indexof(wordlist.get(i).tolowercase())); this.cause = sb.tostring(); return false; return true; public String getcause() { String tmp = this.cause; this.cause = ""; return tmp;
程序方式 :1 实现接口类 ( 特定参数检查 ) private String cause = ""; private List<String> wordlist = new ArrayList<String>(); /* * @paramname 验证的参数名 * @inputvalue 验证的参数值 */ public boolean check(string paramname, String inputvalue) { //wordlist.add("select"); if(wordlist == null){ // 如果检测关键字列表是空, 则不作检查 return true; if(paramname=="userid"){ if(inputvalue == null inputvalue.length() == 0){// 如果参数值为空, 则无需检查 return true; for(int i = 0; i < wordlist.size(); i++){ inputvalue = inputvalue.tolowercase();// 这里做, 是为了不区分大小写 if(inputvalue.indexof(wordlist.get(i).tolowercase()) >= 0){ StringBuffer sb = new StringBuffer(); sb.append(" 校验未通过,").append(paramName).append(" 参数中含有以下词汇 :").append(wordlist.get(i)).append("\n 位置 :").append(inputvalue.indexof(wordlist.get(i).tolowercase())); this.cause = sb.tostring(); return false; return true;
程序方式 :1 实现接口类 ( 自定义错误信息 ) public boolean check(string paramname, String inputvalue) { //wordlist.add("select"); if(wordlist == null){ // 如果检测关键字列表是空, 则不作检查 return true; if(inputvalue == null inputvalue.length() == 0){// 如果参数值为空, 则无需检查 return true; for(int i = 0; i < wordlist.size(); i++){ inputvalue = inputvalue.tolowercase();// 这里做, 是为了不区分大小写 if(inputvalue.indexof(wordlist.get(i).tolowercase()) >= 0){ StringBuffer sb = new StringBuffer(); sb.append(" 参数 :").append(paramname).append(" 检查未通过,").append(" 含有以下敏感词汇 : ").append(wordlist.get(i)).append(" \n 谨记 :\n").append(" 道路千万条 \n 规范第一条 \n 数据不规范 \n 亲人两行泪 "); this.cause = sb.tostring(); return false; return true;
程序方式 :2 Xml 内配置自定义类路径 xml(raqsoftconfig.xml): paramcheckclass 设置参数值校验的类路径 <property name="paramcheckclass" value="com.raqsoft.hyl.resistsqlinject " />
报表防植入 : 报表工具自定义参数检查类接口 Url: 错误提示 :
润乾线上直销系统 玩转好多乾 ( 省钱攻略 ) http://www.raqsoft.com.cn/wx/hdq-strategy-save.html 玩转好多乾 ( 赚钱攻略 ) http://www.raqsoft.com.cn/wx/hdq-strategy.html