SQL注入的原理以及如何预防

MySQL for Java的SQL注入测试

只要你学JDBC,Statement不能防止SQL注入, PreparedStatement能够防止SQL注入.

原文链接 yklovejava-163-com.iteye.com/blog/1601205

 

SQL注入的攻击本质是让客户端传递过去的字符串变成SQL语句,而且能够被执行。攻击方式包括表单提交、URL传值、和Cookie;

到了服务器可以分为3种情况 数字、日期时间、字符串。

一、数字。
     string sql = "select * from news where ColID=" + id;

  但是如果传递过来的id是“1 delete from table ”的话,那么sql的值就变成了“select * from table where ColID=1 delete from news”。对于SQL Server来说是支持一次提交多条SQL语句的,显然如果这条SQL语句被执行的话,那么news表里的记录就都没有了。

 

 那么如何预防呢?很简单,因为ColID字段的类型是int的,那么我们只需要验证一下传递过来的id是不是整数就可以了。是整数就不存在注入;如果不是那么就有可能存在注入。即使不存在注入,把一个不是整数的id拼接进去也会造成执行错误。
  所以说不管是不是为了预防 SQL注入,也都应该验证id是不是整数。  

  

二、日期时间

  这个和数字的情况是一样的,验证是不是日期时间即可。

三、字符串

  最麻烦、争议最大的就是这个了。

  string key = txtTitle.Text;
  string sql = "select * from news where title like '%" + key + "%'";

  这个又是如何注入的呢?我想先问大家一个问题:如果key的值永远都不会包含单引号,那么会不会被注入进来?

  那么用了单引号又是如何注入的呢?假设key=" ' delete from news --" ,那么sql的值就是“ select * from news where title like '%' delete from news -- ' ”。
  先用一个单引号和前面的单引号组成一对封闭的单引号,这一对单引号内部('%')就作为字符串处理,而外面的就被作为SQL语句处理,而第二个单引号被 “--”给注释掉了,这样就保证了整个sql语句的正确性。

  这是注入的一种方法。

  那么如何来防止呢?想想刚才的问题,如果没有单引号是不是就天下太平了呢?对于这种情况(前面的“数字”的情况不算),到目前为止我是没发现不用单引号,还能够注入进来的方法。也许是我孤陋寡闻吧,不知道各位高手是否知道对于这种情况,不用单引号还能注入进来的方法。

  既然找到了罪魁祸首,那么就好办了,把单引号干掉就ok了。key = key.Replace("'", "''");这时候sql的值就是” select * from news where title like '%'' delete from news --'”。
  对于SQL 来说在一对单引号内部的两个单引号表示一个字符串形式的单引号。这样我们就把罪魁祸首改造成了字符串了。在一对单引号内的“--”也是普通的字符串而不代表注释。

  罪魁祸首是单引号,想不明白为什么有许多人都去过滤 “delete、update”这一类的关键字,他们都是安善良民呀,他们是很冤枉的。当然了,如果前提是程序都已经写好了,不能修改内部代码,那就另当别论了。至于“--”顶多算是帮凶,如果您不放心的话,把他处理了也行。
  

其实要防止Sql注入,只要两步即可:

1、注意数据类型必须进行类型转换(如int类型,不能图方便,直接不转换就进行字符串拼接;日期类型也要进行类型转换。)

2、替换字符串中的一个单引号为两个单引号(strValue.Replace("'","''"))

这样就绝对没有问题了。

 

 

SQL注入是指用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

原文链接 http://wenku.baidu.com/link?url=wPQxYuQUOxlHWTtbjqkXf_6_pVLeXhmIm1CfCHSEkr8HU3KLPYuhi2LOXSZEJHEnA46IESo-XY2GIeCH4W8MTTFFYsuXjeLx18Ymu8_iac_&from_mod=download

posted @ 2015-07-10 10:47  喝酒骑驴撞城管  阅读(166)  评论(0编辑  收藏  举报