我想实现OWASP提到的'JSON Sanitizer'验证。我的理解是,这需要在两个地方完成:
-
从客户端或其他系统接收的 JSON 数据(在请求中) - 在处理之前需要在服务器端进行清理
-
要发送到客户端的 JSON 数据(在响应中) - 在发送到客户端之前,需要在服务器端对其进行清理
我只在 JSON 中调用清理方法就足够了吗清理该 JSON 数据上的库?
是否会执行所有消毒,或者在这方面是否有任何其他验证要做?
OWASP JSON 清理器将类似 JSON 的输入转换为语法有效且可嵌入的 JSON。
它通常用于获取服务器上由临时方法生成的"JSON",例如
"{ "output": " + stringOfJson + " }"
并确保它在语法上有效,以便可以传递给客户端上的JSON.parse
,并且可以嵌入,以便可以嵌入到更大的 HTML 或 XML 响应中,例如
<script>var jsonUsedByScriptsOnPage = {$myJson};</script>
如果您的客户端可能会发送狡猾的 JSON,您绝对可以在您的服务器上使用它。
请注意,您的服务器仍需要将 JSON 视为不受信任,就像它在未使用有效凭据到达的响应中收到的任何其他字符串一样。
https://github.com/OWASP/json-sanitizer#security 解释
清理 JSON 无法保护应用程序免受混淆代理攻击
var myValue = JSON.parse(sanitizedJsonString); addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
OWASP JSON 清理器无法处理引号筛选 - 它将字符串拆分为多个字段。所以我写了自己的清理方法,虽然很原始 - 如果你看到任何安全警告,我愿意接受建议,请分享。
/**
* 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()
方法的返回值会转义它,因此无法检测其中是否存在类似的东西。所以以下内容对我有用:
public static String checkJsonForScripts(String input) {
if (!JsonSanitizer.sanitize(input).equals(input)) {
log.error("Problematic string found" + input);
throw new YourException(...);
}
return input;
}