mysql prepare 防注入_mysql-preparestatement防止sql注入

项目中--遇到类似问题。

一、什么是sql注入?

先举个栗子:用户登录

SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'

注入之后:SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'

可以看到注入后可以免密码登录。

相信上面的例子已经可以让你明白sql注入的危害了。下面是概念--(抄袭==)

SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。

而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。

二、字符串拼接的sql?

上面的sql问题是直接使用了字符串拼接导致的,导致出现了漏洞。

三、preparestatement?

(一)优势?

preparestatement是执行sql查询的api:1、mysql会预先编译好,缓存下来以便下次重复使用;2、可以避免大部分sql注入(欢迎补充)

(二)如何避免sql注入?(贴代码了)

String sql = "SELECT * FROM EMPLOYEE WHERE ID = ?";

Connection conn= null;try{

conn=dataSource.getConnection();

PreparedStatement ps=conn.prepareStatement(sql);

ps.setInt(1, id);

Employee employee= null;

ResultSet rs=ps.executeQuery();if(rs.next()) {

employee= newEmployee(

rs.getInt("ID"),

rs.getString("NAME"),

rs.getInt("AGE")

);

}

rs.close();

ps.close();returnemployee;

}catch(SQLException e) {throw newRuntimeException(e);

}finally{if (conn != null) {try{

conn.close();

}catch (SQLException e) {}

当然,如果使用mybatis,就可以省去这些工作了。

其他问题:

1、对order by之类的,怎么使用preparestatement呢?

解答:结合stringformat使用,先替换掉%s之类的。

参考:

好的,我可以为您解答JDBC连接MySQL并进行增删改查操作的问题。 首先,您需要确保已经安装了MySQL数据库和Java开发环境。然后,您需要下载MySQL提供的JDBC驱动程序,将其添加到您的Java项目中。 接下来,您可以使用以下代码示例来连接MySQL数据库并进行增删改查操作: ``` import java.sql.*; public class JdbcExample { public static void main(String[] args) throws SQLException { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 连接到数据库 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); // 执行查询操作 pstmt = conn.prepareStatement("SELECT * FROM mytable"); rs = pstmt.executeQuery(); while (rs.next()) { // 处理查询结果 String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("Name: " + name + ", Age: " + age); } // 执行插入操作 pstmt = conn.prepareStatement("INSERT INTO mytable (name, age) VALUES (?, ?)"); pstmt.setString(1, "John"); pstmt.setInt(2, 30); int rows = pstmt.executeUpdate(); System.out.println(rows + " row(s) inserted."); // 执行更新操作 pstmt = conn.prepareStatement("UPDATE mytable SET age = ? WHERE name = ?"); pstmt.setInt(1, 31); pstmt.setString(2, "John"); rows = pstmt.executeUpdate(); System.out.println(rows + " row(s) updated."); // 执行删除操作 pstmt = conn.prepareStatement("DELETE FROM mytable WHERE name = ?"); pstmt.setString(1, "John"); rows = pstmt.executeUpdate(); System.out.println(rows + " row(s) deleted."); } catch (SQLException e) { e.printStackTrace(); } finally { if (rs != null) { rs.close(); } if (pstmt != null) { pstmt.close(); } if (conn != null) { conn.close(); } } } } ``` 在这个代码示例中,我们首先使用`DriverManager.getConnection()`方法连接到MySQL数据库,然后使用`PreparedStatement`对象执行查询、插入、更新和删除操作。最后,我们使用`ResultSet`对象处理查询结果,使用`SQLException`对象处理异常,使用`close()`方法关闭数据库连接、语句和结果集。 当然,在实际开发中,您需要根据自己的需求进行适当的修改和优化。希望这个示例可以帮助您理解如何使用JDBC连接MySQL并进行增删改查操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值