推荐的nodejs安装方式

nodejs的安装方式有很多种,最简单的方式莫过于直接在官网直接点击install。

本人刚开始正式玩nodejs的时候,也是直接按照官网上的方式安装,但是后来随着nodejs的深入,发现了各种令人蛋疼的问题:

  • 不方便更换版本
  • 不方便卸载

后来在github上发现了nvm,这货挺好用的,管理nodejs很方便:

  • 一开始不要安装nodejs(如果之前装了nodejs,想办法卸掉…),安装nvm
  • 看看nvm官方文档,随便玩转nodejs

有了nvm,想卸载就卸载,想换版本就换版本…

mac os x下删除开机自启动任务

如果能在系统偏好设置 - 用户与群组 - 登录项中找到自启动任务,那么把它删掉就可以了;如果找不到,就继续看下文。

mac os x系统中,自启动任务一般都会在以下某个目录生成一个或多个plist文件:

  • /Library/LaunchDaemons/
  • /Library/LaunchAgents/
  • ~/Library/LaunchAgents/

打开终端,进入到以上几个目录,找到对应的plist文件(有的程序可能有多个plist),然后执行以下命令就可以删除自启动任务:

1
launchctl unload -w x.xx.xxx.plist

重启mac,该任务应该不会再自动启动了!

在删除自启动任务时,可能会出现以下问题:

launchctl error unloading

出现这种错误,一般情况下都是因为该自启动任务所属用户与调用unload的用户(也就是本次登录的用户)不符,这个时候可以尝试添加sudo

referer防护措施

referer是指请求来源,很多网站通过这个来判断用户是从哪个页面/网站过来的。

referer很容易泄露,经常会被攻击者利用,一般情况下,可以采用如下方式来进行referer的保护:

  • 尽量不要在url中直接带上隐私数据;
  • 对第三方链接进行中间跳转,跳转到自己信任的某个页面上,然后在该页面上进行客户端跳转(meta跳转或者javascript跳转)。
  • html5草案推荐的rel="noreferer"属性,可以让请求不带referer
1
<a href="http://xxx.com" rel="noreferer">noreferer</a>

web前端进制常识

在前端领域,无论是HTML、css或者js,我们常常会看见一些八进制、十进制、十六进制等表示的字符。

html中字符进制编码

在html代码中,我们常常会见到以下字符表示法:

  • &#56;,十进制表示法
  • &#x5a;,十六进制表示法,比十进制表示法多了个x

css中字符进制编码

在css代码中,常见的进制表示法有:

  • \6c,十六进制表示法

js中字符进制编码

在js代码中,常见的进制表示法有:

  • \56,八进制表示法
  • \x5c,十六进制表示法
  • \u7801,多字节字符的unicode表示法

ajax数据接口的xss风险

曾经做过一个网站,用xss漏洞扫描器发现了xss漏洞,查看扫描报告,发现是一个ajax数据接口产生的。

该ajax数据接口中存在类似如下的代码:

1
2
3
{
"a": "<div>xxxx</div>"
}

其中xxx数据是来自ajax提交上来的get参数。由于后端没有过滤非法字符,导致了反射型xss漏洞。

最简单直接的解决方法当然就是过滤特殊字符了,但是过滤并不能保证万无一失。

其实还有更靠谱的解决方法:如果在浏览器上直接访问该ajax接口,应该避免以HTML的方式来呈现返回结果。

这就得设置一个正确的content-type了。

该接口原本设置的content-type为text/javascript,但这种content-type在firefox、chrome下还是会解析数据中的HTML代码。

其实,正确的content-type应该为application/json

不过就算这么设置,在IE下还是有可能会造成xss。

如果我们直接增加一个URL参数为a.html,IE会很奇葩地认为这是一个HTML文件而忽略content-type,使用HTML来解析文件,比如这样:

1
2
foo.cgi?id=123&a.html
/index.php/a.html?id=123(mvc单点入口,会忽略a.html,直接请求index.php)

HTML与JavaScript自动解码

HTML编码字符分为两种表达形式:

  • &#xx;,xx为十进制数值
  • 实体编码,比如&gt;等字符

这些字符在不同的上下文中具有不同的表现形式。

在HTML上下文中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script type="text/javascript">
function HtmlEncode(s) {
return String(s)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;');
}
</script>
<!-- 样例1-->
<input type="button" value="exec1" onclick="document.write('<img src=@ onerror=alert(123) />')" />
<!-- 样例2-->
<input type="button" value="exec2" onclick="document.write('&lt;img src=@ onerror=alert(123) /&gt;')" />
<!-- 样例3-->
<input type="button" value="exec3" onclick="document.write(HtmlEncode(('<img src=@ onerror=alert(123) />'))" />

这种上下文中,HTML编码字符会自动解码!上述样例1、样例2的执行结果是一样的。

要想避免自动解码问题,可以使用类似样例3的方法。

阅读全文

跨域子页面可以修改父页面的location

假设父页面localhost:8084/1.html用iframe嵌入了localhost:8085/2.html:

1
<iframe src="http://localhost:8085/2.html"></iframe>

2.html页面内容如下:

1
2
3
4
<script>
// console.log(parent.location);
parent.location = "http://www.baidu.com";
</script>

访问1.html时,页面会直接跳走到百度首页。

由此可见,跨域的子页面是可以修改父页面的location,但是却不能读取父页面的location,跨域读取的时候,会直接抛DOMException。

查了一下相关文档,location作为一种资源,跨域的时候可以修改但不能读取!

让xcode重新显示欢迎界面

RT,不小心将不显示xcode欢迎界面给勾选了,结果每次打开xcode都看不到界面,还以为没有启动成功。

在Dock上点一下xcode图标,让xcode窗口获得瞧点。然后command+shift+1就可以重新显示了!

mac os x下nginx开机自启动

按照apple developer官网所说的,用户的开机自启动任务一般都需要在以下目录建立一个plist文件:

  • /Library/LaunchDaemons/
  • /Library/LaunchAgents/
  • ~/Library/LaunchAgents/

这次我们在/Library/LaunchDaemons下新建一个nginx.plist文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>nginx</string>

<key>Program</key>
<string>/usr/local/nginx/sbin/nginx</string>

<key>KeepAlive</key>
<true/>

<key>NetworkState</key>
<true/>

<key>LaunchOnlyOnce</key>
<true/>
</dict>
</plist>

然后加载:

1
launchctl load /Library/LaunchDaemons/nginx.plist

这样就大功告成了!

同理,php-fpm的开机启动也可以这么做!

参考文档: