PHP会话安全

用PHP维护责任会话安全的一些准则是什么?网络上有信息,它是关于所有时间都落在一个地方的时间!

0
额外 编辑
意见: 2

14 答案

这是我认为你需要做的

使用WP 3.0在新的“主”域上创建一个新的多站点博客

创建一个新的空博客网址h..p://www.mysite.com/oldblogname

导出旧网站并将inport输入到新博客中

您需要检查所有图像是否被复制到新网站中,否则请保留旧博客以提供图像

你会有我很好的新博客

为了保持整洁,你应该把旧的URL重定向到新的URL

像这样的东西应该(不测试)到旧的博客文件夹中的.htacces文件中

RewriteEngine on
#
RewriteRule ^(.*)$ http://www.websiteA.com/oldblogname/ $1 [R=301,L]
1
额外

我认为其中一个主要问题(在PHP 6中正在解决)是register_globals。现在,用于避免 register_globals 的标准方法之一是使用 $ _ REQUEST$ _ GET$ _ POST 数组。

做到这一点的“正确”方式(从5.2开始,虽然它有一个小错误,但是即将到来的6稳定)通过过滤器

所以,而不是:

$username = $_POST["username"];

你会这样做:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

甚至只是:

$username = filter_input(INPUT_POST, 'username');
0
额外
我同意,这并没有完全回答这个问题,但它肯定是问题答案的一部分。再一次,这在接受的答案“不要使用注册全局变量”中写出了一个要点。这告诉做什么来代替。
额外 作者 cmcculloh,
真?那么为什么他们在接受的答案中提到不使用注册全局变量?就大多数普通开发人员而言,就算它不是技术上的“会话”对象的一部分,对于大多数普通开发人员而言,注册全局变量和形式变量处理都不属于“会话”范围?
额外 作者 cmcculloh,
这与这个问题根本没有关系。
额外 作者 The Pixel Developer,
-1这不回答问题。
额外 作者 Tomas,

一条准则是每次会话的安全级别发生变化时调用 session_regenerate_id 。这有助于防止会话劫持。

0
额外

我会检查IP和用户代理,看他们是否改变

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
0
额外
@scotts我同意IP部分,但对于浏览器升级,您可以在登录时设置会话,这样我就不会看到他们如何在浏览器中升级,而无需在他们再次登录后创建新会话。
额外 作者 JasonDavis,
@jasondavis有一个名为Chrome的浏览器。
额外 作者 Pacerier,
我相信在IE8兼容模式之间切换时,user_agent也可以改变。假冒也很容易。
额外 作者 Heather Herbert,
如果用户位于负载平衡代理服务器场的后面,则IP可以合法更改。
额外 作者 Kornel,
是的,但那些拥有静态IP eq GSM的用户每半小时更换一次。所以,在Session +主机名中存储IP,WHEN IP!= REMOTE_ADDR检查主机并比较hostanmes eq。 12.12.12.holand.nl-> holand.nl == true。但是有些主机有基于IP的主机名那么需要比较掩码88.99.XX.XX
额外 作者 user956584,
每当用户升级浏览器时,user_agent都可以更改。
额外 作者 scotts,

为了确保您的会话安全,您需要做几件事情:

  1. 在验证用户或执行敏感操作时使用SSL。
  2. 每当安全级别发生变化(例如登录)时重新生成会话标识。如果愿意,您甚至可以在每次请求时重新生成会话ID。
  3. 让会话超时
  4. 不要使用注册全局
  5. 在服务器上存储身份验证详细信息。也就是说,不要在cookie中发送诸如用户名等详细信息。
  6. 检查 $ _ SERVER ['HTTP_USER_AGENT'] 。这为会话劫持增加了一个小障碍。您也可以检查IP地址。但是,由于多个互联网连接上的负载均衡等原因,这会对因IP地址发生变化的用户造成问题(这是我们的环境中的情况)。
  7. 锁定对文件系统上会话的访问或使用自定义会话处理
  8. 对于敏感操作,请考虑要求登录用户再次提供其认证详情
0
额外
如果您重新生成会话ID,那么攻击者在非HTTPS请求中窃取的会话ID将毫无用处。
额外 作者 grom,
@The Rook,它可能是一个微不足道的障碍(攻击者可以使用自己的站点捕获受害者的用户代理),并依靠默默无闻的安全性,但它仍然是一个额外的障碍。如果User-Agent HTTP在会话使用期间发生变化,那么它将非常可疑并且很可能是一次攻击。我从来没有说过你可以单独使用它。如果将其与其他技术结合使用,则可以获得更安全的网站。
额外 作者 grom,
@The Rook,是的用户代理可以被欺骗。它只是一个小小的障碍。而且,你的意思是,cookie不能通过http泄露。是的,它可以被盗。 http是纯文本。
额外 作者 grom,
@grom当Chrome浏览器在用户使用浏览器时在后台无提示升级时,Chrome是否会自动更改它的用户代理?通过这种方式,您没有真正的好理由阻止真正的用户。不要忘记,增强的可用性也增强了安全性。
额外 作者 Pacerier,
@我觉得它就像是把一片透明胶带放在你家门口,并说它会阻止人们进入。
额外 作者 rook,
从唯一的障碍是你头脑中的障碍,你不停止攻击。
额外 作者 rook,
该死的,我希望我能给你另一个使用ssl的-1。在任何时候cookie都不能通过http泄漏,OWASP A3中规定了这些。
额外 作者 rook,
-1用户代理很容易欺骗。你所描述的是浪费代码,而不是一个安全系统。
额外 作者 rook,
仅对某些操作使用SSL是不够的,除非您有加密和未加密流量的单独会话。如果您通过HTTPS和HTTP使用单个会话,攻击者将在第一个非HTTPS请求中窃取它。
额外 作者 Kornel,
不要在每个请求中重新生成会话。它容易受到竞争条件的影响,迟早会失去会话。
额外 作者 Kornel,
我同意porneL。另外,对于6号,如果攻击者拥有你的会话ID,他们是否也有权访问你的用户代理?
额外 作者 Chad,
如果您正在检查用户代理,您将在切换兼容模式时阻止来自IE8用户的所有请求。查看我在自己的代码中追踪这个问题的乐趣: serverfault.com/questions/200018/ HTTP-302问题上IE7 。正如其他人所说的那样,我正在将用户代理检查出来,因为这是欺骗性的小事。
额外 作者 bestattendance,

这是相当琐碎和明显的,但一定要 session_destroy 每次使用后。这可能是难以实现的,如果用户没有注销明确,因此定时器可以设置做到这一点。

这里是关于setTimer()的一个很好的教程。和clearTimer()。

0
额外

根据我的经验,使用IP地址并不是最好的主意。例如;我的办公室有两个IP地址根据负载而被使用,并且我们经常遇到使用IP地址的问题。

相反,我选择将会话存储在我的服务器上的域的单独数据库中。这样,文件系统上没有人可以访问该会话信息。这对于3.0以前的phpBB真的很有用(他们已经解决了这个问题),但我认为这仍然是一个好主意。

0
额外

我的两个(或更多)美分:

  • 不信任任何人
  • 过滤器输入,转义输出(cookie,会话数据也是您的输入)
  • 避免使用XSS(保持HTML格式良好,请参阅 PHPTALHTMLPurifier
  • 纵深防御
  • 不要公开数据

关于这个主题有一本很好的书: Chris Shiflett的基本PHP安全

基本PHP安全性http://shiflett.org/images/essential-php-security-small.png</一>

在本书的主页上,您会发现一些有趣的代码示例和示例章节。

You may use technique mentioned above (IP & UserAgent), described here:

How to avoid identity theft

0
额外
+1用于XSS预防。如果没有这些,就不可能防止CSRF,从而有人可以“骑”会话而不会获得会话ID。
额外 作者 Kornel,

如果您使用 session_set_save_handler()可以设置你自己的会话处理器。例如,您可以将会话存储在数据库中。有关数据库会话处理程序的示例,请参阅php.net注释。

如果您有多个服务器,则DB会话也很好,否则,如果您使用基于文件的会话,则需要确保每个Web服务器都可以访问相同的文件系统以读取/写入会话。

0
额外

This session fixation paper has very good pointers where attack may come. See also session fixation page at Wikipedia.

0
额外

php.ini中

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache添加标题:

X-XSS-Protection    1
0
额外
请注意, X-XSS-Protection 根本没有用处。事实上,保护算法本身实际上可能被利用,使其比以前更糟糕。
额外 作者 Pacerier,
你能详细说明吗?
额外 作者 domino,
(php | phtml | aspx | htm | html)$“> Header set X-XSS-Protection”1“</ FilesMatch>
额外 作者 user956584,

PHP会话和安全性(除了会话劫持)的主要问题来自您所处的环境。默认情况下,PHP将会话数据存储在操作系统临时目录中的文件中。没有任何特殊的想法或计划,这是一个世界可读的目录,所有的会话信息都会被任何有权访问服务器的人公开。

至于维护多个服务器上的会话。此时,将PHP切换到用户处理的会话会更好,因为它会将您提供的函数调用到CRUD(创建,读取,更新,删除)会话数据。此时,您可以将会话信息存储在数据库或memcache之类的解决方案中,以便所有应用程序服务器都可以访问数据。

如果您位于共享服务器上,则存储您自己的会话也可能是有利的,因为它可以让您将其存储在数据库中,而您通常可以对该文件系统进行更多的控制。

0
额外

你需要确保会话数据是安全的。通过查看你的php.ini或使用phpinfo()你可以找到你的会话设置。 _session.save_path_告诉你他们在哪里被保存。

检查文件夹及其父母的许可。它不应该是公共的(/ tmp),或者可以被共享服务器上的其他网站访问。

假设您仍想使用php会话,您可以通过更改_session.save_path_将php设置为使用其他文件夹,或通过更改_session.save_handler_将数据保存在数据库中。

您可以在您的php.ini文件(某些提供程序允许)或apache + mod_php中设置_session.save_path_,在您的站点根文件夹的.htaccess文件中: php_value session.save_path“/home/example.com/html/session”。你也可以在运行时用_session_save_path()_设置它。

检查 Chris Shiflett的教程Zend_Session_SaveHandler_DbTable 来设置和替代会话处理程序。

0
额外

我把我的会议设置成这样 -

在登录页面:

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);

(在配置页面上定义的短语)

然后在网站其他部分的标题上:

session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
    header('Location: http://website login page/');
    exit();     
}
0
额外