6

我想实现 OWASP 提到的“JSON Sanitizer”验证。我的理解是,这需要在两个地方完成:

  1. 从客户端或其他系统接收的 JSON 数据(在请求中) - 这需要在服务器端进行清理,然后再进行处理

  2. 要发送到客户端的 JSON 数据(响应中) - 这需要在服务器端进行清理,然后再发送到客户端

我只在那个 JSON 数据上调用 JSON 消毒库中的消毒方法就足够了吗?

是否会执行所有消毒或在这方面是否需要进行任何其他验证?

4

3 回答 3

6

OWASP JSON Sanitizer将类似JSON 的输入转换为语法上有效且可嵌入的 JSON。

它通常用于获取由服务器上的 ad-hoc 方法生成的“JSON”,例如

"{ \"output\": " + stringOfJson + " }"

并确保它在语法上是有效的,以便它可以传递给JSON.parse客户端,并且是可嵌入的,以便它可以嵌入到更大的 HTML 或 XML 响应中,例如

<script>var jsonUsedByScriptsOnPage = {$myJson};</script>

如果您的客户端可能发送不可靠的 JSON,您绝对可以在您的服务器上使用它。

请注意,您的服务器仍然需要将 JSON 视为不受信任,就像它在未使用有效凭据到达的响应中接收到的任何其他字符串一样。

https://github.com/OWASP/json-sanitizer#security解释

清理 JSON 无法保护应用程序免受Confused Vice 攻击

var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
于 2015-04-27T15:19:57.630 回答
1

OWASP JSON Sanitizer 无法处理引号筛选——而是将字符串拆分为多个字段。所以我写了自己的 sanitize 方法,虽然很原始 - 如果你看到任何安全警告,我愿意接受建议,请分享。

/**
 * Helper methods to validate data.
 */
@UtilityClass
public class ValidationUtils {

/**
 * Removes disallowed symbols from string to prevent input injection.
 * @param input User input with possible injection.
 * @return Value without injection-sensible symbols.
 */
public String sanateInjection(String input){
    return input.replaceAll("[^A-Za-z0-9 ]", "");
  }
}
于 2021-02-15T17:43:34.217 回答
0

我想知道某些 json 字符串是否包含<script>稍后可用于执行动态内容的标签。但是由于该sanitize()方法的返回值会转义它,因此无法检测其中是否存在类似的东西。所以以下对我有用:

public static String checkJsonForScripts(String input) {
    if (!JsonSanitizer.sanitize(input).equals(input)) {
        log.error("Problematic string found" + input);
        throw new YourException(...);
    }
    return input;
}
于 2021-02-16T21:13:51.717 回答