我有一个Web应用程序,我想改进其安全漏洞,我阅读了很多关于它的文章,但有些问题仍未得到解答。我感谢您的帮助。
首先,我有一个登录屏幕。用户输入其凭据后,将根据数据库检查它们(它们;)正确散列(,如果成功,服务器将创建一个会话变量
//Jhon id = 1
$_SESSION["userID"]= '1';
在每个 php 文件(例如仪表板.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( 如果入侵者处理损坏或拒绝访问受限.php,仪表板.php的剩余部分会显示吗?有可能做这样的事情吗?如果是,我如何以将安全代码作为外部文件包含的方式修复它?
2(如您所见,我的会话变量的值很简单(整数(,我应该将它们更改为散列值吗?我以为 php 会话存储在服务器端,但我读到了一些存储在 cookie 上的 php 会话变量,现在我担心创建具有随机数并授予访问权限的 cookie 的机会。
- 如果此文件中的代码不安全,则可能是可能的。由于我们看不到它,因此无法说它是如何受到损害的。但一般来说,面向 Web 的请求应该无法控制您的 php 代码,除非您的设置非常不安全。
- 值无关紧要。存储在
$_SESSION
中的数据永远不会存储在客户端上,只会存储在服务器上。这在 php 中由session.handler
接口控制(默认情况下,它以纯文本文件的形式存储在您的服务器上session.save_path
中(。
倾向于使会话不安全的事情几乎总是编写不佳的代码或配置不当的服务器的结果。
下面概述了您可以采取的一些措施来提高会话的安全性:
-
登录用户时始终使用
session_regenerate_id(true)
(这可以防止会话固定攻击(。 -
当您注销用户时,请始终删除客户端上的会话 Cookie(请参阅 http://php.net/session-destroy 中的第一个示例(。这可以防止用户从公共计算机登录时的会话接管攻击,例如,因为会话可能并不总是在服务器端立即删除,并且 cookie 允许客户端在服务器上重新触发会话 TTL。
-
仅通过安全连接传输会话 Cookie(请参阅
session.cookie_secure
-
为了防止某些XSS和CSRF向量,请考虑使用
session.cookie_httponly
和session.cookie_samesite
来防止恶意JS打开这些类型的攻击。 -
始终使用 CSRF 令牌以及所有修改请求,以保护用户免受严格通过会话的访问损害。这是额外的安全层。
请记住,这不是一个未删节的列表。安全性是分层构建的,需要在用例和目标中深思熟虑。