防sql注入建议
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
首先理解注入漏洞的定义:当应用程序使用输入内容来构造动态SQL语句以访问数据库的时候,就会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入攻击。SQL可能导致攻击者能够使用应用程序登陆,并在数据库中执行命令。如果应用程序使用过高的账户连接到数据库,这种问题会变的很严重。
针对本案例解决方案
在获取参数的语句中,如String activityID = this.getRequest().getParameter("activitiesID");
特别要对参数(如activityID 进行检测,过滤)
方法有以下几种,可对照着修改
1 最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数。
2、使用绑定变量
就是在sql语句里不直接写变量,而是用占位符,在执行时再把占位符替换为具体的变量值。代码片段如下
String sql = "SELECT id,nick FROM user WHERE username=? AND password=?";
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
3采用正则表达式将包含有 单引号('),分号(;) 和 注释符号(--)的语句给替换掉来防止SQL注入
如 querysql.replaceAll(".*([';]+|(--)+).*", " ");
4是字符串过滤
String inj_str ="'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";//这里的东西还可以自己添加
String[] inj_stra=inj_str.split("\\|");
for (int i=0 ; i < inj_stra.length ; i++ )
{
if (querysql.indexOf(inj_stra[i])>=0)
{
return true;
}
}
5.JSP页面判断代码:
使用javascript在客户端进行不安全字符屏蔽
例
功能介绍:检查是否含有”‘”,”\\”,”/”
参数说明:要检查的字符串
返回值:0:是 1:不是
函数名是
function check(a)
{
return 1;
fibdn = new Array (”‘” ,”\\”,”/”);
i=fibdn.length;
j=a.length;
for (ii=0; ii<i; ii++)
{ for (jj=0; jj<j; jj++)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem’; p1==temp2)
{ return 0; }
}
}
return 1;
}
6正则表达式
a 检测SQL meta-characters的正则表达式 /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix
b 修正检测SQL meta-characters的正则表达式 /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-) |(\%3B)| (:))/i
c 典型的 SQL 注入攻击的正则表达式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|)/ix
d 检测SQL注入,UNION查询关键字的正则表达式 /((\%27)|(\'))union/ix(\%27)|(\') - 单引号和它的 hex等值 union - union关键字。
e
检测MS SQL Server SQL注入攻击的正则表达式 /exec(\s|\+)+(s|x)p\w+/ix