MYSQL之SQL注入

如果通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。

防止SQL注入,我们需要注意以下几个要点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

五种防止SQL注入的方式:
1.(简单又有效的方法)PreparedStatement
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用好处:

  (1).代码的可读性和可维护性.

  (2).PreparedStatement尽最大可能提高性能.

  (3).最重要的一点是极大地提高了安全性.

原理:

  sql注入只对sql语句的准备(编译)过程有破坏作用

  而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

  而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

要引入的包:

import Java.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)\sand\s(.+)|(.+)\sor(.+)\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

  • 检测SQL meta-characters的正则表达式 :/(%27)|(\’)|(--)|(%23)|(#)/ix

  • 典型的SQL 注入攻击的正则表达式 :/\w*((%27)|(\’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

  • 检测SQL注入,UNION查询关键字的正则表达式 :/((%27)|(\’))union/ix(%27)|(\’)

  • 检测MS SQL Server SQL注入攻击的正则表达式:/exec(\s|+)+(s|x)p\w+/ix

3.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

  public static boolean sql_inj(String str)

  {

  String inj_str = "'|and|exec|insert|select|delete|update|

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

  String inj_stra[] = split(inj_str,"|");

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

  {

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

   {

    return true;

   }

  }

  return false;

  }

4.jsp中调用该函数检查是否包函非法字符

防止SQL从URL注入:

sql_inj.java代码:

  package sql_inj;

  import java.NET.*;

  import java.io.*;

  import java.sql.*;

  import java.text.*;

  import java.lang.String;

  public class sql_inj{

  public static boolean sql_inj(String str)

  {

   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 (str.indexOf(inj_stra[i])>=0)

     {

      return true;

     }

    }

    return false;

    }

  }

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;

    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值