Java - 转义字符串以防止 SQL 注入

新手上路,请多包涵

我试图在 java 中放置一些反 sql 注入,但发现很难使用“replaceAll”字符串函数。 Ultimately I need a function that will convert any existing \ to \\ , any " to \" , any '\' 和任何 \n\\n 以便当字符串被 MySQL SQL 注入评估时将被阻止。

我已经提取了一些我正在使用的代码,函数中的所有 \\\\\\\\\\\ 让我眼花缭乱。如果有人碰巧有这方面的例子,我将不胜感激。

原文由 Scott Bonner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 805
2 个回答

PreparedStatements 是要走的路,因为它们使 SQL 注入变得不可能。这是一个将用户输入作为参数的简单示例:

 public insertUser(String name, String email) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try {
      conn = setupTheDatabaseConnectionSomehow();
      stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
      stmt.setString(1, name);
      stmt.setString(2, email);
      stmt.executeUpdate();
   }
   finally {
      try {
         if (stmt != null) { stmt.close(); }
      }
      catch (Exception e) {
         // log this error
      }
      try {
         if (conn != null) { conn.close(); }
      }
      catch (Exception e) {
         // log this error
      }
   }
}

不管name和email是什么字符,这些字符都会直接放到数据库中。它们不会以任何方式影响 INSERT 语句。

不同的数据类型有不同的设置方法——您使用哪种方法取决于您的数据库字段是什么。例如,如果数据库中有一个 INTEGER 列,则应使用 setInt 方法。 PreparedStatement 文档 列出了可用于设置和获取数据的所有不同方法。

原文由 Kaleb Brasee 发布,翻译遵循 CC BY-SA 3.0 许可协议

防止 SQL 注入的唯一方法是使用参数化 SQL。根本不可能构建一个比那些以破解 SQL 为生的人更聪明的过滤器。

因此,对所有输入、更新和 where 子句使用参数。动态 SQL 只是为黑客敞开大门,其中包括存储过程中的动态 SQL。参数化,参数化,参数化。

原文由 Cylon Cat 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题