分类 Technology 下的文章

XSS(Cross Site Script)

跨站脚本攻击会像站点注入Html/JavaScript代码

  • 举个茄子:

在页面中的某个input输入框中,攻击者输入<script>alert('666')</script>,页面将弹出这个666,如果用户使用更加牛逼的JS代码,来获取用户存在客户端的数据,如getCookie(name)这类代码,那用户的数据则暴露给攻击者无疑。

  • 防范方法
  1. 后端过滤任何可疑HTML标签,最好过滤<,>这两个符号。
  2. 当然通过前端路由xss,那也很难解决,唯有后端对URL,进行规则验证.

CSRF(Cross Script Request forgery)

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。[1] 跟跨網站指令碼(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

  • 举个例子

某站点用户转账链接如下 http://exapmle.com/transfer?account=xiaohong&amount=1000&payfor=xiaoming

小红刚刚转账给小明1000元,登录信息未过期!然后又访问了攻击者的网站,该网站中诱导小红点击如下链接

http://exapmle.com/transfer?account=xiaohong&amount=1000&payfor=hack

那小红账户则会向hack用户继续转账。

  • 防范方法
  1. 检查Referer字段
    后端在重要操作路由中检查用户访问过来的头信息,如以上站点referer字段对应的应该和exapmle.com一样的头信息,如果不对则能识别出恶意访问!但是这种手段也有缺陷,攻击者可以绕过浏览器自定义头信息。
  2. 添加效验Token
    CSRF本质是欺骗用户访问自己设置的地址,那么要求用户在访问某些地址时候提供不存在浏览器Cookie中,且攻击者也无法伪造的数据作为效验,那么攻击者则束手无策啦!在form表单中添加一个隐藏input放入后台加密的token值,用户提交过来在验证token是否正确!

参考资料

weiki

访问量较大的站点中,关键数据的展示有时候不是实时更新的,用户在访问这些数据的时候如果每次都从数据库中调取,则会浪费很多不必要的资源!
加上缓存的话,则会让数据的读取更快,同时大大减少了资源的浪费!缓存就这么因运而生了。

首先我们先来看下如何正确的使用缓存!

缓存更新的套路

大多人的思路是在有新数据加入的时候,删除原有缓存,更新数据库,在将新数据放入缓存中去!
然而!这个逻辑是有漏洞的。试想如果两个并发操作同时进来,一个更新操作,一个查询操作,更新操作删除缓存之后,查询操作没有命中缓存,将原有数据查询放入缓存中去,然后更新操作更新了数据库!
这就导致缓存数据是原来的老数据,并且一直会这样下去!

更新缓存

四种Design Pattern:

  1. Cache aside
  2. Read through
  3. Write through
  4. Write behind caching

最常用是是第一种 Cache aside .具体逻辑如下:

  • 失效 先从cache中去数据,没取到则去DB中取出来,在放入cache中去
  • 命中 从cache中取到数据返回
  • 更新 更新DB,更新成功之后再让cache失效

这种pattern其实也是有极小的概率会出现脏数据的。不过外部设置缓存过期时间则会减少这种情况的出现!

其余几种pattern这里不介绍了,详细请看参考链接

laravel 中使用缓存

框架自带了缓存配置,可以在config/cache.php中配置具体的缓存功能

常用的方法

创建缓存

Cache::put('key', 'value', 10);//键名、值、过期时间(分钟)

此外,我们也可以用 remember() 方法自动获取和更新一个缓存值。该方法首先检查 键名 是否存在,如果已经创建则返回结果。否则它会创建新的 键名 ,并用闭包返回结果进行赋值,就象下面:

Cache::remember('articles', 15, function() {
    return Article::all();
});

参数 15 是要缓存的分钟数。这样的话,我们甚至根本不必检查缓存是否过期。Laravel 不仅会替我们打理,而且会获取或重新生成该缓存,不需要我们显式地告诉它如何操作。

检索缓存

在更新或者取回缓存值之前判断这个缓存的key是否存在是很有必要的,使用 has() 方法就可以实现:

if (Cache::has('key')){
    Cache::get('key');
} else {
    Cache::put('key', $values, 10);
}

删除缓存

Cache::forget('key');

#我们也可以检索缓存值并删除它。我喜欢把这个称为一次性缓存:
$articles = Cache::pull('key');

#使用以下命令在缓存过期前就把所有缓存清楚掉:
$ php artisan cache:clear

Controller 中使用缓存

public function index() {
    $articles = Cache::remember('articles', 22*60, function() {
        return Article::all();
    });
    return response()->json($articles);
}

<span id=reference-link>参考链接</span>

  1. 知乎
  2. 酷壳

今天收到客户那边发过的一个函...

客户一个项目被上级查到有安全漏洞,源码都能被人家拉下来!!!
函中明确写明了是通过.git这个文件夹,使用脚本将源码拉下来了...

第一反应是这是什么操作,细想之后确实是可以的,每次commit都会在.git这个文件夹中记录,对这些提交进行解析
那轻轻松松得到源码了.

不过解决这个问题还是有很多办法的

  • 将这个文件夹删除,不建议,代码维护起来艰难.
  • 给这个文件夹减权,使web软件如Nginx无法访问,给个600这类的权限.
  • 将web入口文件放到里层目录中去(Laravel就是如此).

最近写代码的状态真是不得了,两周时间做出一个项目出来了,并且在这之间使用的都是新技术
Vue,Laravel。这两周时间对个人能力的提升相当于半年的积累了。哈哈

有一个段子吐槽程序员的加班

程序员去面试
HR问他:简历上显示毕业到现在才2年,为何工作经验写的是三年?

程序员说:多出来的一年是加班加出来的...

今天看了下WakaTime的统计,上周五居然写了10个小时的代码!!!我自己都佩服我自己了!

放几张图Mark一下

由于使用CDN域名没有HTTPS连接,导致站点变成混合模式。暂先去掉图片链接!

picture
picture
picture

一般会自动更新,但是有时会失败,这时候就需要手动运行命令进行更新

sudo /usr/local/python/bin/certbot renew --force-renewal #强制更新

sudo /usr/local/python/bin/certbot renew #自动更新脚本

有很大的原因是因为当初创建证书的时候: DNS problem: NXDOMAIN looking up A for xxx.com 导致的

服务器上的DNS缓存未更新.

使用 nscd工具更新服务器DNS缓存

安装:

sudo apt-get install nscd

更新DNS缓存

sudo nscd -i hosts

#还可以更新passwd、group
sudo nscd -i passwd
sudo nscd -i group

如果以上两种方法都失效的话,将nginx配置文件备份,使用脚本重新生成

sudo cp /usr/local/nginx/conf/vhost/blog.happyhack.cn.conf{,_`date +%m%d`}

 注意重启nginx!

参考http://www.ptbird.cn/let-s-encrypt-ssl-dns-probles.html