我想实现OWASP提到的'JSON Sanitizer'验证。 我的理解是,这需要在两个地方完成:
从客户端或其他系统收到的JSON数据(在请求中) - 需要在处理之前在服务器端进行清理
要发送给客户端的JSON数据(在响应中) - 需要在发送到客户端之前在服务器端进行清理
我只是在JSON中调用一个清理方法就足够了 在JSON数据上清理库?
是否会执行所有清理工作,还是在这方面还有其他验证?
答案 0 :(得分:5)
OWASP JSON Sanitizer将类似JSON的输入转换为语法上有效的&嵌入式JSON。
它通常用于在服务器上采用由ad-hoc方法生成的“JSON”,如
"{ \"output\": " + stringOfJson + " }"
并确保它语法上有效,以便可以将其传递到客户端上的JSON.parse
,并 embeddable ,以便它可以嵌入更大的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);
答案 1 :(得分:1)
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 ]", "");
}
}
答案 2 :(得分: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;
}