Saber 酱的抱枕

Fly me to the moon

05/23
2017
学习 软件

使用GM_xmlhttpRequest设置referer获取文件

说到ajax,不能不提到跨域限制这个问题。与跨域紧密相连的是referer,如果referer相同,就不会触发跨域限制;反之则视为跨域。

但发生跨域时,能否请求到跨域资源,也分两种情况:

第一种:服务器端不检查referer,这时候是否受跨域限制,由浏览器管理。

这时是否触发跨域限制,全由浏览器自己判断。比如在网页上用img标签插入一张跨域的图片,浏览器是不会触发跨域限制的,可以正常加载图片。但用ajax获取的话,浏览器就会触发跨域限制,获取不了。

这时候就算跨域了,服务器也是允许浏览器去下载文件的,只是看浏览器自己愿不愿意。

第二种:服务器端会检查referer,不符合规则的就拒绝。

这时候浏览器就吃瘪了,用img标签来插入图片也不行,这也是通常的防盗链手段。


如果我们在请求头里设置合法的referer,就可以破解跨域限制,但目前运行在浏览器宿主环境内的JavaScript实现不了这个功能,需要交给后台程序来做。如果只为了破解referer就单独做个后台文件,比较麻烦。但是我们使用油猴脚本的话,就不用写后台文件了,比较省事。

油猴脚本管理器(Greasemonkey或Tampermonkey等)由于是浏览器的扩展程序,可以设置请求头,包括伪造referer。它们都封装了一个GM_xmlhttpRequest方法,可以在用户脚本(UserScript)里调用。

今天我进行了测试,确定是可行的。示例代码如下:

// ==UserScript==
// @name        test GM_xmlhttpRequest
// @description test
// @namespace   https://greasyfork.org/ja/users/24052-granony
// @author      me
// @version     0.1
// @include     https://greasyfork.org/*
// @grant       GM_xmlhttpRequest
// @connect     i.pximg.net
// @connect     i1.pixiv.net
// @connect     i2.pixiv.net
// @connect     i3.pixiv.net
// @connect     i4.pixiv.net
// @connect     i5.pixiv.net
// ==/UserScript==

GM_xmlhttpRequest({
	method: "GET",
	url: "https://i.pximg.net/img-original/img/2017/05/16/00/20/10/62921231_p0.png",
	headers: {
		referer: "https://www.pixiv.net/"
	},
	overrideMimeType: "text/plain; charset=x-user-defined",
	onprogress: function(xhr) {
		console.log(xhr.lengthComputable + "," + xhr.loaded + "," + xhr.total);
		//xhr.lengthComputable:布尔值,是否可以获取到文件总长度
		// xhr.loaded:已加载的字节数
		// xhr.total:文件总字节数

	},
	onload: function(xhr) {
		var r = xhr.responseText,
			data = new Uint8Array(r.length),
			i = 0;
		while (i < r.length) {
			data[i] = r.charCodeAt(i);
			i++;
		}
		blob = new Blob([data], {
			type: "image/png"
		});
		var blobURL = window.URL.createObjectURL(blob);
		var downA = document.querySelector("h1 a");
		downA.href = blobURL;
		downA.setAttribute("download", "a.png");
		downA.click();
		window.URL.revokeObjectURL(blobURL);
	}
})

上面代码的功能是下载一个跨域并且服务器设置了referer防盗链的文件,下载后将其转换为blob对象保存到本地。

首先要授予这个脚本调用GM_xmlhttpRequest的权限:

// @grant       GM_xmlhttpRequest

但光这样还不够,还要在@connect里指定跨域获取文件时文件url里的域名。如果文件url的域名没有在@connect里指定,则GM_xmlhttpRequest会报错。

如果跨域文件没有设置referer防盗链,那么到这里就够了,跨域问题会被自动处理(。

但示例代码里的url有防盗链设置,而且比较奇葩,服务器要求的其实是个不同源的referer,同源的referer反而不行。这就需要我们在GM_xmlhttpRequest方法的headers参数里设置合法的referer了:

headers: {
	referer: "https://www.pixiv.net/"
}

其实上面的代码里还有个挺纠结的地方,就是把接收的数据转换为blob对象的过程。

JavaScript原生的XMLHttpRequest对象和jQuery的ajax方法都可以设置把接收的数据自动转换为blob类型,如:

xhr.responseType="blob";

这样拿到的response直接就是blob对象,但这个办法油猴的GM_xmlhttpRequest里测试不行。我见到有的油猴脚本在GM_xmlhttpRequest里设置了:

responseType: "blob",

我试了也不行,不知道人家是怎么用的,反正我这里测试是不行……

后来我在github上找到了一个办法可以把接收的数据转换为blob对象,就是上面代码里用的,看着挺费劲。主要是做了三个工作:

1:请求前设置overrideMimeType;
2:onload之后用Uint8Array和charCodeAt将数据正确的转换为blob对象。

Uint8Array和charCodeAt和这俩我之前完全不认识,看到的时候一脸懵逼:

后来我深入了解了上面步骤的作用:

overrideMimeType告诉服务器需要返回无格式纯文本的mime-type,而不是image/jpeg、image/png等图像格式。

Uint8Array是创建一个指定长度的无符号数组,charCodeAt则用来把response逐字节转换为Unicode编码(response都是string)。

怪不得我之前简单粗暴把response放进数组里转换成的blob对象有问题,还是姿势太低。

其他参考资料:Greasemonkey wiki

使用GM_xmlhttpRequest设置referer获取文件

05/20
2017
ACG

企鹅葡萄传奇(雾)

企鹅 兽娘动物园 呼噜噜

企鹅 兽娘动物园 呼噜噜

下文系转载,非原创

葡萄君(グレープ)
1996生,公,已婚,有NTR经验(被)。

现年21岁的葡萄在10年东武动物园企鹅园建成之时就已经在了
可以算是园内的元老企鹅
而且有一个老婆叫みどり 中文直译就是——绿

众所周知,企鹅是非常重视夫妻关系的物种
一般配对之后就不在分离
葡萄爷和老婆绿也育有子女,现在被送到其他动物园了

不过七年前,发生了一场变故
葡萄爷的老婆绿小姐被其他年轻雄企鹅给NTR了

从此之后葡萄也开始被孤立,基本就是一个人待着了

直到七年后遇见了呼噜噜

谜汁评论:青葡萄

企鹅葡萄传奇(雾)

05/20
2017
其他

12dora被绿,婊子可恶

前两天在某qq群里看到一张类似表情包的图,12dora的头像上画了个绿帽。我当时有点疑惑(因为我火星),不知道是为啥。直到今天去逛了b吧,才隐约知道了这件事,后来了解了事件的来龙去脉。

详情可以看这个文章,挺全面:

知乎:如何看待 12dora 被 AUMI 绿事件?

简单地说就是B站前up主12dora(交450梗的起源,现在去别的平台了),与唱见Aumi(微博:棉花和aumi )相恋四年,不过没有同居,Aumi在自己家住,12dora在外面住,类似于异地恋。前几天12dora去Aumi家想给她一个惊喜,结果发现自己被绿了。

12dora对Aumi一直很好,送这送那还每月给钱,买了套房子(虽然不是很贵的)自己花了20来万,房子是挂在Aumi名下的。结果没多久发现被绿,什么感受。

后来12dora把这件事爆出来,Aumi则发长微博展开“反击”,不仅想洗白自己立牌坊,还指12dora家暴和虐猫,给很快被打脸,图基本都是P的。(ps:作为一个p过不少图的人,我也觉得她P的图太没责任心了,明显成这样还敢发出来)

Aumi现在在微博被骂婊子,也是活该。不爱12dora的话说出来,分手完事,她不但不说,还照常要这要那,在背地里却已经和富二代小鲜肉好上了(背地里已经好了几个月了)。被曝光之后的“反击”也极为拙劣。(请停止你拙劣的表演.jpg)

这两天有个新词,心如刀哥。

我作为一个单身狗,性格上也是“老实人”,不由得一声叹息。这个世界怎么了。

12dora被绿,婊子可恶

05/19
2017
学习

抓取所有文章页并生成网站地图的JavaScript代码

我之前的sitemap文件里有很多链接是错误的,早期的时候本站页面还没有启用伪静态,那时候文章网址后面没带.html。今天我写了个代码来自动抓取本站的所有文章,并生成sitemap字符。

这个代码可能仅适用本站使用的clearision模板。用在其他模板或其他类型的网站的话可能就需要略作修改了。

ps:
WordPress最近更新后,本文的代码失效了。可能是因为WordPress把短链接做了301跳转导致抓取不到。现在使用《网站地图生成助手js版》

抓取所有文章页并生成网站地图的JavaScript代码

05/19
2017
学习

使用css3动画制作网页底部走动的桌宠

在pc设备上,我的博客底部会有一个saber桌宠走来走去~这个效果大概是三年前博客建立不久就做了,但是当时是用JavaScript的定时器来改变桌宠的位置的。今天我把它用css3动画重做了一遍,效果基本上维持原样。

这次我依然用到了JavaScript,不过JavaScript已经不直接移动桌宠的位置了,它的作用是动态创建animation动画规则,这样桌宠的移动就由css3动画控制了。

其实我改成css3动画本来是想降低我的博客在浏览器里的资源占用,但是改了之后发现效果不明显,看来占用资源大头的另有原因,这个以后再查吧。
Read More →

使用css3动画制作网页底部走动的桌宠

05/15
2017
软件

关闭445端口的办法

最近比特币病毒肆虐,想抵御此病毒,主要有两种思路:

之前的一篇文章《MS17-010补丁下载地址》走的是打补丁路线。能用windows update 更新补丁是坠吼滴,但windows update 经常检查半天,没任何反应。这时候可以借助360等工具打补丁。

如果不想走打补丁路线,可以用本文的思路,简单粗暴关闭445端口。

首先在cmd里检查445端口是否开启:

netstat -ano -p tcp | find "445" >nul 2>nul && echo 445端口已开启 || echo 445未开启

其实主要是netstat -ano -p tcp | find "445"这一句,如果开启了445端口可以获得445端口的那条结果,如果关闭了445端口则不返回任何结果。

如果需要关闭445端口,需要一到两个步骤。

步骤1:

开始-运行输入 regedit 进入注册表编辑器,确定后定位到

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servi ces\NetBT\Parameters

新建名为“SMBDeviceEnabled”的DWORD值,并将其设置为 0。

也可以将以下文字用记事本保存成.reg文件,双击导入:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NetBT\Parameters]
"SMBDeviceEnabled"=dword:00000000

改了注册表之后重启。

如果是XP,则这样就已经关闭了 445 端口。但如果是win7及以上的话,还需要用步骤2来关闭server服务。

步骤2:

开始-运行输入services.msc,进入服务管理控制台。

找到server服务,双击进入管理控制页面。把启动类型更改为“禁用”,服务状态更改为“停止”,最后点击应用即可。也需要重启。

关闭445端口的办法

05/14
2017
软件

MS17-010补丁下载地址

最近比特币勒索病毒肆虐,该病毒通过windows系统的445端口的SMB服务的漏洞进行攻击,加密用户的文件并进行勒索,造成了巨大危害。但其实在今年3月份,微软就发布过MS17-010补丁安全更新,可以抵御此次的病毒攻击(虽然一开始微软没有给xp做这个补丁,但昨天也发布了xp版本的)。

《Microsoft 安全公告 MS17-010》

在这个文章里可以看到每个系统的更新包(KB号):

microsoft MS17-010 windows 下载 安装 比特币病毒 补丁 445端口

找到符合你的操作系统的链接,点进去下载就ok了。

点击后其实是到 Microsoft Update catalog 网站搜索该更新的KB号,同一个KB号根据不同系统也会有多个结果,选择适合自己系统的那个就行了。

界面大致如下:

microsoft MS17-010 windows 下载 安装 比特币病毒 补丁 445端口

另外不同操作系统的该补丁的KB号可能不同,这是正常的。比如xp、 vista、 windows server 2008 是单独的补丁安装程序,但其他系统基本都是月度安全更新整合包,后者和前者的KB号是不同的。

其实国内主流运营商大都封禁了445端口,所以公网用户(教育网除外)一般不用太担心。但是所谓有备无患,更新一下也不错。

总里面整合了一堆补丁,希望不要遇到有依赖的……

ps:我在自己电脑上用lantern翻墙之后,检查更新和下载更新都巨快,但是在公司电脑上用lantern却没有丝毫效果,不懂为什么。


话说上面下载的win7补丁单独安装装不上,可以试试用360打补丁,或者直接关闭445端口

另外网上最近说的360NSA武器库免疫工具我试了,是个坑爹货,必须装360安全卫士才能用,没装的话它会提醒你装,但你不装的话它就修复不了。

microsoft MS17-010 windows 下载 安装 比特币病毒 补丁 445端口

MS17-010补丁下载地址

05/12
2017
软件

配置WampServer可以在局域网内访问

默认情况下,在WampServer里建的网站在自己电脑上可以用127.0.0.1或是localhost访问,但是局域网其他设备是访问不了的。

如果有必要,可以编辑httpd.conf,在约278行的地方有如下代码(如果你之前没编辑过的话):

#   onlineoffline tag - don't remove
Require local

将其改为:

#   onlineoffline tag - don't remove
    #Require local
    #   Deny from all
    Require all granted
    Order Deny,Allow
    Allow from 127.0.0.1
    Allow from 192.168.1.*

之后重启wampserver(apache),局域网内的其他设备就可以输入你电脑的内网ip来访问了。

ps:
192.168.1.*这个看自己情况改;
另外我看上面的设置是配置的默认站点目录(即默认情况下为127.0.0.1的那个目录),但我在127.0.0.*里建了好几个网站(参考《WampServer多站点配置办法》),也许可以设置成让指定ip的电脑访问指定网站。这个有需要的话再折腾下试试吧。

配置WampServer可以在局域网内访问