⑴ Java中如何解决sql 注入漏洞
使用prepareStatement,在用户名那里填?,用set方法往里赋值 追问: 我用statement可以返回结果集,用resultsetmetadata也可以查出返回的列数。用preparedstatement也是一样的。我现在的问题是在那个if语句了对传入的password和结果集中的password比较时出了问题。那不怎样防止注入漏洞呀 回答: 我不是说了吗,用preparestatement可以防止sql注入漏洞,你要在好好想下,你是不是晕为什么么不用比较,因为有查到记录了,返回true,查不到就返回falsh了 追问: 用户名是查到了 如果我数据库有个用户名是admin 密码是123 我用户名admin正确了 但是我还是要比较密码是否是一样的呀 回答: 那你组织sql语句的时候对密码也查询,如果没查到,它连if循环都进不去,给你sql语句select top 1 *from 表名where 用户=?
⑵ java防止SQL注入的几个途径
java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数
01importjava.io.IOException;
02importjava.util.Iterator;
03importjavax.servlet.Filter;
04importjavax.servlet.FilterChain;
05importjavax.servlet.FilterConfig;
06importjavax.servlet.ServletException;
07importjavax.servlet.ServletRequest;
08importjavax.servlet.ServletResponse;
09importjavax.servlet.http.HttpServletRequest;
10importjavax.servlet.http.HttpServletResponse;
11/**
12*通过Filter过滤器来防SQL注入攻击
13*
14*/
{
16privateStringinj_str="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare|;|or|-|+|,";
=null;
18/**
19*?
20*/
21protectedbooleanignore=true;
22publicvoidinit(FilterConfigconfig)throwsServletException{
23this.filterConfig=config;
24this.inj_str=filterConfig.getInitParameter("keywords");
25}
26publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
27FilterChainchain)throwsIOException,ServletException{
28HttpServletRequestreq=(HttpServletRequest)request;
29HttpServletResponseres=(HttpServletResponse)response;
30Iteratorvalues=req.getParameterMap().values().iterator();//获取所有的表单参数
31while(values.hasNext()){
32String[]value=(String[])values.next();
33for(inti=0;i<value.length;i++){
34if(sql_inj(value[i])){
35//TODO这里发现sql注入代码的业务逻辑代码
36return;
37}
38}
39}
40chain.doFilter(request,response);
41}
42publicbooleansql_inj(Stringstr)
43{
44String[]inj_stra=inj_str.split("\|");
45for(inti=0;i<inj_stra.length;i++)
46{
47if(str.indexOf(""+inj_stra[i]+"")>=0)
48{
49returntrue;
50}
51}
52returnfalse;
53}
54}
也可以单独在需要防范SQL注入的JavaBean的字段上过滤:
1/**
2*防止sql注入
3*
4*@paramsql
5*@return
6*/
(Stringsql){
8returnsql.replaceAll(".*([';]+|(--)+).*","");
9}
⑶ java防止sql注入有哪些方法
前台我们可以通过过滤用户输入,后台可以通过PreparedStatement来代替Statement来执行SQL语句。
⑷ java如何防止sql注入
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可: String sql= "select * from users where username=?; PreparedStatement preState = conn.prepareStatement(sql); preState.setString(1, userName); preState.setString(2, password); ResultSet rs = preState.executeQuery();
⑸ java中preparedstatement为什么可以防止sql注入
不知道楼主用没有用过
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
把其中passwd换成 [' or '1' = '1] 这样就可以完成sql注入
更有可能对你的数据库表drop操作
如果使用preparedstatement的话就可以直接使用预编译,PreparedStatement不允许在插入时改变查询的逻辑结构.
举例
statement
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
passwd就可以换成 ‘ or '1'='1
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
preparedstatement
select * from tab_name where name=? and passwd=? ;
PreparedStatement pst = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, passwd);
ResultSet rs = pstmt.executeQuery();
⑹ java拼接sql怎么防止注入
使用Hibernate框架的SQL注入防范 Hibernate是目前使用最多的ORM框架,在Java Web开发中,很多时候不直接使用JDBC,而使用Hibernate来提高开发效率。
在Hibernate中,仍然不应该通过拼接HQL的方式,而应使用参数化的方式来防范SQL注入。有两种方式,一种仍然是使用JDBC一样的占位符“?”,但更好的方式是使用Hibernate的命名参数,例如检测用户名和密码是否正确,使用Hibernate可以写成:
String queryStr = “from user where username=:username ”+”password=:password”;
List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();
⑺ 求用java编写带界面的SQL注入检测程序
程序没有,不过以前做过这方面的一些研究,给你总结了一下。一般来说有这些种,楼主可以根据这些来写测试语句。
1.没有正确过滤转义字符
在用户的输入没有为转义字符过滤时,就会发生这种形式的注入式攻击,它会被传递给一个SQL语句。这样就会导致应用程序的终端用户对数据库上的语句实施操纵。比方说,下面的这行代码就会演示这种漏洞:
statement := "SELECT * FROM users WHERE name = '" + userName + "'; "
这种代码的设计目的是将一个特定的用户从其用户表中取出,但是,如果用户名被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不仅仅是代码的作者所期望的那样了。例如,将用户名变量(即username)设置为:
a' or 't'='t,此时原始语句发生了变化:
SELECT * FROM users WHERE name = 'a' OR 't'='t';
如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。
在一些SQL服务器上,如在SQLServer中,任何一个SQL命令都可以通过这种方法被注入,包括执行多个语句。下面语句中的username的值将会导致删除“users”表,又可以从“data”表中选择所有的数据(实际上就是透露了每一个用户的信息)。
a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%
这就将最终的SQL语句变成下面这个样子:
SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';
其它的SQL执行不会将执行同样查询中的多个命令作为一项安全措施。这会防止攻击者注入完全独立的查询,不过却不会阻止攻击者修改查询。
2.Incorrect type handling
如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:
statement := "SELECT * FROM data WHERE id = " + a_variable + "; "
从这个语句可以看出,作者希望a_variable是一个与“id”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将a_variable设置为:1; DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成:SELECT * FROM DATA WHERE id = 1; DROP TABLE users;
3.数据库服务器中的漏洞
有时,数据库服务器软件中也存在着漏洞,如MYSQL服务器中mysql_real_escape_string()函数漏洞。这种漏洞允许一个攻击者根据错误的统一字符编码执行一次成功的SQL注入式攻击。
4.盲目SQL注入式攻击
当一个Web应用程序易于遭受攻击而其结果对攻击者却不见时,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字节而精心构造一个新的语句。但是一旦漏洞的位置和目标信息的位置被确立以后,一种称为Absinthe的工具就可以使这种攻击自动化。
5.条件响应
注意,有一种SQL注入迫使数据库在一个普通的应用程序屏幕上计算一个逻辑语句的值:
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=1
这会导致一个标准的面面,而语句
SELECT booktitle FROM booklist WHERE bookId = 'OOk14cd' AND 1=2在页面易于受到SQL注入式攻击时,它有可能给出一个不同的结果。如此这般的一次注入将会证明盲目的SQL注入是可能的,它会使攻击者根据另外一个表中的某字段内容设计可以评判真伪的语句。
6.条件性差错
如果WHERE语句为真,这种类型的盲目SQL注入会迫使数据库评判一个引起错误的语句,从而导致一个SQL错误。例如:
SELECT 1/0 FROM users WHERE username='Ralph'。显然,如果用户Ralph存在的话,被零除将导致错误。
7.时间延误
时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。
⑻ java防止SQL注入的问题
"select * from where uname=? and upass=?"; select * from 表名,你的表名呢?没表名就直接where?
⑼ 用java编写防止SQL注入!求java高手指点!问题解决后,一定提高悬赏!
SQL注入无非就是把对单引号和双"-"进行转换。
最好不要拼装SQL语句,以使用参数化的sql或者直接使用存储过程进行数据查询存取。
⑽ 用java PreparedStatement就不用担心sql注入了吗
SQL Injection:是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
select * from tab_name where name= '"+name+"' and passwd='"+passwd+"';
把其中passwd换成 [' or '1' = '1] 这样就可以完成sql注入
PreparedStatement 对象用于执行带或不带参数的预编译 SQL 语句
PreparedStatement 不允许在不同的插入时间改变查询的逻辑结构,所以这种注入方式无效