【问题标题】:How to use JSON Sanitizer at Server Side?如何在服务器端使用 JSON Sanitizer?
【发布时间】:2015-06-29 18:15:16
【问题描述】:

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

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

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

我只在 JSON 中调用一个清理方法就足够了吗 在那个 JSON 数据上清理库?

是否会执行所有清理工作,或者在这方面是否需要进行任何其他验证?

【问题讨论】:

    标签: json owasp input-sanitization jsonexception


    【解决方案1】:

    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 Deputy attacks

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

    【讨论】:

    • 这有帮助。那么如何确保 JSON Payload 没有任何恶意脚本来进行 XSS 等攻击呢?是否有任何其他库可以验证 JSON 有效负载是否有任何脚本内容?
    • by >dodgy
    • @yathirigan,两者。如果一个值得信赖的客户端向您发送由 ad-hoc 方法组成的 JSON,'{ "secret": "' + secret + '", "foo": "' + foo + '" }',那么攻击者可能会导致该客户端向您发送违反您之间某些合同的消息。例如,如果他们使 foo 成为'\", \"otherProperty\": \"value',那么他们就有效地引入了客户不希望出现的属性。只看到字符串的任何清理都无法加强属性或对象边界。
    • 该库做得很好,但不能处理引号筛选 - 它会将字符串拆分为几个字段。不得不写自己的JsonUtils.sanitize()
    • @Zon 我们也正在编写​​自己的方法。你能分享你的吗?
    【解决方案2】:

    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 字符串?还是只看价值观?因为这会过滤掉许多有效字符,例如 .,;-_= 我的意思是如果你运行它,你的字符串肯定会被保存 ;-)
    • 是的。仅用于字段输入,通常为字母数字。如果您期望带有字符的文本输入可用于创建注入攻击,则必须扩展逻辑。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2017-09-09
      • 2013-02-16
      • 2018-01-01
      • 2015-07-21
      相关资源
      最近更新 更多