【问题标题】:Stopping session hijacking停止会话劫持
【发布时间】:2012-04-17 03:37:29
【问题描述】:

一位黑客联系了我,说他们会使用会话劫持来关闭我的网站,他说我的文本框存在会话劫持漏洞。

是否有办法保护文本框免受会话劫持 我用它来逃避和防止 sql 注入。

这是我的表格

      <form name="hide" action="hideboxupdate.php" method="post">
          <input type="radio" name="yes" value="1" />
  Yes<br />
  <input type="radio" name="no" value="0" />
  No
  <input name="submit" type="submit" value="Submit" />
        </form>

然后这里是我的 hideboxupdate.php

<?php

$yes= mysql_real_escape_string($_POST['yes']);
$yes2 = strip_tags($yes);




$no= mysql_real_escape_string($_POST['no']);
$no2 = strip_tags($no);
?>
             <?php

             if (isset($yes2)) {





   $result3333 = mysql_query("UPDATE users SET hide_box='1' WHERE username = '".$_SESSION['username']."'")
or die(mysql_error());  

echo "Users now can not see your user box";
}

 if (isset($no2)) {


$result3333 = mysql_query("UPDATE users SET hide_box='0' WHERE username = '".$_SESSION['username']."'")
or die(mysql_error());  

echo "Users can now see your box on your profile";

}
?>

有没有办法防止会话劫持???

【问题讨论】:

标签: php mysql sql


【解决方案1】:

制作会话、浏览器数据和ip的md5并放入数据库中,在每次页面加载时检查它是否仍然相同,如果没有则销毁会话。

【讨论】:

  • 我急于为会话创建一个新表,将其绑定在用户 ID 上,添加更新时间戳并删除旧会话(这也是能够防止双重登录的好方法)
【解决方案2】:

当您发送带有表单的页面时,包含一个带有随机字符串的隐藏输入,您还可以将其写入数据库中的用户记录,如下所示:

 <input type="hidden" name="csrf" value="0432985732409857243"/>

当用户提交表单时,您验证表单的隐藏数据 csrf 是否与您存储在数据库中的值匹配。如果 csrf 匹配,则表示更新良好,您也删除了 csrf;如果 csrf 不匹配,则不进行更新。

这可以保护用户,因为只有他才能提交该表单,而且只能提交一次。

【讨论】:

  • 是的,firebug 将向用户显示他自己页面加载的值——但他的值将不同于其他人的值。
【解决方案3】:

这并不能防止您的代码受到攻击。人们可以将任意数据发布到您的表单,只需在他们的本地主机上创建一个表单并使用您使用的相同变量名发布到您的服务器。

这只是一种情况。使用白名单方法。在服务器端,创建一个数组,其中包含您希望正确输入的表单中每个变量的所有可能值(对于&lt;input&gt;,&lt;textarea&gt;.. 显然不可能)。

此外,由于用户正在谈论会话固定...在每次注销后销毁会话...登录后使用 session_regenerate_id(使用 md5 + salt 加密)。不要在 url 中传播 session_id。

几点建议:(由著名的网络安全专家 Chris Shiflett 撰写)

http://shiflett.org/articles/session-hijacking

http://shiflett.org/articles/session-fixation

http://shiflett.org/articles/foiling-cross-site-attacks

http://shiflett.org/articles/the-truth-about-sessions

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

希望对你有帮助...

【讨论】:

    【解决方案4】:

    您应该考虑通过安装验证码保护来保护向您的系统发出“写入”的请求。

    我用Google reCaptcha,挺好用的……

    另外,确保您在通过系统验证后重置您的 PHPSESSID(例如登录表单):session-regenerate-id

    【讨论】:

    • 我使用验证码,您能否解释一下“确保您在对系统进行身份验证后重置您的 PHPSESSID(例如登录表单):session-regenerate-id”
    • 重置背后的想法是您必须强制更改会话,当然是在成功登录之后。如您所知,会话文件在会话失效后不会自动删除,黑客可能会使用这些文件来获得对您系统的特权访问。这样,您特别要求 current id 应该用 new one 重置 - 我相信旧会话将被自动删除。
    【解决方案5】:

    请考虑服务器和客户端会经历一个通常是 SSL 的登录阶段,或者服务器可以拥有其他可用的客户数据,以便客户端和服务器可以形成唯一的共享盐值(例如用户密码)。即使在非 SSL 登录中,也只需要为登录传输密码的加盐哈希,而不是密码本身。然后,服务器可以开始传输计数及其响应,客户端可以在下一页请求中使用 (count+private salt) 的哈希值进行响应。潜在的会话劫持者没有任何方法来获取这个私有盐,因此无法生成序列中的下一个哈希。

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 2012-05-19
      • 2012-02-20
      • 2017-12-22
      • 2010-11-28
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多