让我们考虑一个接收JSON对象的REST端点。其中一个JSON字段是String,因此我想验证没有收到恶意文本。
@ValidateRequest
public interface RestService {
@POST
@Consumes(APPLICATION_JSON)
@Path("endpoint")
void postData (@Valid @NotNull Data data);
}
public class Data {
@ValidString
private String s;
// get,set methods
}
我通过@ValidString
使用bean验证框架将验证委托给ESAPI库。
@Override
public boolean isValid (String value, ConstraintValidatorContext context) {
return ESAPI.validator().isValidInput(
"String validation",
value,
this.constraint.type(),
this.constraint.maxLength(),
this.constraint.nullable(),
true);
}
此方法规范化值(即删除加密),然后根据ESAPI配置中提供的正则表达式进行验证。正则表达式对于这个问题并不重要,但它主要是白名单和安全'字符。
到目前为止一切顺利。但是,在某些情况下,我需要接受“少”。安全字符,例如%
,"
,<
,>
等,因为传入的文本来自最终用户的自由文本输入字段。
这种String
消毒是否有已知的模式?如果SQL查询被认为是安全的(例如使用绑定变量),那么哪种文本会导致服务器端问题?如果用户想要存储<script>alert("Hello")</script>
作为他的描述,在某些时候会将其发送回客户端,该怎么办?我将它存储在数据库中吗?这是客户方关注的问题吗?
答案 0 :(得分:2)
在处理来自用户的文本时,最佳做法是按照您的说明仅列出已知字符集的白名单。但这不是整个解决方案,因为有时候这种方法不起作用,正如你所指出的那样,有时候“危险”字符是有效字符集的一部分。
当发生这种情况时,您需要对如何处理数据保持警惕。我和推荐人一样,建议尽可能长时间地将用户的原始数据保持在原始状态。安全地处理数据将使用适当的目标域/输出功能。
<强> SQL 强>
将自由格式字符串放入SQL数据库时,最佳做法是使用预处理语句(在java中这是PreparedStatement对象或使用ORM自动参数化数据。
要了解有关SQL注入攻击和其他形式的注入攻击(XML,LDAP等)的更多信息,我建议OWASPS Top 10 - A1 Injections
<强> XSS 强>
您还提到了在将此数据输出到客户端时要执行的操作。在这种情况下,我想确保您对输出进行html编码以获得正确的上下文,即上下文输出编码。 ESAPI为此提供了Encoder类/接口。需要注意的重要事项是输出数据的上下文(HTML正文,HTML属性,JavaScript,URL等)。每个区域的编码方式都不同。
以输入为例:<script>alert('Hello World');<script>
样本编码输出:
<script>alert('Hello World');<script>
\u003cscript\u003ealert(\u0027Hello World\u0027);\u003cscript\u003e
网址:%3Cscript%3Ealert%28%27Hello%20World%27%29%3B%3Cscript%3E
%3Cscript%3Ealert%28%27Hello+World%27%29%3B%3Cscript%3E
\00003Cscript\00003Ealert\000028\000027Hello\000020World\000027\000029\00003B\00003Cscript\00003E
<script>alert('Hello World');<script>
有关XSS的更多信息,请查看OWASP Top 10 - A3 Cross-Site Scripting (XSS)