好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Statement的sql注入问题 - 网站安全 - 自学php

SQL注入,PreparedStatement和Statement * 在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。 * PreperedStatement(从Statement扩展而来)相对Statement的优点:       1.没有SQL注入的问题。       2.Statement会使 数据库 频繁编译SQL,可能造成数据库缓冲区溢出。       3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。

SQLInject.java

  package cn.itcast.jdbc;   import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;   public class SQLInject {       /**      * @param args      * @throws SQLException      */     public static void main(String[] args) throws SQLException {           //read1("admin");         read1("' or 1 or '");       }       static void read1(String userid) throws SQLException {         Connection conn = null;         Statement st = null;         ResultSet rs = null;         try {             // 2.建立连接             conn = JdbcUtils.getConnection();             // conn = JdbcUtilsSing.getInstance().getConnection();               // 3.创建语句             String sql = "select id, userid, uname, loginip from dede_admin where userid='"                     + userid + "'";             // 这种方式也可以查,但是不严谨,比如执行read("' or 1 or '")就会把所有结果都查出来             // or是 mysql 的关键字, 1是真, 所以通过拼串这种方式是很不安全的,因为参数是别人传进来的,             // 这样我们的 系统 就存在安全的隐患了。就比如登录的时候,密码随便写一个             // 出现这种问题是由于单引号引起的,把单引号替换掉是一种处理方式,但是有时候单引号是保留字,             // 有时候双引号是保留字,有时候反引号是保留字,这样过滤起来就没完没了,这样处理,             // 就算你能保证现在能正常运行,但也不能保证以后能正常运行,或者说不能保证换个数据库能正常运行,             // 那么这些关键字谁最清楚呢? 应该是数据库生产厂商最清楚,而在我们代码里?谁最清楚呢?             // 驱动最清楚,因为驱动是数据库生产厂商生产的,所以驱动肯定清楚             // 那我们的解决思路是我们不去进行过滤的工作,交给数据库驱动去干这件事情。               System.out.println("sql=" + sql);             st = conn.createStatement();             // 4.执行语句             rs = st.executeQuery(sql);               // 5.处理结果             while (rs.next()) {                 System.out.println(rs.getObject("id") + "\t"                         + rs.getObject("userid") + "\t" + rs.getObject("uname")                         + "\t" + rs.getObject("loginip"));             }         } finally {             JdbcUtils.free(rs, st, conn);         }     }   }

查看更多关于Statement的sql注入问题 - 网站安全 - 自学php的详细内容...

  阅读:45次