sql准备语句不起作用

时间:2013-06-02 18:46:04

标签: android sql code-injection prepare

我正在努力解决这个问题,我出于某种原因无法解决这个问题。

Connection conn = null;

PreparedStatement ps = null;                                        
String query = "INSERT INTO " + "tags" + "(Name, Income, Expense) VALUES(?,?,?)";
ps = conn.prepareStatement(query);
ps.setString(1, tag);
ps.setString(2, amount_);
ps.setString(3, "0");
ps.executeQuery();

Tag是来自用户输入的字符串,用户仍然可以发送SQL注入!为什么?? 我也收到了这个Eclipse错误:Null pointer access: The variable conn can only be null at this location

1 个答案:

答案 0 :(得分:0)

您的数据库连接尚未初始化。在创建预准备语句之前,您需要DriverManager类来获取数据库连接。

如果用户提供“标签”,您的SQL仍然可能容易受到注入攻击,因为用户可以指定其他SQL操作而不是表名。例如,如果用户输入:

"users (Name, Income, Expense) VALUES('','',''); drop table accounts; INSERT INTO users ;"

作为“tags”的值,用户可以在users表中插入一个额外的行并删除accounts表。您需要将“标签”作为预准备语句的一部分,将“标签”替换为“?”并使用setString分配值。