Java字符串在SQL中被错误地解释

时间:2012-04-14 23:30:45

标签: java sql string sql-injection

有可能的字符串[]; 此数组在运行时动态存储数据库表的列名。并且程序了解运行时可能的大小。 现在把它放在sql查询中。我使用for循环来连接字符串

for(int k=0;k<likely.length;k++)
    {
        temp1="\"+likely["+k+"]+\"='Likely' AND ";
        temp=temp.concat(temp1);                
    }

如果大小为3,则最终温度将为

temp = " "+likely[0]+"='Likely' AND "+
    likely[1]+"='Likely' AND "+
    likely[2]+"='Likely' AND "

现在我将sql查询表示为

sql ="SELECT * FROM PUNE WHERE"+temp+"Arts_And_Museum='Yes'";

但在

期间
ps = con.prepareStatement(sql);

此语句编译为

SELECT * FROM PUNE 
WHERE [+likely[0]+]='Likely' 
AND [+likely[1]+]='Likely' 
AND [+likely[2]+]='Likely' AND Arts_And_Museum='Yes'

经过深入调查后,我得出结论,它将“解释为[或]交替......

结果我收到错误 我该如何解决这个问题?

我运行for循环并准备一个字符串 我正在尝试编写一个sql语法

4 个答案:

答案 0 :(得分:1)

这就是在处理SQL查询时应该使用参数化输入的原因。

// conn refers to your database connection
PreparedStatement stmnt = null;
ResultSet rs = null;
try {
    stmnt = conn.prepareStatement("SELECT * FROM tbl WHERE col > '?'");
    stmnt.setInt(1, 300); //set first parameter to 300
    rs = stmnt.executeQuery();
} catch(Exception ex) {
    System.err.println("Database exception: " + ex.getMessage());
}

答案 1 :(得分:0)

\是保留字符。如果要在字符串中输出引号,请使用\"

所以,这段代码:

temp1="\"+likely["+k+"]+\"='Likely' AND ";

将返回此字符串:

"+likely 1 ]+"='Likely' AND

您的sql似乎正在将"转换为[]

答案 2 :(得分:0)

符号\用于转义。在执行此操作时,您将转义所有前面的字符。

每当您要求数组中的某个项目时,您都可以使用likely[k]访问它,而不需要likey["k"]

这是你应该怎么做的。

temp1="\\"+likely[k]+"\\='Likely' AND ";

答案 3 :(得分:0)

只需更改此行:

temp1="\"+likely["+k+"]+\"='Likely' AND ";

对此:

temp1="\"" + likely[k] + "\"='Likely' AND ";