前天有人问我说,我知道用Statement可能会产生注入问题,但是啥是注入问题?其实我知道他了解过,但是现在忘记了…..
谁说不是呢,我也是有些遗忘了,我就知道如果在sql语句后直接拼接条件,是可能产生注入问题 ,当然了如果你设置的条件是你想要,肯定不会出现注入问题的
话不多说,既然说到了注入问题,就去看看这个传说中的“注入问题”….
先让问题暴露出来,看下面的代码:
现在是这样,假设现在我的库里的数据是这样的:
1 黄药师 1900-1-1 400
2 黄晓明 1920-1-1 800
public class StatementTest{
public static void create(){
Connection con = null;
Statement st = null;
try{
con =
st = con.createStatement();
String sql = "insert into users(name, birthday, money) values('周伯通', '1900-1-1', 300)";
st.execute(sql);
System.out.println("存入成功!");
}catch(Exception e){
e.printStackTrace();
}finally{
}
public static void read(String uid){
Connection con = null;
Statement st = null;
ResultSet rs = null;
try{
con =
st = con.createStatement();
String sql = "select * from users where uid =" + uid;
st.execute(sql);
rs = st.getResultSet();
while(rs.next()){
System.out.print(rs.getObject(1) + "\t");
System.out.print(rs.getObject(2) + "\t");
System.out.print(rs.getObject(3) + "\t");
System.out.print(rs.getObject(4) + "\t");
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
}
public static void main(String[] args){
create();
read("1 or 1 < 2");
}
}
这个时候,查询到的结果是全部:
1 黄药师 1900-1-1 400
2 黄晓明 1920-1-1 800
3 周伯通 1900-1-1 300
可以看出,传入的参数中,包含了sql代码! 这个代码会让条件失效!
解决方法:以后再也不要使用Statement了。取而代之使用java.sql.PreparedStatement!
public static void read(String uid){
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try{
con =
String sql = "select * from users where uid = ?";
ps = con.prepareStatement(sql);
ps.setString(1,Integer.parseInt("uid"));
ps.executeQuery();
rs = ps.getResultSet();
while(rs.next()){
System.out.print(rs.getObject(1) + "\t");
System.out.print(rs.getObject(2) + "\t");
System.out.print(rs.getObject(3) + "\t");
System.out.print(rs.getObject(4) + "\t");
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
再在main方法里调用 read(“1 or 1 < 2”)时,就会报错了,通过PrepareStatement预处理语句,将不合理的条件过滤掉,解决了注入问题。
所以以后就把createStatement舍弃吧,也尽量不要在sql语句后面直接拼接条件。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
### 如何解决SQL注入问题:全面解析与防范策略 #### SQL注入概述 SQL注入是一种常见的安全漏洞,攻击者通过在应用程序的输入字段中插入恶意SQL语句,利用这些语句来操控数据库,获取未授权的数据访问,修改或破坏...
prepareStatement和Statement的区别 prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要...
2. **性能指标**:Statement Tracer提供详细的性能指标,如执行时间、调用次数、缓冲区命中率等,这些指标有助于定位性能问题的关键点。 3. **计划分析**:通过显示执行计划,工具可以帮助用户理解查询如何在数据库...
在 Statement 对象中,如果用户输入的数据包含恶意代码,例如 Drop 表名,可能会导致数据库安全问题。而PreparedStatement对象则可以避免这种情况,因为它将用户输入的数据作为参数传入,而不是将其直接嵌入到SQL...
4.创建`Statement` (此处存在SQL注入问题) 5.执行SQL 6.解析查询对象`ResultSet` 7.关闭连接 `ResultSet 、Statement 、Connection` 3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2....
hsbc statement template
当遇到数据库性能问题时,Statement Tracer可以提供详细的诊断报告,包括慢查询列表、锁等待、事务状态等,帮助快速定位问题根源。 6. 优化建议: 针对捕获的SQL语句,Statement Tracer可能还会给出优化建议,...
2. Prepared Statement:使用 Prepared Statement 来防止 SQL 注入攻击。 3. LIMIT 和 OFFSET:使用 LIMIT 和 OFFSET 限制查询结果,防止敏感数据泄露。 4.Least Privilege:使用最小权限原则,限制数据库用户的权限...
"Statement Tracer for Oracle"是一个专门针对Oracle数据库的代码跟踪工具,它帮助开发者和DBA深入分析SQL语句的执行情况,从而提高数据库性能和解决问题。 Statement Tracer for Oracle的主要功能包括: 1. **...
而使用Statement时,SQL注入是一个常见的安全漏洞,因为直接将外部输入拼接到SQL语句中,容易被恶意用户利用。 其次,PreparedStatement有助于提升代码的可读性和可维护性。当SQL语句中带有多个参数时,使用...
在实际应用中,Statement Tracer for ADO可以帮助我们解决以下问题: - **调试复杂逻辑**:当数据库操作隐藏在多层函数调用中时,通过追踪SQL语句,我们可以快速定位问题所在。 - **性能瓶颈查找**:通过查看执行...
2. Prepared Statement:使用 Prepared Statement 来防止恶意输入。 3. 参数化查询:使用参数化查询来防止恶意输入。 4. 输入过滤:对用户输入进行过滤,防止恶意输入。 5. 数据库权限控制:对数据库权限进行控制,...
在Oracle数据库管理中,"statement_tracer_for_oracle"是一个重要的工具,主要用于追踪SQL语句的执行情况,以便于在程序运行时收集信息并进行问题分析。这个工具可以帮助数据库管理员和开发人员深入理解数据库的运行...
Java 防止 SQL 注入是一个至关重要的安全问题,SQL 注入攻击是最常见的攻击方式之一,它不是利用操作系统或其他系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了 SQL 的空子。因此,在系统开发...
* Prepared Statement:使用预编译语句来防止SQL注入。 * Web应用程序防火墙:使用WAF来防御SQL注入。 常见问题 SQL注入中常见的问题包括: * bp抓包时不能用127.0.0.1 * 多种方式注入最好不用延时注入 * 使用...
"引入mybatis-plus报Invalid bound statement错误问题的解决方法" Mybatis-Plus是一个基于Mybatis的增强工具,旨在简化开发效率。然而,在使用Mybatis-Plus时,可能会遇到各种问题,例如Invalid bound statement...
如果使用 PreparedStatement 来代替 Statement 来执行 SQL 语句,其后只是输入参数,SQL 注入攻击手段将无效。这是因为 PreparedStatement 不允许在不同的插入时间改变查询的逻辑结构,大部分的 SQL 注入已经挡住了...