2012-02-08 18 views
4

現在、mySQLデータベースから特定の項目を選択する際に問題が発生しています。私のプログラムはアンドロイドアプリケーションからサーブレットにパラメータを渡すように設計されています。mySQLエラーが発生しました。不明なカラムwhere句

がしかし、エラーがコンソールウィンドウに表示されます:中 不明な列「0102310c24」「where句」

私が選択する値は、文字が含まれている唯一のエラーがあります。

この番号0106172459を照会すると、問題なく返されたデータが返されます。

以下は私のサーブレットです。

import java.io.*; 
import java.util.*; 
import javax.sql.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
public class DBServlet extends HttpServlet { 
public void service(HttpServletRequest request,HttpServletResponse response) 
throws IOException, ServletException{ 
response.setContentType("text/html"); 
PrintWriter out = response.getWriter(); 
String x=request.getParameter("item"); 
Connection con = null; 
Statement stmt = null; 
ResultSet rs = null; 
try { 
Class.forName("com.mysql.jdbc.Driver"); 
con =DriverManager.getConnection ("jdbc:mysql://IP/databasename", "username", "password"); 
stmt = con.createStatement(); 
rs = stmt.executeQuery("SELECT * FROM items WHERE item="+x); 
// displaying records 
while(rs.next()){ 
out.print(rs.getObject(1).toString()); 
out.print(","); 
out.print(rs.getObject(2).toString()); 
out.print(","); 
out.print(rs.getObject(3).toString()); 
out.print(","); 
out.print(rs.getObject(4).toString()); 
out.print(","); 
out.print(rs.getObject(5).toString()); 
out.print(","); 
out.print(rs.getObject(6).toString()); 
out.print(","); 
out.print(rs.getObject(7).toString()); 
out.print(","); 
out.print(rs.getObject(8).toString()); 
out.print(","); 
out.print("\n"); 
} 
} catch (SQLException e) { 
throw new ServletException("Servlet Could not display records.", e); 
} catch (ClassNotFoundException e) { 
throw new ServletException("JDBC Driver not found.", e); 
} finally { 
try { 
if(rs != null) { 
rs.close(); 
rs = null; 
} 
if(stmt != null) { 
stmt.close(); 
stmt = null; 
} 
if(con != null) { 
con.close(); 
con = null; 
} 
} catch (SQLException e) {} 
} 
out.close(); 
} 
} 

これを使用してサーブレットに値を送信します。

List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); 
nameValuePair.add(new BasicNameValuePair("item","List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(); 
nameValuePair.add(new BasicNameValuePair("item","010238a2cc"));")); 

誰が

答えて

11

xを助けることができれば、私は感謝するだろうが、引用符で囲む必要があり、または非数値列ではなく、文字列リテラルを参照すると仮定されるだろう。スクリプトが値xとして、SQLインジェクションの脆弱性であるように思われる

rs = stmt.executeQuery("SELECT * FROM items WHERE item='"+x + "'"); 

注意がエスケープされていないが、Requestから受信しました。ここで準備されたステートメントを使用する方が良いでしょう。

+0

完璧、それは非常にマイナーなものだったことを知っていた。ご協力いただきありがとうございます。また、準備されたステートメントの使用について提案した他の提案も見ていきます。再度、感謝します。 – user1128488

0

項目が文字列型の場合、引用符で囲む必要があります。クエリを実行するには、PreparedStatementを使用する必要があります。

2

PreparedStatementを使用してください。

PreparedStatement st = con.prepareStatement("SELECT * FROM items WHERE item=?"); 
st.setString(1,x); 
rs = st.executeQuery(); 
0

値xは、次のコードを使用整数である場合: - のRS = stmt.executeQueryは(+ X "の項目=項目SELECT * FROM")。 値xが文字列の場合は、次のコードを使用します。 - rs = stmt.executeQuery( "SELECT * FROM items where item = '" + x "'");

関連する問題