JDBC学习之路(三)防止SQL注入,PreparedStatement探索

来源:互联网 发布:终南山 知乎 编辑:程序博客网 时间:2024/06/06 02:00

   现在登录注册或者其他很多地方遇到用户输入的内容可以直接拿到数据库内部去进行执行SQL语句,这个是一项很危险的运动,因为你不知道用户会输入什么,如果用户对SQL语句很熟悉,他就可以在输入的时候加上''两个冒号作为特殊字符,这样的话会让计算机认为他输入的是SQL语句的关键字从而改变你的SQL语句,照成不可估量的损失,下面介绍防止此类事情发生的代码

   

package com.bird.jdbc;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;/** * @use1 preparedStatement可以做一些预处理工作,将特殊字符去除,保证查询安全 * @use2 比起Statement速度更快 * @use3 单次测试不好说,但是多次运行还是PreparedStatement运行块的 * @author bird * */public class SQLInsert {//使用PreStatement防止SQL注入攻击public static void read(String num) throws Exception{Connection conn = null;PreparedStatement pt = null;ResultSet rs = null;try{conn = JdbcUtil.getConnecttion();//建立连接String sql = "select * from niao where password = ?";//问号代替numpt = conn.prepareStatement(sql);//创建语句pt.setString(1, num);rs = pt.executeQuery();//执行语句while(rs.next()){//得到数据System.out.println(rs.getObject("username")+"\t"+rs.getObject("password")+"\t"+rs.getObject("keywords")+"\t"+rs.getObject("userkeywords1")+"\t"+rs.getObject("time1")+"\t"+rs.getObject("userkeywords2")+"\t"+rs.getObject("time2")+"\t");}}finally{JdbcUtil.free(rs, pt, conn);}}public static void main(String [] args) throws Exception{read("123");
              //read("' or 2 or'");这句话包含了两个单引号,会让计算机认为是SQL关键字很危险}}

1.PreparedStatement是继承自Statement, 可以说Statement能做的事情他都能做。

2.PreparedStatement可以对你输入的SQL语句进行预处理,删除那些特殊字符和危险

字符,非常有好处,给开发者帮助

3.PreparedStatement对SQL执行进行了优化,对于多次大量的SQL查询,效率要比Statement快的很多,建议能用它就用他