Statement安全漏洞(sql注入问题)
问题展示:

首先我的Mysql数据库中有一张users表,如下图所示

	/**
* 根据用户名查询用户
* @param username 需要查询的用户名
* @return User 记录对应的JavaBean对象
*/
public static User find(String name){
Connection conn = null;
Statement sta = null;
ResultSet re = null;
User user = null;
try{
//获取JavaApp与Mysql数据的连接
conn = JDBCUtils.getConnection();
//创建封装SQL语句的对象
sta = conn.createStatement();
//执行sql语句返回结果集合'or true or'
String sql = "select id,username,password,email,Date from users where username='"+ name + "'";
re = sta.executeQuery(sql);
while(re.next()){
int id = re.getInt("id");
String username = re.getString("username");
String password = re.getString("password");
String email = re.getString("email");
Date d = re.getDate("Date");
user = new User(id,username,password,email,d);
} }catch(Exception e){
e.printStackTrace();
throw new RuntimeException("根据用户名查询失败");
}finally{
JDBCUtils.close(re);
JDBCUtils.close(sta);
JDBCUtils.close(conn);
}
return user;
}

public static void main(String[] args) {

          //我们查找的是表中已有的数据李四
User user = Demo2_find.find("李四");
System.out.println(user == null ? "查无此人" : "查有此人");
}


  运行上面这段代码,程序返回的结果是李四在Mysql数据库确实存在,为了验证测试效果,

这一次,我将上图中标红的部分User user = Demo2_find.find("李四");改为查找王五这个人,大家都知道王五这个人在数据库是不存在的.这次运行的结果为进一步证明,上面的代码是没有问题的,这是我依旧将标红部分的代码改掉,改成User user = Demo2_find.find("'or true or'");这时会发生什么神奇的效果呢?我们运行代码看一下.

为了让大家看的清楚一点,我将整张屏幕截取了下来

我们可以发现,当我们输入'or true or'进行查询的时候竟然通过了,能够查询到Mysql中的数据.

这就是著名的sql注入问题.

产生原因:

  因为SQL语句拼接,传入了SQL语句的关键字,绕过了安全检查.
客户端利用JDBC-【Statement】的缺点,传入非法的参数,从而让JDBC返回不合法的值,我们将这种情况下,统称为SQL注入。
解决方案:
  使用PreparedStatement对象就可以解决。PreparedStatement对象预处理对象。允许使用占位符对SQL语句中的变量进行占位。对SQL语句进行预先编译。传入SQL语句的关键字,不会被当成关键字而是普通的字符串。包括:程序执行时动态为?符号设置值,安全检查,避免SQL注入问题,预处理能力

select * from user where username = ? and password = ?

Statement与PreparedStatement的区别
  现在项目中都不直接用Statement了,而用PreparedStatement。
PreparedStatement它除了具有Statement是所有功能外,
还有动态SQL处理能力,包括:程序执行时动态为?符号设置值,安全检查,避免SQL注入问题,预处理能力。

Statement只能处理静态SQL
  1,PreparedStatement既能处理静态SQL,又能处理动态SQL,它继承了Statement的特点
  2,站在预处理这个角度来说的:
  PreparedStatement【适合】做连续多次相同结构的SQL语句,有优势。
  Statement【适合】做连续多次不相同结构的SQL语句,有优势。
  适合:是只效率会更高,但并不表示一定要这才样
  3,PreparedStatement
  1_支持动态SQL,也支持静态SQL
  2_预处理
---相同结构的SQL
  select id,name from users where id = 1
  select id,name,gender from users where id = 2;
 是不相同结构
---不同结构的SQL
声明:
  静态SQL也可以用PreparedStatement
适合:
  静态SQL---优先Statement

著名的sql注入问题-问题的原因分析及总结的更多相关文章

  1. SQL查询速度慢的原因分析和解决方案

    SQL查询速度慢的原因分析和解决方案 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建 ...

  2. SQL注入漏洞产生的原因是什么?怎么防止?XSS呢?

    SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行. 防止SQL注入: 1.开启配置文件中的magi ...

  3. SQL 注入漏洞产生的原因?如何防止?

    SQL 注入产生的原因:程序开发过程中不注意规范书写 sql 语句和对特殊字符进 行过滤,导致客户端可以通过全局变量 POST 和 GET 提交一些 sql 语句正常执行. 防止 SQL 注入的方式: ...

  4. PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)

    PHPCMS9.6.0最新版中,由于/modules/attachment/attachments.php的过滤函数的缺陷导致了可以绕过它的过滤机制形成SQL注入漏洞,可导致数据库中数据泄漏. 而且在 ...

  5. SQL 注入防御方法总结

    SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection S ...

  6. PHP的SQL注入攻击的技术实现以及预防措施

    最近在折腾 PHP + MYSQL 的编程.了解了一些 PHP SQL 注入攻击的知识,总结一下经验.在我看来,引发 SQL 注入攻击的主要原因,是因为以下两点原因: 1. php 配置文件 php. ...

  7. ADO.NET笔记——SQL注入攻击

    相关知识: 可以通过字符串的拼接来构造一个SQL命令字符串,但是SQL命令字符串的拼接确是造成“SQL注入攻击”的重要原因. 考虑下列例子:从ProductCategory表中检索出Name为“Bik ...

  8. 防御SQL注入的方法总结

    这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下   SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难 ...

  9. PHP的SQL注入技术实现以及预防措施

    SQL 攻击(SQL injection,台湾称作SQL资料隐码攻击),简称注入攻击,是发生于应用程序之数据库层的安全漏洞.简而言之,是在输入的字符串之中注入SQL指 令,在设计不良的程序当中忽略了检 ...

随机推荐

  1. Json序列化与反序列化

    参考:http://www.cnblogs.com/caofangsheng/p/5687994.html#commentform 下载链接:http://download.csdn.net/deta ...

  2. iOS 向客户发送xcarchive文件(整理中)

    由于安全的原因,客户不会把app的 distribution provisioning profile给开发者的,但是可以给一个development provisioning profile.这种情 ...

  3. HtmlAgilityPack 学习和笔记

    介绍: http://www.cnblogs.com/bomo/archive/2013/01/28/2879361.html 实战 c#获取外网ip 网址:http://ip138.com/ 如图: ...

  4. 【python】继承关系和isinstance

    来源:廖雪峰 继承关系是: object -> Animal -> Dog -> Husky 那么,isinstance()就可以告诉我们,一个对象是否是某种类型.先创建3种类型的对 ...

  5. .NET 程序集与命名空间

    程序集 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合. 组成部分 Windows文件首部 CLR文件首部 程序集清单 类型元数据 MSIL(CIL)代码 嵌入资源集 作用 ...

  6. Qt文件路径分隔符

    QDir::toNativeSeparators()QDir::separator()

  7. iOS开发多线程篇 — GCD的常见用法

    一.延迟执行 1.介绍    iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil ...

  8. gcd推导

    欧几里得算法有性质: gcd(a, b)=gcd(b, a%b); 那么如何证明呢~ 法1: 我们先假设其成立并且有 gcd(a, b)=gcd(b, a%b)=d; a=k*b+c即a%b=c(我们 ...

  9. [译]SSAS下玩转PowerShell

    操作SSAS数据库的方法有很多,是否有一种可以方法可以通过脚本自动去做这些事呢,比如处理分区,创建备份以及监视SSAS的运行状况. 原文地址: http://www.mssqltips.com/sql ...

  10. 2016"百度之星" - 资格赛(Astar Round1)

    逆元 1001 Problem A 求前缀哈希和逆元 #include <bits/stdc++.h> typedef long long ll; const int MOD = 9973 ...