如何在服务器端使用 JSON Sanitizer?

How to use JSON Sanitizer at Server Side?

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

  1. JSON 从客户端或其他系统接收到的数据(在请求中)——这需要在处理之前在服务器端进行清理

  2. JSON 要发送给客户端的数据(在响应中)——这需要在发送给客户端之前在服务器端进行清理

我在 JSON 中调用一个消毒方法就足够了吗 正在清理关于 JSON 数据的库?

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

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

它通常用于获取由服务器上的临时方法生成的“JSON”,如

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

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

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

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

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

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

sanitizing JSON cannot protect an application from Confused Deputy attacks

var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);

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

/**
 * 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 ]", "");
  }
}

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

public static String checkJsonForScripts(String input) {
    if (!JsonSanitizer.sanitize(input).equals(input)) {
        log.error("Problematic string found" + input);
        throw new YourException(...);
    }
    return input;
}