提醒:本文最后更新于 3424 天前,文中所描述的信息可能已发生改变,请仔细核实。
说要把 PHP 更新到5.6也不是一天两天了。前期做了很多准备,检查了所有这台 VPS 的线上项目,特别是把 PHP 所有过期代码更新为新函数。所幸没遇到坑。
然后因为最近也比较忙,每天很晚才到家,所以没有执行更新操作,经常大清晨就有人打电话来找。诶。
最近爆出 PHP 远程 DoS 漏洞,官方编号
69364(CVE-ID: 2015-4024)。几乎覆盖全版本。该漏洞利用 PHP 多次合并 boundary 里的参数,从而造成多次内存分配和拷贝,使得CPU资源占用100%,造成性能下降。攻击者利用并发多包的方式,可以达到使目标系统拒绝服务的目的。我使用的5.5.20版本,也在影响之列。
略微做了测试,发现被我做的规则挡掉了,还好,还好。
据我所了解的,微博用的最多了(Multipart/form-data),虽然我使用微博API并不完全遵从此协议(补充:所以旧的请求模式已经被拒绝了,过段时间再修复下文章同步微博的问题)。
攻击者可通过发送一个 2M 左右的包含多行 multipart 头部数据的 HTTP 请求来发起攻击,无需认证,也不依赖 PHP 程序本身的内容。例如,通过发送畸形请求,每隔若干秒,同时并发多个这样的请求,就会耗尽目标主机的 CPU 资源。
目前PHP 5.4、5.5、5.6均有官方版本解决该漏洞,其他更低版本PHP,也有民间组织做好了 patch 补丁。
星期四晚,比较累,睡了个早觉,星期五晚上,一大早,就把PHP升级到5.6.9,解决潜在问题,顺便把每个项目做一次调试,一切正常。发现离上班时间还早,遂把Nginx也给升级到最新版本1.9.0。
据说Nginx 1.9.0比较有特色的是流模块支持 TCP 代理和负载均衡(删除过时的 aio 和 rtsig 事件处理方法、还有可在 upstream 块中使用 "zone" 指令)。不过我都不需要用到。
Stream 模块(ngx_stream_core_module)在1.9.0后的版本将被启用。但是并不会默认安装,需要在编译时通过指定 --with-stream 参数来激活这个模块。
最后跑了一天,感觉上,没什么差异吧。反正正常就是了。
最后最后,把漏洞分析放上来:
HTTP协议中,multipart/form-data中可以包含多个报文,它们被合并在一个复杂报文中发送,每一个部分都是独立的,以':'分隔各自的参数和值,不同部分的报文通过分界字符串(boundary)连接在一起。
PHP中实现了解析multipart/form-data协议的功能,在解析时,当出现一个不包含':'的行,且之前有一个有效键值对,则说明该行是上一个键值对里的值,PHP会将值拼接到上一个键值对里。在拼接的过程里,PHP进行了一次内存分配,两次内存复制,以及一次内存释放。当出现多个不包含':'的行时,PHP就会进行大量内存分配释放的操作,从而导致消耗CPU资源性能下降。短时间多次发送这类畸形请求将导致目标服务器DoS。
转载请注明转自: kn007的个人博客 的《平滑升级到PHP 5.6.9,顺带升级Nginx 1.9.0》

@World: nginx我是从1.7.10升到1.9.0的,php5.3到5.5就有一些函数不同了。升到5.6也是为了升PHP 7 做准备。
@kn007: 你就不怕到7的时候 函数大变啊
@World: 大变就大改呗。这个又没什么办法,追求总是有牺牲的
@kn007: 折腾吧你
才发现 你评论的 “@作者” 上是加了一个上条回复弹框显示的 我还以为是tooltip
@World: 不是,只是获取该页的被评论内容。无法跨页,跨页需要生成请求,以前有的,但是被人攻击了,所以就没搞
@World: 说实在的,PHP5.6我感觉比PHP5.5消耗性能,效率也没见提高多少。要说嘛,就只是内存管理上,比5.5好。
@kn007: 喜欢就好,我无所谓了,还用着5.3 哈哈
@World: 新版本有很多新的功能,而且性能也会提高。
我觉得转变最大的,就是一些定义方法的提升。还是比较实用的的。
@kn007: 不折腾先 等7吧 这个月流量都超2G了
那个跨页不是指评论分页的这个页吧
@World: 是指评论分页的页。
@World: Nginx已经习惯其平淡稳定了。
@kn007: LICEcap 在Z大 那发现的一个小软件 推荐给你 哈哈 不错哈
@World: 早已有
用VPS就需要这么折腾!
@Meekdai: 虚拟主机是想折腾,折腾不了,想用用不了
@Meekdai: 你那里不能匿名评论。。。话说土豪台式机啊。。。BB-8也是好可爱。“一生一次的吻 一生一次的爱恋”图已收
@kn007:

请教一下,你这悬浮显示 @ 回复咋实现的呢?找过好多教程都没折腾成功。
@老杨: 对评论的@增加class属性,对这个class属性做hook,当hover读取父id评论,顺带显示。
@老杨: 如果需要支持评论翻页,需要输出带评论页面的标签(如comment-page-1/#comment-15855),然后做一次ajax请求读取。这样翻页也可以获得@的内容。
@kn007: 屎!就一个获取DOM内容!
@大发: 这是我的法子,你可以你来。我是没时间重写代码了。
@大发: 大神,来个教程吧。
@大发: 确实可以,不过我那很多旧数据处理不了,只能扒了 007 的

@老杨:
又改用大神的了,js 扒了个 mousemove 效果。
@老杨: 嗯,好,大发那个我看了,还不错,js可以再简化,而且jq按那种写法,必须是1.9以上的
@老杨: 被你一说,就手痒了。
1.大发那个自动at的function好老了,我已经换成新的过滤对象,对你来说可能作用不大,有用侧边栏最近评论的就会有用,还有评论邮件的at也能兼容显示。
2.把loper的respond乱跟随小bug修复。(以前按回复按钮,有时都不知道是回复那个,如果在textarea没有@的话,现在保证在指定回复评论之后)
3.跨页跨文章也能显示评论内容了,不过这个功能不大实用了现在,不知要不要保留。你可以直接扒。(效果见:获取友情链接的一条留言)晚点可能就丢掉这个功能。目前能想到的就是文章引用评论,可以显示。
@kn007:
1、新的过滤对象?分享一下?
2、这个对我好像没用,嘻嘻。
3、跨页跨文章也能显示评论内容?——这个没看到有 demo 效果呢。
另外,我用的 zww 大叔改过的无限嵌套回复,所有子评论都是 @主楼层 的,不知道你这里是不是这样。
@老杨: 上一条评论中的“获取友情链接的一条评论”就是效果啊。
迟点分享,我这里不止at主楼。我也是无限嵌套的,不过都是自己搞的,没看过zww的方法。
@kn007: 看到效果了,用的是这个 http://zww.me/archives/25191,会改掉 @的楼层的。
@老杨: Z大这个改起来就比较麻烦了。
@kn007: 是啊,你这是和木木帅类似的方法么?http://immmmm.com/wordpress-unlimited-nested-comments.html
看你的也是不能按回复时间排序评论呢。
@老杨: 有点类似,我是按评论嵌套显示的,排序按嵌套排序的。。囧,所以必须有at来辅助
1
1 1
1 1 1 1 1 1
1 1 1
@kn007: 这个class访客回复能写进去?我自己试过不行的,还是大发那个不写数据库的好点吧?如果能实现这条评论跑到最后去就完美了。
@老杨: 我喜欢独立嵌套,至于写不写数据库,仁者见仁智者见智,下篇文章,我会提到的。
@kn007: 嗯,期待……
@老杨: 已发,略作参考吧。
https://kn007.net/topics/show-at-reply-tip-from-different-page/
发现自己现有的一些js好乱,大多保留原主题的js,以后找时间再改改。
@老杨: 需要刷新浏览器缓存,js需要更新
@kn007: 快拿出来

@World: 回头,很忙
@World: 发了, https://kn007.net/topics/show-at-reply-tip-from-different-page/ 。
我的安全意识不高
@满满都是爱|天长地久: 这个慢慢来
比较懒,也没啥项目,就一破网站,应该没大神那么无聊,遂未折腾。
@WordPress主题: 不是大神。网站贵在持之以恒。慢慢加油吧。话说网站很漂亮。
折腾一族总在不停升级的路上
@锋子: 正常
我是菜鸟不太懂,主机可以设置php版本,只能设置到5.5,太新的主题什么会不会不支持一些小东西呢。
@酒衫: 你应该是想问太新的PHP会不会支持一些主题吧?
新的主题一般会支持新版php,一般主题制作者会提供版本要求。
一般来说,php版本更新不会影响什么,可能会有一些古旧的插件或主题,使用了废弃函数而被警告
@kn007: 是的,我说的可能有歧义,抱歉。现在用着没问题,应该是可以的。谢谢博主解答。
@酒衫: 没事啦~
Nginx 1.9.0 似乎还不是Stable
@imlonghao: mainline版本,会有小版本更新,现在1.9.1了
@kn007: 我用的是 Dotdeb 的源,他们只更新到最新的 Stable ,所以也就Nginx1.8.0了。
现在在等Nginx支持http2
@imlonghao: 程序版本我一般都通过编译来更新。centos6,没办法,虽然也有源,但是更新不够快。
@kn007: 其实为什么要用centos?
@imlonghao: 其实只是因为习惯了。桌面或许会考虑ubuntu。
太专业了,表示不懂
@皇家元林: 额
VPS就是适合折腾的,任性啊,随你改,哈哈。
@郑永: 嘿嘿,瞎折腾