基于 php 个会话提高 Web 应用程序安全性
Improve Web application security based on php session
我有一个 Web 应用程序,我想改进它的安全漏洞,我阅读了很多关于它的文章,但仍有一些问题没有得到解答。感谢您的帮助。
首先我有一个登录屏幕。用户输入他的凭据后,将根据数据库检查它们(它们被正确散列;)),如果成功,服务器会创建一个会话变量
//Jhon id = 1
$_SESSION["userID"]= '1';
在每个 php 文件的开头(例如 dashboard.php)我有以下代码:
session_start();
if(isset($_SESSION['userID'])) {
if($_SESSION["userID"]==""){header("location:login.php");}
}else{
header("location:login.php");
}
?>
<html ...
为了改进维护,我想将此代码包含在外部 php 文件中,例如
include('inc/restricted.php');
?>
<html ...
我的两个主要问题是:
1) 如果入侵者破坏或拒绝访问 restricted.php,dashboard.php 的剩余部分会出现吗?有可能做那样的事情吗?如果是,我该如何修复它,将安全代码作为外部文件包含在内?
2) 如您所见,我的会话变量的值很简单(整数),我应该将它们更改为散列值吗?我以为 php 会话存储在服务器端,但我读到一些 php 会话变量存储在 cookie 上,现在我担心创建一个带有随机数并授予访问权限的 cookie 的机会。
- 如果此文件中的代码不安全,则有可能。因为我们看不到它,所以不可能说它是如何被破坏的。但一般来说,面向网络的请求应该无法控制您的 php 代码,除非您的设置非常不安全。
- 值无关紧要。存储在
$_SESSION
中的数据从不存储在客户端上,只存储在服务器上。这是由 session.handler
接口在 php 中控制的(默认情况下,它在 session.save_path
中作为纯文本文件存储在您的服务器上)。
导致会话不安全的事情几乎总是代码编写不当或服务器配置不当的结果。
下面概述了您可以采取的一些措施来提高会话的安全性:
在用户登录时始终使用 session_regenerate_id(true)
(这可以防止会话固定攻击)。
当您注销用户时始终删除客户端上的会话 cookie(请参阅 http://php.net/session-destroy 中的第一个示例)。例如,当用户从 public 计算机登录时,这可以防止会话接管攻击,因为会话可能不会总是在服务器端立即删除,并且 cookie 允许客户端重新触发会话服务器上的 TTL。
仅通过安全连接传输会话 cookie(参见 session.cookie_secure
为了防止某些 XSS 和 CSRF 向量,考虑使用 session.cookie_httponly
and session.cookie_samesite
来防止恶意 JS 开启此类攻击。
始终使用 CSRF tokens 以及所有修改请求,以保护用户免受严格通过会话的访问。这是一个额外的安全层。
请记住,这不是一份完整的清单。安全性是分层构建的,需要在用例和目标方面进行大量的深思熟虑。
我有一个 Web 应用程序,我想改进它的安全漏洞,我阅读了很多关于它的文章,但仍有一些问题没有得到解答。感谢您的帮助。
首先我有一个登录屏幕。用户输入他的凭据后,将根据数据库检查它们(它们被正确散列;)),如果成功,服务器会创建一个会话变量
//Jhon id = 1
$_SESSION["userID"]= '1';
在每个 php 文件的开头(例如 dashboard.php)我有以下代码:
session_start();
if(isset($_SESSION['userID'])) {
if($_SESSION["userID"]==""){header("location:login.php");}
}else{
header("location:login.php");
}
?>
<html ...
为了改进维护,我想将此代码包含在外部 php 文件中,例如
include('inc/restricted.php');
?>
<html ...
我的两个主要问题是:
1) 如果入侵者破坏或拒绝访问 restricted.php,dashboard.php 的剩余部分会出现吗?有可能做那样的事情吗?如果是,我该如何修复它,将安全代码作为外部文件包含在内?
2) 如您所见,我的会话变量的值很简单(整数),我应该将它们更改为散列值吗?我以为 php 会话存储在服务器端,但我读到一些 php 会话变量存储在 cookie 上,现在我担心创建一个带有随机数并授予访问权限的 cookie 的机会。
- 如果此文件中的代码不安全,则有可能。因为我们看不到它,所以不可能说它是如何被破坏的。但一般来说,面向网络的请求应该无法控制您的 php 代码,除非您的设置非常不安全。
- 值无关紧要。存储在
$_SESSION
中的数据从不存储在客户端上,只存储在服务器上。这是由session.handler
接口在 php 中控制的(默认情况下,它在session.save_path
中作为纯文本文件存储在您的服务器上)。
导致会话不安全的事情几乎总是代码编写不当或服务器配置不当的结果。
下面概述了您可以采取的一些措施来提高会话的安全性:
在用户登录时始终使用
session_regenerate_id(true)
(这可以防止会话固定攻击)。当您注销用户时始终删除客户端上的会话 cookie(请参阅 http://php.net/session-destroy 中的第一个示例)。例如,当用户从 public 计算机登录时,这可以防止会话接管攻击,因为会话可能不会总是在服务器端立即删除,并且 cookie 允许客户端重新触发会话服务器上的 TTL。
仅通过安全连接传输会话 cookie(参见
session.cookie_secure
为了防止某些 XSS 和 CSRF 向量,考虑使用
session.cookie_httponly
andsession.cookie_samesite
来防止恶意 JS 开启此类攻击。始终使用 CSRF tokens 以及所有修改请求,以保护用户免受严格通过会话的访问。这是一个额外的安全层。
请记住,这不是一份完整的清单。安全性是分层构建的,需要在用例和目标方面进行大量的深思熟虑。