Security with PHP Sessions

2019-08-06 19:06发布

我知道这已被要求数十亿次,但我超级偏执我的编码的安全性/ OCD。 我工作的一个小项目。 会话数据将只包含:

USER_ID 1
USER_NAME名为myUsername
LOGGED_IN真
csrf_token 87cc51ee94178df79cccce2aebc45d53

这里是我的代码。 难道是放心大胆地在小CMS使用?

session_start();

ini_set('session.cookie_httponly', 'On');
ini_set('session.cookie_secure', 'On');
ini_set('session.use_cookies', 'On');
ini_set('session.use_only_cookies', 'On');

$rand = rand(1, 10);

if ($rand != 1 || $rand != 3 || $rand != 5)
    session_regenerate_id();

$user_ip = md5($_SERVER['REMOTE_ADDR']);
$user_agent = md5($_SERVER['HTTP_USER_AGENT']);

if (isset($_SESSION['user_ip'], $_SESSION['user_agent'])) {
    $session_user_ip = $_SESSION['user_ip'];
    $session_user_agent = $_SESSION['user_agent'];

    if ($session_user_ip != $user_ip || $session_user_agent != $user_agent) {
        unset($_SESSION);
        session_destroy();

        die('Error');
    }
} else {
    $_SESSION['user_ip'] = $user_ip;
    $_SESSION['user_agent'] = $user_agent;
}

然后调用会话:

$_SESSION['user_id'] = 1;
$_SESSION['user_name'] = 'MyUsername'; // etc.


我将使用会话数据来检查,如果用户有权限做一些事情。 例如: if ( user_has_perm( $_SESSION['user_id'] ) )

感谢您的帮助提前。

Answer 1:

会议的安全风险来自三个不同的可能性:

  • 预测
  • 捕获
  • 固定术

预测将意味着有人说,这不是为谁创建会话猜到他们的会话ID的用户。 这种事情发生的几率几乎为0,虽然他们成长为更多的用户同时使用该网站。

你的代码,你会作出这样的风险更低,因为如果攻击者共享用户代理和预测会话的IP它只会工作。 但不同的是在这种情况下微不足道的。

固定意味着攻击者可以创建一个会话,然后强制其他用户使用他们的会话。 在这种情况下,这将取决于:如果攻击者知道,你正在做它,他们假冒用户代理和客户端的IP,他们可以固定会话。 或者,如果他们共享IP和用户代理。

最后,我们有会话劫持,可能是三种最常用的方法。 在这种情况下,攻击者会以某种方式获取用户的有效记录的的会话ID,然后用它来登录到他们的帐户。 与前面的方法,这只会为他们工作,如果他们知道你正在检查的IP和用户代理,并伪造了相同的那些用户。 您所使用的技术是不是唯一的,有些攻击者可能假冒他们以防万一。


话虽这么说,是否安全? 是的 ,没有

如果您正在使用安全痴迷,得到的回答总是一样的: 使用SSL

除非你的代码是开源的,几乎所有的东西你这样做改变了PHP会话的行为将是足够安全。

唯一的例外,这将是非常受欢迎的网站,将吸引黑客的注意。

有关于这个主题提供了一些很好的文档:

  • http://phpsec.org/projects/guide/4.html
  • PHP会话安全
  • http://www.squarefree.com/securitytips/web-developers.html#CSRF


Answer 2:

我不是一个安全专家。 不过,窃怀疑你的安全强制执行会带来可观的效益。

如果有一个谁可以窃听未加密的无线网络中盗取用户的会话ID,例如,我敢打赌,他还可以盗取用户发送到服务器验证时所用的用户名和密码。 一旦他有访问凭据,攻击者可以登录后的一天,或一周后,也就有了自己的“安全” - 和100%有效 - 会话一起玩。

我相信这是没有通道安全无会话安全。 如果使用SSL,可以确保会话ID通过cookie只派(你已经这样做),你的会话过期很快,我相信你是相当安全的,而且比通过不安全的渠道使这些执法安全。



Answer 3:

首先,你必须在会议上重新生成代码错误。 如果将始终评估为真,以下几点:

if ($rand != 1 || $rand != 3 || $rand != 5)

如果$rand 为1,则返回true。 如果$rand 1,那么它是不是三个,并且它返回true。 你可能想用的是一个and这里。

其次,你不需要为MD5的user_ip ,或user_agent字符串。 如果有人可以直接访问您的服务器上的会话数据,你在它如此之深,散列数据也救不了你。

澄清:作为SDC和美眉在评论中指出,MD5是很好的,如果你有盐哈希散列的密码。 这意味着你的用户的密码一般都仍然是安全的,即使SQL注入攻击成功,你的数据库暴露给世界。 但是,如果你的服务器被攻破,而盐被破坏,那么它能够生成一组已知的散列,并试图特定密码的反向查找。 底线是什么? 哈希您的用户密码,用的盐。

第三,最安全漏洞并不来自欺骗会话。 他们来自贫困输入检查。 一本书像基本PHP安全性应该是一个很好的介绍检查,你应该在一个PHP项目做那种投入。 如果做不到这一点,至少阅读PHP手册的安全性部分 。 注意SQL注入位。 这很酷!

最后,我完全同意你应该使用SSL来保护通信到您的网站的其他海报。



Answer 4:

说实话,我认为你过于谨慎,而不是在一个非常有用的方式。

如果你真的担心会话安全,不要试图自己做。 使用PHP安全补丁一样了Suhosin 。 让它做所有的辛勤工作为您服务。 了Suhosin是PHP一个完善的补丁。 它包括的东西,用PHP会话可以被黑客攻破的所有方式的交易。 如果你有安装它,那么你并不需要做任何额外费用,以确保您的会话。 如果你没有安装它,那么你绝对不能算得上是超级偏执安全!

因此,在短期,安装了Suhosin(如果你还没有的话),并忘掉它。

但只是为了完整性,我会在你的实际代码做出一些评论,只是指出两件事情:

我不知道为什么你认为MD5哈希有什么差别。 MD5哈希值可以在几秒钟内被破解,所以让他们在任何类型的安全功能完全是任意的。 它也可以被纯文本。 这么说,我真的不认为有必要对他们来说比纯文本以外的任何反正 - 如果一个黑客设法获取会话数据保持到能够读取它所包含的IP地址,那么你已经超出担心他们是否知道IP地址或没有。



Answer 5:

他们只是两个主要的会话攻击

1.)会话固定攻击。

这可以通过使用能够防止session_regenerate_id()

2.)会话劫持:

这可以通过数据加密,通过使用SSL证书被防止。 您的网站现在对HTTPS,而非HTTP运行。

3)如果您是在未实施CloudFare或JailRoot共享服务器上。 您可以显示你的会话存储在数据库中,而不是默认的文件系统存储。

与此三种实现,让我看看黑客谁声称破解usesrs会议...



Answer 6:

Select image to upload: "; $res=mysql_query("SELECT `id`, `FirstName`, `LastName`, `Address`, `Password`, `Repassword`, `Birthday`, `Gender`, `user_image` FROM `registration`") or die(mysql_error()); while($row=mysql_fetch_array($res)) { $id=$row['id']; $firstname=$row['FirstName']; $user_image=$row['user_image']; $page.=" $firstname"; } $page.=" "; $res_post=mysql_query("SELECT post_info.post_info_id, post_info.id, post_info.post_info_desc, registration.FirstName FROM `post_info` join `registration` WHERE post_info.id = registration.id order by post_info.post_info_id desc") or die(mysql_error()); while($row_post=mysql_fetch_array($res_post)) { $post_id = $row_post ['post_info_id']; $post_desc = $row_post ['post_info_desc']; $id = $row_post ['id']; $FirstName = $row_post ['FirstName']; $page.="

$名字

$post_desc

"; } $page.=" "; include('include/main_file.php'); ?>


Answer 7:

<?php

session_start();
$con=mysql_connect("localhost","root","");
$seldb=mysql_select_db('myfreind', $con);
$email=$_POST['txtEmail'];
$password=$_POST['txtPass'];
$res=mysql_query("SELECT `id`, `FirstName`, `LastName`, `Address`, `Password`, `Repassword`, `Birthday`, `Gender` FROM `registration` WHERE 
`Password`='$password' and  `FirstName`='$email'");
$num=mysql_num_rows($res);

if($num==1)
{
$row=mysql_fetch_array($res);
$id=$row['id'];
$firstname=$row['FirstName'];
$_SESSION['id']=$id;
$_SESSION['FirstName']=$firstname;
//echo $_SESSION['id'];
header('Location:main.php');
}else

{

header('Location:index.php?error');
}

?>


文章来源: Security with PHP Sessions