08月17, 2017

web安全笔记(2)

上一篇地址:web安全笔记(1)

点击劫持

  • 用户亲手操作
  • 用户不知情
  • ...

从而导致盗取用户资金(转账、消费),获取用户敏感信息

点击劫持防御:

  • javascript禁止内嵌
if (top.location != window.location) {
     top.location.href = window.location;
}

但是这种方案有局限性。嵌套的iframe是可以指定阻止js运行的,比如:

<iframe src=""  sandbox="allow-forms" />

也就是允许form的submit,这样一来还是能够提交form表单。

  • X-FRAME-OPTIONS禁止内嵌
ctx.set("X-Frame-Options", "DENY")  //koa的写法

传输安全

a. HTTP传输窃听

拿我的域名来说:

alt alt

中间经过了10多个路由,而这些路由都可以监听和篡改我的这些请求。

阿里支付宝有开源一个代理:anyProxy

npm install -g anyproxy

随后开启它,就行了:

alt

alt

alt

就可以欢快地抓包查看以及文件替换了,其实和window下面的fiddler差不多。


HTTP窃听:

  • 窃听用户密码
  • 窃听传输敏感信息
  • 非法获取个人资料

HTTP篡改

  • 插入广告 -重定向网站
  • 无法防御的XSS和CSRF攻击

比较常见的:小说网页里面各种弹框广告、手机网页中的流量球等。


b. HTTPS: SSL+HTTP

如何确定服务器身份

  • 证书无法伪造
  • 证书私钥不被泄露
  • 域名管理权不泄露
  • CA坚守原则

本地尝试HTTPS:

先在我的域名控制台加一个子域:

alt

alt

alt

随后下载下来:

alt

certificate.crtca_bundle.crt的内容合并,然后生成一个新的文件:fullchain.crt。有了这几个文件,就可以写koa代码了:

https.createServer({
    key: fs.readFileSync('./cert/private.key'),
    cert: fs.readFileSync('./cert/fullchain.crt')
}, app.callback()).listen(1522, function(){
    console.log('App https is listening on port 1522');
});

alt

原因是在于:

alt

所以这里可以通过host配置来简单处理一下:

127.0.0.1 test.my-fe.pub

随后访问:https://test.my-fe.pub:1522/,即可以看到效果


线上尝试https:

(我的域名没有备案,所以test.my-fe.pub(绑在了腾讯云的主机)就访问不了,因此我还得搞一个子域,放在香港主机上)

生成证书:

curl https://get.acme.sh | sh

alt

./acme.sh --issue -d 域名--webroot 网站目录地址

alt

注意,用firekylin跑不通的原因是在根目录下放一个文件,URL无法跑通,在node层做了一些处理。

随后我们就可以用了:

server {
     listen 80;
     listen 443 ssl http2; 
     server_name henry.my-fe.pub;

     ssl_certificate /root/.acme.sh/henry.my-fe.pub/fullchain.cer;
     ssl_certificate_key /root/.acme.sh/henry.my-fe.pub/henry.my-fe.pub.key; 

     location / {
        root /opt/web/henry.my-fe.pub;
     }        
}

alt

密码安全

a. 密码的作用

证明你是你,对比密码

b. 密码的存储

泄露渠道:

  1. 数据库被偷
  2. 服务器被入侵
  3. 通讯被窃听
  4. 内部人员泄露数据
  5. 其他网站(撞库)

存储:

  1. 严禁明文存储(防泄露)
  2. 单向变换(防泄露)
  3. 变换复杂度要求(防猜解)
  4. 密码复杂度要求(防猜解)
  5. 加盐(防猜解)

哈希算法:

  1. 明文-密文一一对应
  2. 雪崩效应(多了几个字母,少几个字母,生成的结果完全不一样)
  3. 密文-明文 无法反推
  4. 密文固定长度
  5. 常见哈希算法: md5 sha1 sha256

单向变换彩虹表防御:

可以将各种算法杂糅在一起,比如:

  • md5(md5(明文)) = 密文
  • md5(sha1(明文)) = 密文
  • md5(sha256(sha1(明文))) = 密文

也可以用复杂密码对抗彩虹表

变换次数越多越安全:

  1. 加密成本几乎不变(生成密码时速度慢一些)
  2. 彩虹表失效(数量太大,无法建立通用性)
  3. 解密成本增大N倍

来一个node的简单处理密码的代码:

var password = {};

var md5 = function(str) {
    var crypto = require('crypto');
    var md5Hash = crypto.createHash('md5');
    md5Hash.update(str);
    return md5Hash.digest('hex');
}

// 加盐
password.getSalt = function() {
    return md5(Math.random()*999999 + '' + Date.now());
}

password.encryptPassword = function(salt, password) {
    return md5(salt + 'af@!3efe#!89*' + password);
}

module.exports = password;

c. 密码传输的安全性:

  1. https传输
  2. 频繁限制
  3. 前端加密意义有限

d. 密码的替代方案(生物特征密码)

  • 指纹(唇纹)
  • 声纹
  • 虹膜
  • 人脸

e. 生物特征密码的问题

  1. 私密性 - 容易泄露
  2. 安全性 - 碰撞
  3. 唯一性 - 终身唯一 无法修改

本文链接:www.my-fe.pub/post/web-safety-note-2.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。