日期:2014-05-18  浏览次数:20571 次

小漏洞;
我用这句话来验证:
select   *   from   usertab   where   id= "   '+id+ '   "and   pwd= "   '+pwd+ '   ";
但是某些书上说,如果在密码框输入这个串:
"   'or ' '1 '= '1 '   "
服务器就得到这样的一句话:
select   *   from   usertab   where   id= '+id+ 'and   pwd= ' 'or     '1 '= '1 '
结果就通过了。
精英们有何高见?如何防冶?


------解决方案--------------------
算是sql的漏洞吧~~N年前就有了。
一般叫做sql的注入式攻击。
防范的方法很多。
1不采用这样的写法,通过占位符执行sql。
2用正则屏蔽特殊符号。
3尽量不要用url传递参数。
。。。 。。。等等
------解决方案--------------------
关键在于不要使用“拼凑式”的组成sql语句!!在jsp中,是采用PreparedStatement(睁大眼睛看清楚这个单词是怎么写的!)
prestmt = conn.prepareStatement(sql);(再睁大眼睛看清楚它是怎么赋值的,特别注意单词的不一样,一个PreparedStatement,一个是
prepareStatement)
------------------------------------------
<%@ page contentType= "text/html; charset=UTF-8 " %>
<%@ page import = "java.io.* " %>
<%@ page import= "java.sql.* "%>
<%@ page import = "java.util.* "%>
<html>
<body background= "LoginBackgroundTile.gif ">
<%!
String url= "jdbc:mysql://192.168.0.10:3306/maintainplatform ";
String user= "root ";
String password= "root ";
Connection conn;
String sql;
ResultSet rs;
String userId ;
String userPassword;
PreparedStatement prestmt;
%>
<%
userId = request.getParameter( "userId ");
userPassword = request.getParameter( "userPassword ");
out.println(userId);
out.println(userPassword);
sql = "select * from usertable where UserId = ? and Password = ? ";
int count = 0;
try
{
Class.forName( "org.gjt.mm.mysql.Driver ").newInstance();
conn= DriverManager.getConnection(url,user,password);
prestmt = conn.prepareStatement(sql);
prestmt.setString(1,userId);
prestmt.setString(2,userPassword);
rs = prestmt.executeQuery();
while(rs.next())
{
count++;
}
%>
<% if (count > 0)
{
out.print( "验证成功! ");
session.setAttribute( "username ",userId);
%>
<% response.sendRedirect( "a/Connectmysql.jsp "); %>
<%
}
else
{%>
<center> <font color = "red "> <%out.println( "用户名或密码错误 ");%> </font>
<a href = "login.jsp "> <font color = "red "> try it again </font> </a> </center>
<% }
}
catch (SQLException ex) {
System.out.println( "SQLException: " + ex.getMessage());
System.out.println( "SQLState: " + ex.getSQLState());
System.out.println( "VendorError: " + ex.getErrorCode());
}
%> <br>
<%rs.close();
prestmt.close();
conn.close();
%>
</body>
</html>
--------------------------------------
作为对比,以下是不安全的的写法
<%@ page contentType= "text/html; charset=UTF-8 " %>
<%@ page import = "java.io.* " %>
<%@ page import= "java.sql.* "%>