SQL注入

Posted 论语孔丘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入相关的知识,希望对你有一定的参考价值。

点击"论语孔丘",干货文章,第一时间送达!

SQ注入

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

SQL注入产生原因

SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时的攻击行为。其成因可以归结为以下两个原因所造成的:
1.在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句
2.未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中

SQL注入攻击方式

SQL注入攻击方式根据应用程序处理数据库返回内容的不同分为三种:
1.可显示注入:直接在当前页面上获取所需要的内容
2.报错注入:数据库查询返回结果没有在页面显示,在应用程序中打印报错信息,通过构造数据库报错语句,从报错信息中获取所需要的内容
3.盲注:数据库查询返回结果不能页面中获取,通过数据库逻辑或使数据库库执行延时等方法获取所需要的内容

 1import java.sql.*;
2public class TestJDBC {  
3    public static void main(String[] args) {
4         Connection conn = null;
5             PreparedStatement ps = null;
6         Statement stmt = null;
7         ResultSet rs = null;
8             String sql="";
9String driverjdbc = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
10String dburl = "jdbc:sqlserver://localhost:1433;
11DatabaseName=student"
;
12            String username = "sa";
13            String userpwd = "111111";
14            try {
15                Class.forName(driverjdbc);
16conn = DriverManager.getConnection(driverjdbc,username, userpwd);
17               //采用拼接,没有经过特殊处理,很容易SQL注入
18 //sql ="secelt * from  student  while name='"+username+"'and psw='
19"
+userpassword+"'" ";
20       stmt = conn.createStatement();
21       rs = stmt.executeQuery(sql);
22            } catch (Exception e) {
23                e.printStackTrace();
24            }finally{
25            try {
26                rs.close();
27                            stmt.close();  
28                            conn.close();    
29               }catch (Exception e) {
30            }{
31               }
32            }
33       }        
34  }
35

1.经过采用预编译语句集,防止SQL注入

1sql= "select * from student where username=? and password=?;
2    PreparedStatement ps= conn.prepareStatement(sql);
3        ps.setString(1, userName);
4         ps.setString(2, password);
5
6ResultSet rs = ps.executeQuery();
7

2.采用正则表达式单引号(')、分号(;) 、注释符号(--)替换来防止SQL注入

 1public static String TransactSQLInjection(String sql) {
2return sql.replaceAll(".*([';]+|(--)+).*", " ");
3}
4sql ="secelt * from  student  while name='"+username+"'and
5psw='"
+userpassword+"'" ";
6userName=TransactSQLInjection(userName);
7password=TransactSQLInjection(password);
8stmt = conn.createStatement();
9rs = stmt.executeQuery(sql);
10


3.使用Hibernate框架的SQL注入防范(Hibernate的好处是1.安全2.提高开发效率)通过参数化的方式来防范SQL注入,不采用拼接方式。

1String queryStr = “from student  where username=:username ”+”
2password=:password”;
3List result = session.createQuery(queryStr).setString("username",
4 username).setString("password", password).list();

关注一下   小编会做得更好

                                           




以上是关于SQL注入的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

mybatis以及预编译如何防止SQL注入

手机只需发条消息即可开始大规模SQL注入攻击

4个单词,谷歌返回16个SQL注入漏洞

基于约束的SQL攻击