现在有这样一个表
[code="sql"]create table jaspertb (
id int auto_increment primary key,
name varchar(32),
age int
);[/code]
[code="java"]
String id = "1";
String sql = "select * from jaspertb t where t.id = " + id;
[/code]
[code="java"]
String name= "myname";
String sql = "select * from jaspertb t where t.name= " + name;
[/code]
[code="java"]
Integer age = new Integer(50);
String sql = "select * from jaspertb t where t.age= " + age;
[/code]
上面的SQL是拼出来的,怎么改变id,name,age的值,使这些SQL语句查出这张表的字段啊或者删除数据库里面的内容,或者查出其它内容,就是通常说的SQL注入。。。怎么实现 的啊,谢谢大家了。。。
[b]问题补充:[/b]
那大家看一看这个网页是不是存在SQL注入啊
http://www.zzjinhui.com/jhdt.asp?id=77'
http://www.zzjinhui.com/jhdt.asp?id=77
加了'和没有加'有明显区别
String id = "1 or 1=1 ";
id + = ";" + "任何可执行的sql";//比如:id + = ";" + "delete table";
String sql = "select * from jaspertb t where t.id = " + id;
sql injection,
比如说id吧
id= "12;delete from jaspertb;--"
;-- 是注释掉后面你不知道的sql内容
//查询jaspertb的所有记录;
String id = "1 or 1=1 ";
String sql = "select * from jaspertb t where t.id = " + id;
System.out.println(sql);
很容易的,如果你知道字段的个数就更好了,使用union你想查什么表就查什么表了。
删除和其他的就不多说了。
请不要使用这样拼接的方式,可以使用hibernate提供的传入参数的方法。比如
参数为id
session.createQuery("from User o where o.id=?").setInteger(1,id);
hibernate提供的这样的方法可以防止sql注入,对非法字符串进行过滤。
注入?学习了阿
[size=medium]想拼字符串这种就很好办了
1.比如你要查询这个表的所有内容,你想你在数据库中可以这么查出来你就可以这么拼写。
例如:
String id = "1";
String sql = "select * from jaspertb t where t.id = " + id;
就可以再1的后面拼上 or t.id <> 1 或是 or 1=1(这个条件永远是真的)
其他两种跟这个是一样的啊。
2.想删除修改啊。就更好办了直接在后面加上";delete/update/truncate" 这些语句就可以了。
当然除非你知道表的名称和相关信息什么的。
所以这就是为什么不要用字符串去拼sql语句的原因了[/size]
:D
至于这参数可以封装到MAP里传进来,然后在这个方法中根据关键字从MAP里取值,进行判断
String SQL="select * from jaspertb t where 1=1"
if(id不为空){
SQL=SQL+"t.id = " + id;
}
if(name不为空){
SQL=SQL+"t.name = " + name;
}
if(age不为空){
SQL=SQL+"t.age = " + age;
}
不知道你的意思是不是这样的,仅供参考!!!有可能没明白你的意思
一定要使用preparestatement,不直接拼sql,就没这问题了。
"select * from jaspertb t where t.id = " + id + "and 1=1"
String SQL="select * from jaspertb t where 1=1"
if(id不为空){
SQL=SQL+" and t.id = " + id;
}
if(name不为空){
SQL=SQL+" and t.name = " + name;
}
if(age不为空){
SQL=SQL+" and t.age = " + age;
}
最简单的方法就是在条件后面加入一个永远为真的条件,如
String id = "1 or 1=1";
String sql = "select * from jaspertb t where t.id = " + id;
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'id=77'' 中。
/jhdt.asp,行 406
这不是sql注入啦
只是它通过url传递参数id = 77,他得到id的值,再去跳转到相应的页面
貌似可以进行注入了,不过不是专业的 :cry:
union?真不晓得现在我用得上嘛?