防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement
package com.swift; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class LoginJDBC$PreparedStatement { public static void main(String[] args) {
User userZhangsan=new User("swift","123456' or '1'='1");
if(login(userZhangsan)) {
System.out.println("账号密码正确,登陆成功");
}else {
System.out.println("登陆失败");
}
} private static boolean login(User userZhangsan) { Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//1、装载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//2、链接数据库,使用com.mysql.jdbc.Connection包会出错
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
//3、创建连接语句
ps=conn.prepareStatement("select * from sw_user where username='"+userZhangsan.getUsername()+"' and password='"+userZhangsan.getPassword()+"'");
//4、执行SQL语句获得结果集
rs=ps.executeQuery();
if(rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭结果集
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭连接语句
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭数据库连接
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false; } }
上面代码中的sql语句通过字符串连接的方式,虽然已经使用了PreparedStatement,但依然不能防止注入,因为字符串连接可以加入'or '1'='1
ps=conn.prepareStatement("select * from sw_user where username='"+userZhangsan.getUsername()+"' and password='"+userZhangsan.getPassword()+"'");
将上面sql语句变为 select * from sw_user where username=? and password=?
就不存在字符串连接,password 加上其他字符sql也无法执行
所以代码修改如下:
package com.swift; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; public class LoginJDBC$PreparedStatement2 { public static void main(String[] args) {
User userSwift=new User("zhangsan","123456");
if(login(userSwift)) {
System.out.println("账号密码正确,登陆成功");
}else {
System.out.println("登陆失败");
}
} private static boolean login(User userSwift) { Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//1、装载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//2、链接数据库,使用com.mysql.jdbc.Connection包会出错
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
//3、创建连接语句
ps=conn.prepareStatement("select * from sw_user where username=? and password=?");
ps.setString(1, userSwift.getUsername());
ps.setString(2, userSwift.getPassword());
//4、执行SQL语句获得结果集
rs=ps.executeQuery();
if(rs.next()) {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//关闭结果集
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭连接语句
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭数据库连接
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false; } }
防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement的更多相关文章
- sql注入问题 java中将MySQL的数据库验证秘密加上 ' or '1'= '1 就可以出现万能密码
password的字符串中,加上 ' or '1'= '1 就可以制作出万能密码. 原因如下: 原代码中密码是123456 执行数据库查询语句 实际上执行的SQL语句是: select * from ...
- sql注入方法以及防范
sql注入方法: 1.数字注入 ; get请求 www.bobo.com?id=1 可以查出 ID等于1的一条数据. 如果有人在链接后面增加 www.bobo.com?id=1 or 1=1 / w ...
- SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO
看到有人说了判断能否sql注入的方法: 简单的在参数后边加一个单引号,就可以快速判断是否可以进行SQL注入,这个百试百灵,如果有漏洞的话,一般会报错. 下面内容参考了这两篇文章 http://blog ...
- ref:web 防止SQL注入方法
ref:https://blog.csdn.net/beidou321/article/details/6482618 小结:spring采用JdbcTemplate来操作sql,一般不要自行拼接sq ...
- 另类的SQL注入方法
前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/ ...
- PHP最全防止sql注入方法
(1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count ...
- 防止SQL注入方法总结
一.参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数. 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 ...
- 使用php函数防止SQL注入方法
什么是SQL注入? SQL注入是指在你系统防御之外,某人将一段Mysql语句注入到你的数据库.注入通常发生在系统要求用户输入数据的时候,比如用户名的输入,用户可能输入的不是一个用户名,而是一段SQL语 ...
- 网站防止SQL注入方法
方法:所有获取GET.POST变量都先进行过滤: 字符串-- htmlspecialchars(addslashes($string)) addslashes() 函数返回在预定义字符之前添加反斜杠 ...
随机推荐
- Java基础笔记(十)—— 数组
数组是具有相同类型的数据的集合,是一种引用数据类型,一般具有固定的长度,并且在内存中占据连续的空间. 数组声明:数据类型[ ] 数组名; 数据类型 数组名[ ]; 如:int[ ...
- javascript数组常用的遍历方法
本篇文章给大家带来的内容是关于javascript数组常用的遍历方法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 本文主要介绍数组常见遍历方法:forEach.m ...
- POJ1845 Sumdiv 数学?逆元?
当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...
- Hive 基本语法操练(五):Hive 的 JOIN 用法
Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...
- 斐波那契数列【java实现】
java 实现斐波那契数列 以下是Java代码实现(递归与递推两种方式): import java.util.Scanner; /** * Fibonacci * * @author tongqian ...
- 一个关于document.write()的问题
Index.html中: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- 配置ftp服务器
计算机管理->用户->添加用户 iis网站右键->添加ftp站点(没有此选项确认已安装及开启了ftp服务)->进行相关设置即可
- jsp连接sqlite、Sqlite相对路径绝对路径问题(转)
转自 http://blog.csdn.net/sxy12138/article/details/52304884 假如在java中, # 数据库连接jdbc.jdbc-url=jdbc:sqlit ...
- 使用css写三角箭头
.right-arrow{ width:6px; height:6px; align-self: center; border-right:1px solid #2ac795; border-left ...
- 开发环境中快速部署Oracle Essbase(Rapid deployment of oracle essbase in development envrioments)
版本:Oracle Enterprise Performance Management System Release11.1.2.4 快速部署自动安装组件: Essbase Oracle Essbas ...