代码之家  ›  专栏  ›  技术社区  ›  Rakesh Juyal

使用preparedStatement是否意味着不会有任何SQL注入?

  •  10
  • Rakesh Juyal  · 技术社区  · 16 年前

    我读过,为了防止SQL注入,必须使用PreparedStatement。
    这是否意味着如果我使用perparedStatement,那么没有人可以在我的任何页面中执行SQL注入?它对SQL注入是万无一失的吗?如果没有,请举例说明。

    5 回复  |  直到 12 年前
        1
  •  10
  •   T.J. Crowder    16 年前

    只要您实际使用的是prepared语句的参数替换特性(可能会误用它们,而不使用该特性),并且前提是您使用的prepared语句库中没有bug,那么您应该可以抵抗原始SQL注入。但这并不意味着你不应该对用户给你的任何东西抱有怀疑。:-)

        2
  •  4
  •   Your Common Sense    16 年前

    准备好的语句不包括查询标识符和运算符的非数据部分。
    因此,如果其中一些是可变的,并且直接添加到查询中,则可以进行注入。

    由于可能的选项数量有限,所有变量标识符都应该根据用户输入从预先编写的变量中选择。操作员也一样。
    不应将用户输入直接添加到查询中。

        3
  •  3
  •   Moo    16 年前

    你 不是唯一使用实现的人。使用同一个实现的人越多,意味着发现和消除bug的机会就越大——如果你使用自己的实现,那么只有你才能找到并修复bug。

        4
  •  2
  •   Faisal Feroz    16 年前

    尽管准备好的语句有助于防范SQL注入,但也有可能通过不适当地使用准备好的语句而受到SQL注入攻击。

    String strUserName = request.getParameter("Txt_UserName"); 
    PreparedStatement prepStmt = con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");
    

        5
  •  2
  •   Vetle    16 年前

    简短回答:是的,如果使用得当。

    然而,这并不意味着JDBC驱动程序中就不会有bug,从而为SQL注入打开了大门。当我为我工作的一家公司调查这个问题时,我发现在我们使用的一个JDBC驱动程序(PostgreSQL)中确实存在SQL注入错误。这是几年前的事了,这个错误被修复了。

    虽然我不记得细节,但我记得我看过JDBC实现的源代码,看到它是用字符串连接实现的。

    不过,我希望这种情况很少发生,我的建议是信任实现并正确使用PreparedStatements。

    推荐文章