mysql 防止依赖注入

本文探讨了参数注入问题及其在Java代码中的实例,重点介绍了如何通过PreparedStatement预防止SQL注入,提供正确使用占位符和字符串连接的安全示例。还提及了JDBC限制和表名参数化的挑战。
摘要由CSDN通过智能技术生成

参数注入

  • 导致注入
String name = request.getParameter("name");
String query = String.format("SELECT account_balance FROM user_data WHERE user_name ='%s'", "table_a");
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, name);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    String id = rs.getString("id");
}
  • 预防注入
String name = "table_a";
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString( 1, name);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    String id = rs.getString("id");
}

表名注入

String tableName = "table_A";
PreparedStatement ps = dataSource.getConnection().prepareStatement("show full columns from ?");
ps.setString(1, tableName);
ResultSet rs = ps.executeQuery();   

JDBC 不支持以表名作为 paramter,这里会报语法错误,因为生成的 sql 是 show full columns from ‘table_A’’’。
在这里插入图片描述
同理,这些都不行,prepared statements only allow parameters to be bound for “values” bits of the SQL statement.
参考:https://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement

CREATE DATABASE IF NOT EXISTS ?
SELECT * FROM ? 

like 参数注入

  • 错误方式
String idValue = "100";
String sql = "SELECT * FROM flink_test_dst WHERE name LIKE '%?%'";
PreparedStatement ps = dataSource.getConnection().prepareStatement(sql);
ps.setObject(1, idValue);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    String id = rs.getString("id");
    System.out.println("id: " + id);
}

这样会导致 PreparedStatement 认为没有参数。ps.setObject(1, idValue); 失败。

  • 正确方式
String idValue = "%" + "100" + "%";
String sql = "SELECT * FROM flink_test_dst WHERE name LIKE ?";
PreparedStatement ps = dataSource.getConnection().prepareStatement(sql);
ps.setObject(1, idValue);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    String id = rs.getString("id");
    System.out.println("id: " + id);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值