代码之家  ›  专栏  ›  技术社区  ›  Chris

安全Web应用程序问题

  •  1
  • Chris  · 技术社区  · 14 年前

    我正在实现一个Web应用程序,该应用程序通过SOAP服务器/客户机交互在后端供电。网站正在通过HTTPS运行,LDAP正在提供身份验证。

    到目前为止,我推送所有没有cookie的用户,称之为“userhash”以引用登录页面。登录页面接受用户名,通过并检查LDAP进行验证。如果它验证我将用户名、用户IP地址和时间戳存储在会话中。

    最后,我构造了一个cookie和会话哈希信息:

    SESSION['userHash'] = sha1($username.$userip.$timestamp); 
    cookie['userHash'] = sha1($username.$userip.$timestamp); 
    

    这样,在随后的任何请求中,我都会验证用户是否拥有与会话['userhash'匹配值的cookie userhash]

    此设置是否安全?

    此外,我想防止暴力攻击,并将实现一个简单的数据库表来记录失败的尝试。目前我正在考虑:

    id | username | timestamp | ipaddress | count 
    

    作为一张桌子。这是最好的方法还是有更好的方法?例如,我在这个表中看到,如果我将失败的尝试限制为每24小时3次,那么攻击者就可以从同一个IP上尝试每个用户名3次。(一方面注意:此应用程序预计将用于可能位于子网上的学校计算机实验室,因此显示来自同一IP地址的多个登录名,因此我需要注意何时根据IP地址阻止。)

    另一方面,我想知道是否有类似“denyhosts”的HTTP身份验证?

    2 回复  |  直到 14 年前
        1
  •  5
  •   jmz    14 年前

    您创建的哈希 $hash = sha1($username.$userip.$timestamp); 是不安全的,因为它可以从公共信息中计算出来。用户名、用户IP和时间戳都是公共的,可供攻击者使用。必须向哈希添加机密信息,例如:

    $hash = sha1($username.$userip.$timestamp.$secret);
    

    在哪里? $secret 不会在脚本之外进行通信。如果需要,可以将公共数据存储到cookie中:

    $cookie = implode("/", array($username, $timestamp, $hash));
    

    然后在验证时,使用$_server['remote_addr']作为$userip。

    对于第二个问题,如果已经存储了失败尝试的时间戳,则不需要Count列。如果尝试来自已失败时间戳的同一地址,您可以拒绝它,因为人类不会在一秒钟内输入两个密码。

    编辑添加 :使失败尝试的限制非常小将使您的用户容易受到DOS的攻击。尤其是学校环境中有很多爱冒险的人,他们不介意为了进入一个帐户而输入一些密码。3次尝试后将其锁定,同时锁定合法用户…

        2
  •  0
  •   thecodeassassin    14 年前

    好吧,在一个处于中间位置的人身上,所有这些都无关紧要。如果您处理敏感信息,建议使用安全套接字层。

    使用ldapv3传输层安全性(tls)扩展进行安全连接。

    另外,将HTTP用户代理记录到同一网络上的不同计算机上。

    锁定用户帐户以防止野蛮变形始终是一个好主意。确保拒绝IP地址/用户代理组合,而不仅仅是IP地址。

    现在,他们无法在您发送信息时捕获信息,也无法伪造cookie信息。在这方面,它是相当安全的。不过,可能还有其他因素,但我不知道,这是不相关的。