停止sql注入

时间:2012-04-28 07:25:36

标签: java jdbc sql-injection

如何防止sql注入 我使用下面的代码登录

con = DriverManager.getConnection("", "", "");

Statement  statement = con.createStatement();

ResultSet  rs= statement.executeQuery("SELECT email,pass FROM db_pass where email='" + email + "'and pass='" + password + "'"    );

if (rs.next()) {

    String a=rs.getString(1);
    String b=rs.getString(2);
    rs.close();

它的工作正常但是当它放入(nitin'OR'1'='1)时,用户无需输入有效密码即可访问

4 个答案:

答案 0 :(得分:7)

使用PreparedStatement。您可以在http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

中找到示例

为防止SQL injection所有查询都应进行参数化 永远不应该使用字符串连接来创建动态SQL。

答案 1 :(得分:0)

使用ORM(对象关系映射器)可能是个好主意。 ORM通常具有针对SQL注入的内置防御。

防止sql注入的另一个好方法是使用白名单(即可接受的用户输入列表)。当您收到用户的输入时,请检查它是否在白名单中;如果不是拒绝它。

在您的情况下,您希望获得可能的用户名的白名单和可能的密码的白名单;您可以使用正则表达式描述白名单的用户名和白名单密码。不要自制你自己的正则表达式,但是有很多预先构建的正则表达式可以在线获得。你不想自己创建,因为它的配方容易出错,这使得它很容易被SQL注入。

希望这有帮助,祝你好运!

答案 2 :(得分:-1)

执行此操作的典型且简单的方法是比较散列操作(md5或sha1)的结果。然后查询看起来像

SELECT email, pass from db_pass where md5(email)='" + md5(email) + "' and md5(pass)='" + md5(password) + "'"

但是,这意味着你有一个md5函数可用你正在开发的语言,你的DB-System也有md5函数可用(例如,mysql)。请注意,这不会使SQL注入完全不可能,但对您提供的示例是一个很好的基本保护。

答案 3 :(得分:-1)

你需要转换你的字符串,如果你的字符串是abc'你应该把字符串abc''给sql,如果你的字符串是''。