首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于防止SQL注入的Java转义字符串

用于防止SQL注入的Java转义字符串
EN

Stack Overflow用户
提问于 2009-11-29 00:11:14
回答 11查看 283.1K关注 0票数 156

我正在尝试在java中加入一些反sql注入,但我发现使用"replaceAll“字符串函数非常困难。最终,我需要一个函数,它可以将任何现有的\转换为\\,将任何"转换为\",将任何'转换为\',以及将任何\n转换为\\n,这样当字符串由SQL求值时,MySQL注入将被阻塞。

我用千克顶起了一些我正在处理的代码,函数中的所有\\\\\\\\\\\都让我的眼睛发疯。如果有人碰巧有这样的例子,我将不胜感激。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-11-29 00:19:53

PreparedStatements是最好的选择,因为它们使得SQL注入变得不可能。下面是一个将用户的输入作为参数的简单示例:

代码语言:javascript
复制
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语句。

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

票数 263
EN

Stack Overflow用户

发布于 2009-11-29 00:14:17

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

所以对所有input、updates和where子句都使用参数。动态SQL只是为黑客打开的一扇门,它包括存储过程中的动态SQL。参数化,参数化,参数化。

票数 49
EN

Stack Overflow用户

发布于 2009-12-01 09:35:35

(这是对OP在原始问题下的评论的回答;我完全同意PreparedStatement是这项工作的工具,而不是正则表达式。)

当您说\n时,您指的是\+n序列还是实际的换行符?如果是\+n,任务非常简单:

代码语言:javascript
复制
s = s.replaceAll("['\"\\\\]", "\\\\$0");

要匹配输入中的一个反斜杠,可以在regex字符串中放入四个反斜杠。要在输出中放入一个反斜杠,可以在替换字符串中放入四个反斜杠。这里假设您正在以Java字符串文字的形式创建正则表达式和替换。如果您以其他方式创建它们(例如,通过从文件中读取它们),则不必进行所有的双重转义。

如果您在输入中有一个换行符,并且您想用转义序列替换它,您可以使用以下命令对输入进行第二次传递:

代码语言:javascript
复制
s = s.replaceAll("\n", "\\\\n");

或者你可能想要两个反斜杠(我不太清楚):

代码语言:javascript
复制
s = s.replaceAll("\n", "\\\\\\\\n");
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1812891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档