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注入的主要内容,如果未能解决你的问题,请参考以下文章