我知道这已被要求数十亿次,但我超级偏执我的编码的安全性/ 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