×

sql注入防范措施 sql注入防范措施表名

前端技术网 前端技术网 发表于2024-01-18 13:43:12 浏览724 评论0

抢沙发发表评论

一、java如何防sql攻击

java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数。下面就举三个例子来说明一下:

第一种:

sql注入防范措施 sql注入防范措施表名

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可,如下所示:

Stringsql="select*fromuserswhereusername=?andpassword=?;PreparedStatementpreState=conn.prepareStatement(sql);preState.setString(1,userName);preState.setString(2,password);ResultSetrs=preState.executeQuery();...

第二种:

采用正则表达式将包含有单引号('),分号(;)和注释符号(--)的语句给替换掉来防止SQL注入,如下所示:

publicstaticStringTransactSQLInjection(Stringstr)

{

sql注入防范措施 sql注入防范措施表名

returnstr.replaceAll(".*([';]+|(--)+).*","");

}

userName=TransactSQLInjection(userName);

password=TransactSQLInjection(password);

Stringsql="select*fromuserswhereusername='"+userName+"'andpassword='"+password+"'"

Statementsta=conn.createStatement();

ResultSetrs=sta.executeQuery(sql);

第三种:

使用Hibernate框架的SQL注入防范Hibernate是目前使用最多的ORM框架,在JavaWeb开发中,很多时候不直接使用JDBC,而使用Hibernate来提高开发效率。

在Hibernate中,仍然不应该通过拼接HQL的方式,而应使用参数化的方式来防范SQL注入。有两种方式,一种仍然是使用JDBC一样的占位符“?”,但更好的方式是使用Hibernate的命名参数,例如检测用户名和密码是否正确,使用Hibernate可以写成如下:

StringqueryStr=“fromuserwhereusername=:username”+”password=:password”;

Listresult=session.createQuery(queryStr).setString("username",username).setString("password",password).list();

二、mybatis为什么可以防止sql注入

因为在mybatis中,”${xxx}”这样格式的参数会直接参与sql编译,从而不能避免注入攻击。

但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式,所以,这样的参数需要程序开发者在代码中手工进行处理来防止注入。

#xxx#代表xxx是属性值,map里面的key或者是你的pojo对象里面的属性,ibatis会自动在它的外面加上引号,表现在sql语句是这样的wherexxx='xxx';$xxx$则是把xxx作为字符串拼接到sql语句中,比如orderbytopicId,语句这样写...orderby#xxx#ibatis就会翻译成orderby'topicId'(这样就会报错)语句这样写...orderby$xxx$ibatis就会翻译成orderbytopicId

三、sql注入防范有哪些方法

sql注入防范有方法有以下两种:

1.严格区分用户权限

在权限设计中,针对软件用户,没有必要给予数据库的创建、删除等管理权限。这样即便在用户输入的SQL语句种含有内嵌式的恶意程序,因为其权限的限定,也不可能执行。所以程序在权限设计时,最好把管理员与用户区别起来。这样能够最大限度的降低注入式攻击对数据库产生的损害。

2.强制参数化语句

在设计数据库时,如果用户输入的数据并不直接内嵌到SQL语句中,而通过参数来进行传输的话,那麼就可以合理的预防SQL注入式攻击。

四、java如何防止sql注入

java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数

01importjava.io.IOException;

02importjava.util.Iterator;

03importjavax.servlet.Filter;

04importjavax.servlet.FilterChain;

05importjavax.servlet.FilterConfig;

06importjavax.servlet.ServletException;

07importjavax.servlet.ServletRequest;

08importjavax.servlet.ServletResponse;

09importjavax.servlet.http.HttpServletRequest;

10importjavax.servlet.http.HttpServletResponse;

11/**

12*通过Filter过滤器来防SQL注入攻击

13*

14*/

15publicclassSQLFilterimplementsFilter{

16privateStringinj_str="'|and|exec|insert|select|delete|update|count|*|%

|chr|mid|master|truncate|char|declare|;|or|-|+|,";

17protectedFilterConfigfilterConfig=null;

18/**

19*Shouldacharacterencodingspecifiedbytheclientbeignored?

20*/

21protectedbooleanignore=true;

22publicvoidinit(FilterConfigconfig)throwsServletException{

23this.filterConfig=config;

24this.inj_str=filterConfig.getInitParameter("keywords");

25}

26publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

27FilterChainchain)throwsIOException,ServletException{

28HttpServletRequestreq=(HttpServletRequest)request;

29HttpServletResponseres=(HttpServletResponse)response;

30Iteratorvalues=req.getParameterMap().values().iterator();//获取所有的表单参数

31while(values.hasNext()){

32String[]value=(String[])values.next();

33for(inti=0;i<value.length;i++){

34if(sql_inj(value[i])){

35//TODO这里发现sql注入代码的业务逻辑代码

36return;

37}

38}

39}

40chain.doFilter(request,response);

41}

42publicbooleansql_inj(Stringstr)

43{

44String[]inj_stra=inj_str.split("\\|");

45for(inti=0;i<inj_stra.length;i++)

46{

47if(str.indexOf(""+inj_stra[i]+"")>=0)

48{

学习资源

百度搜索圈T社区(www.aiquanti.com)免费视频教程

感谢您的阅读!希望本文对解决您关于sql注入防范措施的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。