我试图在java中放置一些反SQL注入,但我发现使用"replaceAll"字符串函数非常困难.最终,我需要一个函数来转换任何现有的\\\,任何"\",任何'\',和任何\n\\n,这样当字符串通过MySQL求值时,SQL注入将被阻止.

我用千斤顶顶起了一些我正在使用的代码,函数中的\\\\\\\\\\\个代码都让我眼花缭乱.如果有人碰巧有这样的例子,我将不胜感激.

推荐答案

PreparedStatement是可行的方法,因为它们使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
      }
   }
}

无论名称和邮箱中是什么字符,这些字符都将直接放入数据库中.它们不会以任何方式影响INSERT语句.

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

Java相关问答推荐

当在具有约束布局的AlertDialogue内部使用时,回收器视图布局宽度很奇怪

如何让TaskView总是添加特定的列来进行排序?

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

JPackaged应用程序启动MSI调试,然后启动System. exit()

Java模式匹配记录

我无法将附件发送到NetBeans之外

RichFaces 3.x-Spring Boot-迁移web.xml

Helidon 4和Http API

带错误BER验证的itext8签名返回pdf

Arrays.hashcode(int[])为不同的元素提供相同的散列

SpringBoot Kafka自动配置-适用于SASL_PLAYTEXT的SSLBundle 包,带SCRAM-SHA-512

如何从日期中截取时间并将其传递给组件?

使用htmlunit和java单击按钮

寻找Thread.sky()方法的清晰度

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

如何将RESTAssured';S的Http标题转换为<;字符串、字符串和>的映射?

如何使用Java ZoneID的区域设置?

控制器建议异常处理

如何使用我的RLE程序解决此问题

这是JavaFX SceneBuilder的错误吗?