使用会话变量保护应用程序的最佳方法是什么?

时间:2015-08-01 07:00:45

标签: php security session

我有一个带索引页面的应用程序,用户可以在其中输入登录名和密码。然后它们作为POST变量提交,如果它们都正确,我的脚本会创建一个会话var,如下所示:

$_SESSION['auth'] = $login;

并且索引页面回显菜单。如果不是,则再次显示登录窗口,就好像用户第一次进入索引页面一样(在必填字段下面显示错误消息)。

现在,我验证是否设置了会话变量:

<?php
include 'functions.php'; //this file contains session_start() 
if (!isset($_SESSION['auth'])) {
        header("Location: index.php");
        exit();
    }
?>
<html>
Html stuff with jquery...
</html>

我是否必须在else语句中将所有html内容放在括号中,或者我的页面是否足够安全?即使用户被重定向,html部分仍然由他的浏览器获取,不是吗?

我的服务器上有几个PHP页面,在每个页面的开头我都进行了与上面相同的测试。当用户进入索引页面时我也会进行此验证(如果他已经登录,我不希望他再次登录)。

假设我的脚本是安全的(在服务器端检查用户提供的所有信息),使用安全会话的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您考虑安全性非常棒,但请允许我解释一下会话和会话cookie的工作原理。

首先,cookie只允许存储在其中的有限数量的数据,我忘记了多少,但我知道它不是无限的。那么服务器如何允许您存储所有会话数据。实际的会话cookie只存储会话ID。在服务器上有一个实际的物理文件,其中包含会话数据。因此,当客户端连接时,它们会发送会话ID,而会话ID又会告诉您要使用的文件。因此,会话与severs文件系统和用于创建cookie的id的算法一样安全。没有实际的会话数据(除了那个id)离开服务器。

据说有2个设置可能有助于确保会话安全。

这些是httponly和安全的,你可以在这里阅读更多关于它们的信息

http://php.net/manual/en/session.configuration.php#ini.session.cookie-httponly

现在缺点是,安全意味着仅通过Https传输会话数据(会话ID),这仅在您的服务器和网站上设置了https时才有效。 Httponly告诉浏览器,cookie应该只通过http(或https)发送,而不是通过客户端脚本发送。但是,由于您无法控制客户端使用的浏览器,或者他们的计算机是否以某种方式受到了损害,否则会告诉浏览器(尽管我不知道任何可能会有这样做的漏洞利用),您实际上只是制作了一个建议客户端机器。

现在,就实际数据的安全性而言,任何来自任何地方的输入,甚至是您自己的数据库,都应该被视为潜在的不安全因素。这并不意味着你必须在任何地方检查它,主要是你在输出到页面时转义html,并且你使用适当的方法来阻止sql注入数据库。作为一般规则,这些应该在入境点完成。

例如,在将内容输出到不应该包含html的页面时,只需使用html_entities等。输出时。在sql中使用数据时,请在那里使用预处理语句。您发现每次触摸时都不需要检查$ _POST数据,只需在将数据用于可能被利用的内容之前检查数据,例如将其保存在数据库中。

让我们看一个小例子函数(假设它在用户类中)

 public function getUser( $id ){
      $sql = "Select * from user where id = $id"
       //execute sql
 }

我们永远不会使用PDO这样做,但我们假设这是旧学校的东西,你从其他地方的登录表单中过滤数据,所以当你设置它时你会认为它总是一个干净的id,因为你在登录表格。然后,您需要会话中的用户。那么你也有id,所以你使用它。现在是会话中的id干净,谁知道对。也许它是来自文件或其他一些不起眼的地方的id。谁知道Id可以来自哪里(当我们创建用户类时)。所以我们现在做的是检查或使用准备好的声明“在我们使用的时候”数据,即入口点。然后我们不关心数据来自何处。因为,在我们在数据库中使用它之前,它总是在准备好的语句中被清除。这样它总是100%,毫无疑问,干净。我们可以在那里看到它从哪里运行查询。如果我们后来创建一个新的登录表单,我们不必担心。也许你在某处添加一个弹出式登录表单?没关系,你的SQL总是干净的。现在,我不是说不要在登录表单上查看它。永远不要伤害安全,更不用说你可能想要验证那里的其他东西,电子邮件格式,用户名的唯一性等等。但是,关键点,包括在内。

有意义吗?

解决您关于不使用Cookie的评论(我应该在开头解释这一点)。就其本质而言,互联网是无国籍的。这意味着每个页面重新加载本质上都是一个新连接。维护登录(或跨重新加载的任何数据)的唯一方法是在请求之间传递一些数据。通常只有几种方法可以做到这一点,它们是 $_POST$_GET$_FILE$_COOKIES。注意它们是如何格式化的,这是一个提示,它们被称为超级全局变量。

http://php.net/manual/en/language.variables.superglobals.php

顺便说一下,我们让Netscape感谢Cookies和Javascript,这两个IE“借来”,对我来说很难过,我再也看不到Netscape Navigator了。我记得从AOL 3.0天开始,那是在您将图像嵌入电子邮件之前。你的老定时器知道我在说什么...... Churr.Beep.bong.Cherrrk (各种模拟调制解调器噪音)...流媒体视频是什么,下载一首歌就像1.5天。 &安培; Pr @ y 2 teh GodT of deTerWeBz MomZ do4't g3t a [call .... L33t BaBy&gt; :-)~ ^ v ^