Statement的sql注入问题

简介: SQL注入,PreparedStatement和Statement* 在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。
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); 
        } 
    } 
 
}
目录
相关文章
|
1月前
|
SQL 监控 安全
SQL注入的实现原理以及防止
SQL注入的实现原理以及防止
|
1月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
8天前
|
SQL 安全 Go
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
在Python Web开发中,确保应用安全至关重要,主要防范SQL注入、XSS和CSRF攻击。措施包括:使用参数化查询或ORM防止SQL注入;过滤与转义用户输入抵御XSS;添加CSRF令牌抵挡CSRF;启用HTTPS保障数据传输安全;实现强身份验证和授权系统;智能处理错误信息;定期更新及审计以修复漏洞;严格输入验证;并培训开发者提升安全意识。持续关注和改进是保证安全的关键。
17 0
|
16天前
|
SQL 安全 PHP
CTF--Web安全--SQL注入之Post-Union注入
CTF--Web安全--SQL注入之Post-Union注入
|
25天前
|
SQL 关系型数据库 MySQL
java.sql.SQLException: No operations allowed after statement closed.
java.sql.SQLException: No operations allowed after statement closed.
25 0
|
1月前
|
SQL 安全 测试技术
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
如何在 Python 中进行 Web 应用程序的安全性管理,例如防止 SQL 注入?
15 0
|
1月前
|
SQL 安全 API
|
2月前
|
SQL JSON 数据库
常见的sql注入类型闭合及符号
常见的sql注入类型闭合及符号
31 0
|
2月前
|
SQL 数据库 数据安全/隐私保护
sql注入碰到加密数据怎么办
sql注入碰到加密数据怎么办
19 1
|
2月前
|
SQL 数据库
SQL注入基础(报错注入及延时注入)
SQL注入基础(报错注入及延时注入)
22 0