查看“SQL注入”的源代码
←
SQL注入
跳转至:
导航
,
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
==SQL注入的概念== 在需要用户输入的地方,用户输入的是SQL语句的片段,最终用户输入的SQL片段与我们数据库访问代码中写的SQL语句合成一个完整的SQL语句!例如用户在登录时输入的用户名和密码都是为SQL语句的片段! ===创建示例表=== <nowiki>CREATE TABLE user( uid CHAR(32) PRIMARY KEY, username VARCHAR(30) UNIQUE KEY NOT NULL, password VARCHAR(30) ); INSERT INTO user VALUES('U_1001', 'cloud', 'cloud');</nowiki> ===登录验证方法=== <nowiki>public void login(String username, String password) { Connection con = null; Statement stmt = null; ResultSet rs = null; …… 略 stmt = con.createStatement(); String sql = "SELECT * FROM user WHERE " + "username='" + username + "' and password='" + password + "'"; rs = stmt.executeQuery(sql); if(rs.next()) { System.out.println("欢迎" + rs.getString("username")); } else { System.out.println(“用户名或密码错误!”); } ……略</nowiki> 下面是调用这个方法的代码: login("a' or 'a'='a", "a' or 'a'='a"); 调用此方法会使我们登录成功!因为是输入的用户名和密码是SQL语句片段,最终与我们的login()方法中的SQL语句组合在一起!我们来看看组合在一起的SQL语句: SELECT * FROM user WHERE username='a' or 'a'='a' and password='a' or 'a'='a' 预防SQL注入的方法: *过滤用户输入的数据中是否包含非法字符; *分步交验!先使用用户名来查询用户,如果查找到了,再比较密码; *使用PreparedStatement。 ==PreparedStatement== PreparedStatement也叫预编译声明。 PreparedStatement是Statement的子接口,你可以使用PreparedStatement来替换Statement。 PreparedStatement的好处: *防止SQL攻击; *提高代码的可读性,以可维护性; *提高效率。 PreparedStatement的使用: *使用Connection的prepareStatement(String sql):即创建它时就让它与一条SQL模板绑定; *调用PreparedStatement的setXXX()系列方法为sql命令设置值; *调用executeUpdate()或executeQuery()方法,但要注意,调用没有参数的方法; 例如: <nowiki>String sql = “select * from user where username=?”; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, “S_1001”); ResultSet rs = pstmt.executeQuery(); rs.close(); pstmt.clearParameters(); pstmt.setString(1, “S_1002”); rs = pstmt.executeQuery();</nowiki> 在使用Connection创建PreparedStatement对象时需要给出一个SQL模板,所谓SQL模板就是有“?”的SQL语句,其中“?”就是参数。在得到PreparedStatement对象后,调用它的setXXX()方法为“?”赋值,这样就可以得到把模板变成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery()方法获取ResultSet对象。 PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery()是需要参数(SQL语句)的。因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了。PreparedStatement最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它。这才是真正提高效率的原因。 ==知识点提炼== #PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。 #作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数 #在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都尽量不要使用Statement. 参考文档: [1] https://blog.csdn.net/u011024652/article/details/51753481 返回 [[Java程序设计]]
返回至
SQL注入
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息