java - 如何避免登录api中的大数据

标签 java tomcat authentication spring-security tomcat8

我们正在使用 tomcat 8、spring security 4.x 并通过 POST 公开了一个/login api,它将验证用户的凭据。由于/login API 通常是不安全的,恐怕可以使用我们当前的实现进行以下攻击:

  1. 在用户名和密码字段中发送大量输入。 Spring security 的 UsernamePasswordAuthenticationFilter 只是将用户名和密码参数从 servlet 复制到一个字符串中。可能会提交大量数据并导致内存耗尽导致拒绝攻击。可以将 readlistener 与 servlet 3.1 规范一起使用,但如果我可以避免使 servlet 异步,那将是首选。那么,是否可以简单地查看 content-size header ?/login 的 POST 通常具有用户名参数、它的值(上限大小有限制)、密码参数及其值(大小受业务规则限制)。所以理论上,如果我检查内容大小 > 某些可配置大小,我可以拒绝身份验证。这种做法有没有漏洞?

  2. 攻击者可以将 content-size header 设置为较大的量,并且只发布较小的数据。在这种情况下,由于tomcat模拟读取http body是模拟阻塞,一个线程可能会阻塞很长时间。当 tomcat 尝试读取 http 主体时,有没有办法在 tomcat 中指定超时?

最佳答案

  1. 限制请求的最大大小。您可以限制请求的总标题(<Connector>maxHttpHeaderSize 属性),您可以限制接受的 POST 正文的总长度(<Connector>maxPostSize 属性)。

  2. 这次攻击称为 slowloris . Tomcat的NIO实际上是释放线程的“模拟阻塞”来避免DOS受到这样的攻击。您可以指定超时以帮助缓解 slowloris 问题。我将把它作为练习留给您阅读 Tomcat connector documentation因为你显然还没有读过它。

  3. 你为什么要离开你的 /login “API”“不安全”?保护好那个坏男孩!

关于java - 如何避免登录api中的大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26788762/

相关文章:

java - 如果请求处理未在指定时间内完成则超时

jquery - 在 Tomcat 服务器上使用 JQuery 进行长轮询的问题

ruby-on-rails - Saml_IDP gem 不提取元数据或accepted_hosts

java - 正则表达式查找包含多个空格且没有前导/尾随空格的字符串

java - 如何处理org.apache.tomcat.util.threads.TaskQueue.take()热点?

authentication - 如何在 Apache Nutch 中进行 NTLM 身份验证?

Asp.net/IIS 静态内容(例如图像)身份验证最佳实践

java - 如何将 for 循环数组值设置为 bean

java - 片段页面findViewByID无效

java - 如何在短时间内连续移动?