以下文章归类于 ‘技术类’

对 Windows Server 2008 和 2008 R2 的支持已于 2020 年 1 月 14 日结束。这意味着定期安全更新也已终止。

终于收到通知,server2008算是正式退出历史舞台。当时选择实例配置时,图便宜选了server2008。没想到过了没多久,就得升级了。server2008不是不能继续用,而只是不再得到微软支持,这意味着未来得不到任何安全升级。现在这个网络环境,这个风险不好说不大。

好在腾讯云还算有点良心,2008升级到2012免费。但免不了折腾一番,大量配置要重新来过不说。本来我觉得自己已经有了足够的备份,竟然还是把SSL证书给忘了。翻了老久的邮件,重新下回来,翻来覆去弄了一下午,总算恢复网站。

说到网站,目前Blackhack的版本是2.4.2,在github上的发行版本是2.4.1。除了修复了几处BUG外,还新作了网页图标。不过这里还有个问题,当时在修复BUG的时候,因为失误导致丢失了微博API的Access token。按理说,继续使用微博的PHP SDK应该能找回来,但死活不行,不知道为什么。最后还是参照文档,post到指定地址后才弄回来。是这个SDK不能用了吗。

左半红印发表于2020.03.18th

这是一个wordpress在各类升级中经常会碰到的一个错误,尤其是当你的wordpress架设在国内的时候,wordpress.org对国内的访问并不友好。所以在升级时会有类似下面这样的报错。

cURL error 28: Connection timed out after X milliseconds
cURL error 28: Operation timed out after X milliseconds with Y out of Y bytes received

首先让我们知道cURL是PHP的一个库,wordpress借助它与其他站点进行传输。所以我们看到的报错信息是cURL error。

报错可能引起的原因有两种,一种是本身对方服务器就无法访问,或者是链接错误等等,也就是说是真的没法访问。这里我说的是第二种,因为国内链接速度过慢,导致在规定时间内无法完成下载。所以这时候我们需要修改配置文件。php.ini的修改就不说了,我并不知道是否对该错误有效。因为我的配置文件中本来就设置的足够长。然后让我们看看其他设置。

先是wp-includes/class-http.php

查找里面的timeout,新版的wordpress的配置文件大都遵循现将配置参数放在一个数组里面,数组名字通常是$defaults。里面的timeout默认设定是5,修改它到10。然后试试,请注意这也不一定是个有效的修改,可能依然还会报错。

接下来是wp-includes/class-wp-http-curl.php

这应该会是一个有效的修改,同样搜索timeout,默认依然是5。改的足够大吧,大道让你服务器缓慢的链接速度足够下载更新。

请注意,以上所有设定的修改都可能需要php环境的重启才会生效。

感谢Samuel Aguilera的http://www.samuelaguilera.com/post/curl-error-28-wordpress 本文的大部分内容出自该篇文章。

弑神发表于2020.02.15th

这里我不会详细的讲这个网站我所做的事情,只是随便聊聊。网络就像一个区别与现实世界的另一个世界。进去之前总觉得那个世界里面什么都好,充满了张扬的个性和自由。而真正进去后,会很自然的发现任何一个世界都有阴暗的一面,都存在你没有做错任何事情却受到攻击的情况。

如果你也用wordpress,这里我推荐一款插件叫 WP Statistics 。需求php5.6,兼容至最新的wordpress版本。如果你不是很懂php的log的话,这款插件能让你很直观的了解你的网站被访问的情况。然后,你就能发现一些问题。

为什么有人会访问我的网站IP地址而不是域名?为什么会有一个叫做site.ru的网站不停的转发访问者过来?为什么很多访问者会访问各种各样根本不存在页面?所有这些问题最直接的反应就是,我的网站正受到各种“机器人”的访问,可能是出于挖掘网站漏洞的目的,也可能是出于就是想占用服务器带宽的目的,或者其他。我并不是一个专业的网站建造人,更不是运维。只能从眼睛能看到的问题着手。

先来处理那些访问不存在网页的请求吧。

我到现在才发现,我的网站连个404页面都没有,这意味着任何不存在的网页都会以网站首页显示。这个问题最容易解决了,建立一个404.php即可,内容写你喜欢的。

然后是IP访问

为什么要禁止IP访问呢?我不是很懂,通过网络的查询,了解到是防止“恶意解析”。简单说就是如果一个网站可以通过服务器IP来直接访问的话,那么任何人都可以解析任何域名到你的网站,你介意吗?是的,我介意。特别是国内,我站是一个经过实名备案的正规网站。这里我多说一点,要达成域名访问网站通常有两个步骤,一是解析域名到服务器,二是服务器绑定域名。如果服务器IP可以直接访问网站,那么就意味着略过了第二步,用第一步就可以达成域名访问服务器的目的。

以php主机为例,比如apache。网上的方法通常是修改httpd.conf文件。但这里我需要重点说明一下的是如果你的网站启用了.htaccess文件。那么无论怎么修改httpd.conf都会无效的。最简单直接的方法是修改.htaccess文件。这个问题坑了好久好久。

最后是限制访问

site.ru是一个无法直接访问的网站,如果通过百度查找也查不到任何信息。但是如果你通过google查找该网站的话,就会发现很多人都在抱怨site.ru对其网站的恶意访问。实际情况我查找了一下得出的结论是,site.ru要么是某个人故意架设或者是架设后就不再管理,导致这个域名被大量网络攻击者利用。大量打着site.ru名头的引用会不停的查找你的网站是否存在某某php,用以获取某些已知的漏洞。最简单的方法就是限制其访问,同样通过编写.htaccess文件实现。

弑神发表于2019.07.31st

像我这样的初学者会犯这样的错误,简单说就是实例化后,引用出现报错。

我的需求是某个JS函数不断运行,当然这回占用用户CPU。不过是个人博客嘛,而且funcation很小,占用量很低。所以这里先简单说一下,循环funcation的用法。

funcation XunHuan(){} //这里是需要循环的函数
var newXunHuan = new XunHuan();

如果执行XunHuan(),是没有办法执行第二次的。或者说执行第二次也不会生效。所以需要new来实例化,然后反复new来实现重复执行XunHuan()

然后这里就个问题了,按照以往JS经验定义funcation并不会直接执行,还需要调用。比如:

funcation XunHuan(){}//这里是定义
XunHuan();//这里是调用

依照上面的理解,定义了实例化后,是不是也要单独调用呢?比如:

funcation XunHuan(){}
var newXunHuan = new XunHuan();
newXunHuan();

事实是如果按照上面这么写会报错

Uncaught TypeError:  newXunHuan  is not a function

这是实例化的不一样的地方,通过new funcation后实际上并不再需要单独调用,它自己会调用。

funcation XunHuan(){}
var newXunHuan = new XunHuan(); //实例化,自动调用

左半红印发表于2019.07.14th

在网上搜索标题的话,你会发现绝大部分解决方案都是把notice报错关闭。这不扯淡吗!?掩耳盗铃而已,真的难以置信这种解决方式竟然还被大量转载好像PHP本身就疯了一般没事给你报这个错误。

到7.x版本后,这个notice会升级成warning,并告诉你在未来会再次升级错误等级。那是不是以后就都关了啊?!这个问题其实非常简单,只需要仔细检查代码和研读一下手册,你就会发现一些细节上的问题导致了这个错误的产生。

举个例子,在php中获取日期

date(Ymd)

好像没什么问题对不对,教程里也是这么写的,date()函数,Y参数是年,m参数是月,d参数是日。没错啊!

再去回头看看教程,如果实在觉得没区别就看看php手册。这么写肯定是会报错Use of undefined constant。因为正确的写法是:

date("Ymd")
date('Ymd')
弑神发表于2019.07.12th

这年头你是想浏览器地址栏左边一直显示着“不安全”还是那把锁?对于一个个人博客来说,我又不需要网上支付,而且只是一个边缘小众blog到底怎么看待这事。我想全取决于管理员你到底看着舒服还是不舒服,而我本着学习折腾的精神,觉得不舒服,决定开始折腾。

这玩意简单来说就是找个机构给你发个证书,把你的链接信息进行加密然后告诉浏览器你的网站是安全的。第一反应是找个牛逼的大网站然后看看他家用哪家的证书就一定没错,是的,我第一次找了GlobalSign……见鬼了,他家不是给个人用户用的,一年好几百。找朋友咨询了一下,Let’s Encrypt是个不错的选择,免费,自动续期,尽管针对Unix系统,但win下也是可以的。可前提是你可以完全掌控你的操作系统,这意味着你需要一个云服务器而不仅仅是一个虚拟主机。OK,它的事情到此为止,在我这小站搬家后我会尝试。但现在我只有虚拟主机,所以无奈之下只能选择买证书,网上看到getssl不错,Certum的证书酸能接受,100块两年。开始折腾吧。

申请不是问题,遇到的第一个问题是Certum需要你证明自己是你申请域名的所有者,并提供三种证明的方法。第一种是根据whois信息中的email给你发邮件,但我不确定国内注册域名是什么情况,结论是找不到whois我的email。可能是找不到也可能是那个email就不是我的,无论如何这种情况很操蛋。第二种方法,在你的主机目录下建立一个包含一段代码的TXT文件,并让它能够被访问。这似乎是个可行的方法但我的结果是,这个TXT文件我可以无障碍浏览其他人不行,真TM见鬼了!OK,最后一种方法,在域名注册商那里的DNS解析里增加一个TXT记录。在这之前我都不知道原来DNS里还能添加TXT记录,这次也算是学到了。结果对面还是获取不到那段记录,我当时就觉得自己快疯了。还好在与getssl的人沟通过程中发现,是我当初建站的时候不懂,导致增加了其他解析我域名的DNS。所以certum找不到那个TXT记录。重新设置后,总算是通过了验证。好了,现在我有证书了,接下来开始配置。

不同系统下的证书文件是不一样的,好在getssl提供了所有主流系统的文件格式。另一个好消息是我的虚拟主机商提供添加自己证书的功能。虚拟主机有个好处就是在添加证书很简单,如果是云主机则需要一些配置,中间的配置过程等我搬家后再仔细体会吧。让我们先略过这段,后面还有事情要做。

首先是wordpress,在设置里需要更新你的网站网址,在http后面加s。

然后是在数据库里把所有含有http你网址的地方都改成https

update wp_posts set post_content = replace(post_content,'http://example.com','https://example.com'); 

当然,我看到有在function.php中写函数替换http的,都行吧,道理和目的都是一样的。到目前为止都还不错,SSL正常运行,无论是https还是那把小锁。但还存在最后一个问题,就是当我手动输入网址后进入的还是http,而通过上面的配置,在网站内有任何跳转都会进入https。这不是我想要的,既然都有证书了,就应该不管是手动输入还是跳转都应该进入https,所以后面是最后一步,http转https。

主要方法就是配置 .htaccess 文件,因为我是虚拟主机,直接编辑它即可。如果是云服务器还需要进行其他设置,这里同样等以后我体会了再说。直说编辑 .htaccess 。

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.yourdomainname.com/$1 [R,L] 

上面的意思是,如果访问的 ( RewriteCond )端口80,也就是http端口,就执行 RewriteRule,进入https。所以端口那里我们也可以这么写

RewriteCond %{SERVER_PORT} !^443$ 

只要访问的 ( RewriteCond )端口不是443,也就是https端口。

这里需要说明的是,如果没有 .htaccess 则需要新建一个。而如果是win系统,无法新增 .htaccess 这种命名的文件。方法:

我们先新建一个“新建文本文档.txt”文档,记事本打开,选择另存为,保存类型选择“所有文件(*.*)”,文件名输入“.htaccess”,保存。这样便生成了一个.htaccess文件。

左半红印发表于2019.06.28th