2

如何防止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

4 回答 4

7

使用PreparedStatement. 您可以在http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html中找到一个示例

为防止SQL 注入,所有查询都应参数化,并且永远不应使用字符串连接来创建动态 SQL。

于 2012-04-28T07:26:52.480 回答
0

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

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

就您而言,您希望拥有可能的用户名白名单和可能的密码白名单;您可以使用正则表达式描述用户名白名单和密码白名单。不过,不要自制自己的正则表达式,网上有很多预先构建的正则表达式。您不想自己制作,因为它的公式很容易出错,从而使其容易受到 SQL 注入的影响。

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

于 2012-04-28T07:36:00.010 回答
-1

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

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

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

于 2012-04-28T07:30:23.687 回答
-1

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

于 2012-04-28T07:40:27.403 回答