安全读取用户输入的最佳方法是什么?

时间:2016-03-16 19:19:14

标签: security java-ee esapi

让我们考虑一个接收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>作为他的描述,在某些时候会将其发送回客户端,该怎么办?我将它存储在数据库中吗?这是客户方关注的问题吗?

1 个答案:

答案 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>

样本编码输出:

  • HTML: &lt;script&gt;alert(&#39;Hello World&#39;);&lt;script&gt;
  • 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: &lt;script&gt;alert(&apos;Hello World&apos;);&lt;script&gt;

有关XSS的更多信息,请查看OWASP Top 10 - A3 Cross-Site Scripting (XSS)