使用PHP维护负责任的会话安全性有哪些指导原则? 整个网络上都有信息,这是关于它们在一个地方落地的时间!

===============>>#1 票数:88 已采纳

要确保会话安全,有几件事要做:

  1. 在对用户进行身份验证或执行敏感操作时使用SSL。
  2. 每当安全级别更改(例如登录)时重新生成会话ID。 如果您愿意,您甚至可以在每个请求中重新生成会话ID。
  3. 会议超时
  4. 不要使用寄存器全局变量
  5. 在服务器上存储身份验证详细信 也就是说,不要在cookie中发送用户名等详细信息。
  6. 检查$_SERVER['HTTP_USER_AGENT'] 这为会话劫持增加了一个小障碍。 您还可以检查IP地址。 但是,这会导致由于多个Internet连接上的负载平衡而导致IP地址发生变化的用户出现问题(在我们的环境中就是这种情况)。
  7. 锁定对文件系统上会话的访问或使用自定义会话处理
  8. 对于敏感操作,请考虑要求登录用户再次提供其身份验证详细信息

===============>>#2 票数:15

一个准则是每次会话的安全级别更改时调用session_regenerate_id 这有助于防止会话劫持。

===============>>#3 票数:11

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

  • 不相信任何人
  • 过滤输入,转义输出(cookie,会话数据也是你的输入)
  • 避免使用XSS(保持HTML格式正确,请查看PHPTALHTMLPurifier
  • 防御深度
  • 不要暴露数据

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

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

在本书的主页上,您将找到一些有趣的代码示例和示例章节。

您可以使用上面提到的技术(IP和UserAgent),如下所述: 如何避免身份盗用

===============>>#4 票数:11

我认为其中一个主要问题(在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');

===============>>#5 票数:9

这个会话固定文件有很好的指针可能会发生攻击。 另请参阅Wikipedia上的会话固定页面

===============>>#6 票数:5

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

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

===============>>#7 票数:3

这非常简单明了,但每次使用后都要确保session_destroy 如果用户没有明确注销,则可能难以实现,因此可以设置计时器来执行此操作。

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

===============>>#8 票数:3

我把会议设置得像这样 -

在登录页面上:

$_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();     
}

===============>>#9 票数:3

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

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

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

===============>>#10 票数:3

php.ini中

session.cookie_httponly = 1
change session name from default PHPSESSID

eq Apache添加标题:

X-XSS-Protection    1

===============>>#11 票数:2

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

检查文件夹及其父项的权限。 它不应该是公共的(/ tmp),也不应该由共享服务器上的其他网站访问。

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

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

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

===============>>#12 票数:2

我会检查IP和用户代理以查看它们是否发生变化

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}

===============>>#13 票数:2

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

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

  ask by saint_groceon translate from so

未解决问题?本站智能推荐:

关注微信公众号