下面是自己以前初學JDBC時候寫的代碼,存在sql注入漏洞。blackanger 51cto技術博客
不安全因素:statement。。。應該用Preparedstatement來代替statement,這樣我們就可以使用占位符作為實參來定義sql語句,從而避免sql注入的攻擊。blackanger 51cto技術博客
當然也可以用statement,你得注意你的sql的寫法,要是下例肯定不行。還得對url惡意傳入參數進行過濾(SQL元字符處理)。。。這樣就比較麻煩了,而且也無法保證絕對的安全。blackanger 51cto技術博客
我們在用hibernate等框架的時候(hql語句),避免sql注入攻擊也是一樣的,關鍵是不要用string來構造sql語句,不管什么框架,還是純JDBC,只要用Preparedstatement就OK。。。一定要用占位符作為實參來構造sql(或hql)語句。
blackanger 51cto技術博客
blackanger 51cto技術博客
package cn.zhd;
import java.io.*;
import org.apache.log4j.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class LoginDemo {
public void execute(String user,String pass){
boolean foo=false;
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/students","root","");
Statement stam=con.createStatement();
//存在注入攻擊漏洞:select * from login where user='' or'x'='x' or 'x'='' and '1'
ResultSet rs=stam.executeQuery("select * from login where user='" + user + "' and pass='"+ pass + "'");
while(rs.next()){
foo=true;
}
if(foo){
System.out.println("登陸成功");
}
else
{
System.out.println("用戶名密碼錯誤");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}
public static void main(String[] args){
Logger log=Logger.getLogger(LoginDemo.class);
try{
LoginDemo ld=new LoginDemo();
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
log.info("請輸入用戶名");
String bf_str=bf.readLine();
log.info("請輸入密碼");
String bf2_str=bf.readLine();
bf.close();
ld.execute(bf_str,bf2_str);
}catch(IOException e){
e.printStackTrace();
}
}
}
當輸入用戶名的時候輸入:' or 'x'='x' or '2'='
密碼隨便輸.....
成功登陸了吧.....blackanger 51cto技術博客
import java.io.*;
import org.apache.log4j.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class LoginDemo {
public void execute(String user,String pass){
boolean foo=false;
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost/students","root","");
Statement stam=con.createStatement();
//存在注入攻擊漏洞:select * from login where user='' or'x'='x' or 'x'='' and '1'
ResultSet rs=stam.executeQuery("select * from login where user='" + user + "' and pass='"+ pass + "'");
while(rs.next()){
foo=true;
}
if(foo){
System.out.println("登陸成功");
}
else
{
System.out.println("用戶名密碼錯誤");
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}
public static void main(String[] args){
Logger log=Logger.getLogger(LoginDemo.class);
try{
LoginDemo ld=new LoginDemo();
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
log.info("請輸入用戶名");
String bf_str=bf.readLine();
log.info("請輸入密碼");
String bf2_str=bf.readLine();
bf.close();
ld.execute(bf_str,bf2_str);
}catch(IOException e){
e.printStackTrace();
}
}
}
當輸入用戶名的時候輸入:' or 'x'='x' or '2'='
密碼隨便輸.....
成功登陸了吧.....blackanger 51cto技術博客