【问题标题】:Input Sanitizing to not break JSON syntax输入清理以不破坏 JSON 语法
【发布时间】:2011-09-27 01:09:34
【问题描述】:

所以,简而言之,我正在尝试创建一个正则表达式,我可以在即将向我的 php 服务器提交 JSON 对象的 java 程序中使用它。

myString.replaceAll(myRegexString,"");

我的问题是,我对正则表达式绝对没有好处,此外,我需要正确转义字符,因为它存储在字符串中,然后还要在正则表达式中正确转义字符。天哪。

我的想法是这样的:

String myRegexString = "[\"',{}[]:;]"

第一个反斜杠是转义外部引号以在其中获得一个 "。然后让我震惊的是 {} 和 [] 也是正则表达式命令。我也会转义那些吗?喜欢:

String myRegexString = "[\"',\{\}\[\]:;]"

提前致谢。如果从上面的示例中不清楚,我此时真正关心的唯一角色是: " { } [ ] ,; : ' 用于一般 sqlinj 保护。

更新:

这是最终的正则表达式: [\\Q\"',{}[\]:;\\E] 其他任何好奇的人。谢谢阿米特!

【问题讨论】:

  • 对于那些转义字符,您需要使用双反斜杠。例如。 "[\\"',\\{\\}\\[\\]\\:;]" 以便 Java 将反斜杠字符传递给正则表达式引擎。否则,Java 会查找不存在的特殊字符 \[
  • @Matt," 不能双重转义(否则会发生编译时错误)。此外,{): 在字符类内部根本不需要转义。

标签: java regex json replaceall


【解决方案1】:

为什么不使用实际的 JSON 编码 API/框架?你在做的不是消毒。你正在做的是破坏数据。如果我的名字是 O'Reilly,我希望它拼写为 O'Reilly,而不是 OReilly。如果我发送包含 [ 或 { 的消息,我希望这些在消息中。使用在需要时转义这些字符的框架或 API,而不是盲目地删除它们。

通过谷歌搜索 JSON Java 将引导您找到许多 API 和框架。

【讨论】:

  • 我同意,我正在破坏数据。但这是我需要做的。我不在乎您是否希望您的用户名是 O'Reilly,将其粘贴到我的数据库中,它将是 OReilly。
  • 它是一款休闲游戏,其美妙之处在于您希望您的用户名是 O'Reilly,您可以继续输入 O'Reilly。它每次都会以 OReilly 的身份通过,并且仍然可以工作。
  • 当你是一个认真的开发者时,让事情“工作”是不够的。你必须让事情正常运转。想象一下,如果这个网站 (stackoverflow.com) 确实从所有帖子中删除了所有引号、括号和花括号。当然它仍然可以工作。但有人会用吗?如果你打算通过过滤来避免 SQL 注入攻击;和',你做错了,它不会工作。使用准备好的语句。
【解决方案2】:

试试类似的东西

String myRegexString = "[\\Q\"',{}[]:;\\E]";

现在 \Q 和 \E 之间的字符现在被视为普通字符。

【讨论】:

  • 嘿,谢谢你的酷符号。根据正则表达式助手的说法,我也必须逃脱 ] 否则它会过早地结束该系列。所以我得到了[\\Q\"',{}[\]:;\\E] 在java中,我需要加倍所有这些反斜杠吗?
  • Nvm。用一个小测试脚本得到了我的答案。我会重新发布最后一个,以防其他人可能需要使用它。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
相关资源
最近更新 更多