停止会话劫持

时间:2012-04-03 13:12:45

标签: php mysql sql

一位黑客已经联系过我,说我会用会话劫持我的网站,他说我的文本框是会话劫持易受攻击的。

无论如何都要保护文本框免受会话劫持 我使用它来逃避和保护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";

}
?>

无论如何都要防止会话劫持???

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:2)

这不会阻止您的代码受到攻击。人们可以通过在本地主机上创建表单并使用您使用的相同变量名称发布到服务器,将任意数据发布到表单。

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

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

一些指示:(由Chris Shiflett撰写...一位Renowed网络安全专家)

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

希望它有所帮助...

答案 3 :(得分:0)

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

我使用Google reCaptcha并且非常好......

此外,确保您在向系统进行身份验证后重置PHPSESSID(例如登录表单):session-regenerate-id

答案 4 :(得分:0)

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