草庐IT

php - 快速高效的 PHP Session

coder 2024-01-02 原文

目前我网站上的每个页面都有以下代码。请任何人确认这是否是开始和继续 PHP session 的好习惯?

//************************************************************
//Session Settings
//************************************************************

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name);

//Set garbage collection parameters
ini_set('session.gc_maxlifetime',   $session_exp_time);
ini_set('session.gc_probability', '1');
ini_set('session.gc_divisor', '100');

ini_set('session.name', $session_name);
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains
ini_set('session.cookie_lifetime', 0);

//Set the session cookie parameters
session_set_cookie_params($session_exp_time, '/', '');

//Start or continue a session...
@session_start();

if (isset($_COOKIE[$session_name]))
setcookie($session_name, $_COOKIE[$session_name], 2147483647, '');

请注意,此脚本包含在每个页面中。

另一个相关问题:

我应该设置自定义 session 保存路径还是只使用服务器的默认 session 保存路径?优缺点都有什么?据我了解,如果您不设置自定义 session 保存路径,那么您可能会在共享主机上发生某种冲突吗?请大家帮忙指教。

提前致谢!

最佳答案

您的许多语句都涉及 session 配置设置;这些通常可以在服务器的 php.ini 或顶级 .htaccess (Apache) 中移动。

session.name = PHPSESSID
session.gc_maxlifetime = 10000

session.gc_probability = 1
session.gc_divisor = 1000

session.cookie_domain =
session.cookie_path = /
session.cookie_httponly = 1
session.cookie_lifetime = 0

你不应该让 session 持续那么久(2038 年到期); session 通常使用 session cookie 永久保存(从技术上讲,它会持续到浏览器关闭为止)。如果您想实现“记住我”功能,我建议您将其添加到您的 session 之上,如下所述:http://jaspan.com/improved_persistent_login_cookie_best_practice

我发现区分开始新 session 和恢复现有 session 很重要,尤其是在 session 仅作为登录过程的一部分创建的情况下。当 session 无法恢复时,出现了错误,用户应该被重定向回登录页面(或主页)。

PHP 不理解这种区别,如果 session 不存在,session_start 将自动创建一个 session ,更糟糕的是,如果给出任意 session ID;后者允许进行 session 采用攻击,如下所述:http://gihyo.jp/dev/serial/01/php-security/0025 - 它是日语,您必须使用浏览器进行翻译。

要确定 session 是否可以恢复,您需要通过添加特殊 key (例如 $_SESSION['_id'] = session_id())来启动每个新 session 。如果找到该 key ,则 session 已经存在,您可以恢复它;如果不是,则 session 不存在或有人试图向您提供错误的 ID。

开始一个新的session,首先要看是否可以resume;如果不是,则使用 session_regenerate_id(true) 更改 session ID(这使攻击者更难劫持 session )。

最后,共享服务器上的 session 保存路径可以写在您自己的主文件夹下,但这只有在您的共享主机与每个虚拟主机的专用用户一起运行时才有意义(即 suexec)。否则,为了保护您的 session 免受窥探攻击,您将不得不对 session 数据(可能还有 key )进行编码。查看 mcrypt 扩展:http://sg.php.net/mcrypt - 您应该能够在线找到示例。

我希望这或多或少能回答您的问题。如果您认为有任何问题,请告诉我。

关于php - 快速高效的 PHP Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10561280/

有关php - 快速高效的 PHP Session的更多相关文章

  1. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  2. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  3. ruby - 如何以表格格式快速打印 Ruby 哈希值? - 2

    有没有办法快速将表格格式的ruby​​哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:

  4. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  5. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  6. ruby - 使单元测试快速失败以进行突变测试 - 2

    mutationtesting遇到一个问题是它很慢,因为默认情况下您会为每个生成的突变执行完整的测试运行(测试文件或一组测试文件)。加快突变测试的一种方法是,一旦遇到单一故障(但仅在突变测试期间),就停止对给定突变体的测试运行。更好的做法是让变异测试者记住杀死最后一个变异体的第一个测试是什么,并将其首先交给下一个变异体。ruby中是否有任何东西可以做这些事情,或者我最好的选择是开始猴子修补?(是的,我知道单元测试应该很快。显示所有失败的测试在突变测试之外很有用,因为它不仅可以帮助您识别出问题,还可以查明哪里出了问题)编辑:我目前正在对测试/单元使用heckle。如果测试/单元不可能记住

  7. ruby - 比 Ruby 编码(marshal)更快/更有效的替代品? - 2

    我正在寻找Ruby的Marshal功能的直接替代品,希望它比Marshal具有以下一个或多个优势:更快的序列化/反序列化更简洁(或更小)的对象图谢谢!! 最佳答案 不幸的是,这不能作为替代品,因为Marshall会自动处理复杂类型。看起来msgpack将需要构建额外的功能(如Marshal的内部结构)将迭代定义相关对象的Ruby结构。 关于ruby-比Ruby编码(marshal)更快/更有效的替代品?,我们在StackOverflow上找到一个类似的问题:

  8. ruby-on-rails - Rails 和 partials,是否有更有效的编写方法...? - 2

    我有一个像这样的循环部分......"thingy",:locals=>{:something=>something,:thing=>thing}%>这看起来不太正常,我想知道是否有更有效的方法将分音放在循环中。 最佳答案 将您的部分从'thingy'重命名为'thing'并执行此操作:{:something=>:goatse}%>我想不出更多的Railsy。 关于ruby-on-rails-Rails和partials,是否有更有效的编写方法...?,我们在StackOverflow上

  9. ruby - 使用和不使用 Rails 的快速 (Rspec) 测试 - 2

    我有两个类:1.Sale是ActiveRecord的子类;它的工作是将销售数据持久保存到数据库中。classSale2.SalesReport是一个标准的Ruby类;它的工作是生成和绘制有关销售的信息。classSalesReportdefinitialize(start_date,end_date)@start_date=start_date@end_date=end_dateenddefsales_in_durationSale.total_for_duration(@start_date,@end_date)end#...end因为我想使用TDD并且我希望我的测试运行得非常快,所

  10. ruby - 快速FTP服务器 - 2

    我正在寻找一个快速、无需配置的FTP服务器。完全像Serve的东西或Rack_dav,但对于FTP,它可以通过运行命令来发布文件夹。是否有gem或其他东西可以做这样的事情?解决方案基于Wayne的ftpdgem,我创建了一个快速且易于使用的gem,名为Purvey. 最佳答案 ftpdgem支持TLS,并带有文件系统驱动程序。与em-ftpd一样,您提供一个驱动程序,但该驱动程序不需要做太多事情。这是一个最低限度的FTP服务器,它接受任何用户名/密码,并提供临时目录中的文件:require'ftpd'require'tmpdir'c

随机推荐