让我们考虑一个接收 JSON 对象的 REST 端点。 JSON 字段之一是字符串,因此我想验证是否未收到恶意文本。
@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验证框架将验证委托(delegate)给 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
sanitizer ?如果 SQL 查询被认为是安全的(例如使用绑定(bind)变量),什么样的文本会导致服务器端问题?如果用户想存储<script>alert("Hello")</script>
怎么办?作为他的描述,哪些内容会在某个时候发回给客户?我将其存储在数据库中吗?这是客户端关心的问题吗?
最佳答案
处理来自用户的文本时,最佳实践是仅将已知字符集列入白名单,如您所述。但这不是完整的解决方案,因为有时这不起作用,再次正如您指出的那样,有时“危险”字符是有效字符集的一部分。
发生这种情况时,您需要对处理数据的方式保持高度警惕。我以及评论者建议尽可能长时间地将用户的原始数据保持在原始状态。安全地处理数据将针对目标域/输出使用适当的函数。
SQL
将自由格式字符串放入 SQL 数据库时,最佳实践是使用准备好的语句(在 java 中,这是 PreparedStatement 对象或使用将自动参数化数据的 ORM。
要了解有关 SQL 注入(inject)攻击和其他形式的注入(inject)攻击(XML、LDAP 等)的更多信息,我推荐 OWASPS Top 10 - A1 Injections
XSS
您还提到了将此数据输出到客户端时要做什么。在这种情况下,我想确保对正确上下文的输出进行 html 编码,也称为上下文输出编码。 ESAPI 有Encoder为此的类/接口(interface)。需要注意的重要一点是数据将被输出到哪个上下文(HTML Body、HTML Attribute、JavaScript、URL 等)。每个区域都会以不同的方式进行编码。
以输入为例:<script>alert('Hello World');<script>
示例编码输出:
- HTML:
<script>alert('Hello World');<script>
- JavaScript:
\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
- CSS:
\00003Cscript\00003Ealert\000028\000027Hello\000020World\000027\000029\00003B\00003Cscript\00003E
- XML:
<script>alert('Hello World');<script>
有关 XSS 的更多内容,请参阅 OWASP Top 10 - A3 Cross-Site Scripting (XSS)
关于security - 安全读取用户输入的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36045056/