drinke9 发布的文章

使用-h 命令查看具体参数

git@ubuntu:~/gogs$ ./gogs -h
NAME:
   Gogs - A painless self-hosted Git service

USAGE:
   gogs [global options] command [command options] [arguments...]

VERSION:
   0.11.43.0330

COMMANDS:
     web      Start web server
     serv     This command should only be called by SSH shell
     hook     Delegate commands to corresponding Git hooks
     cert     Generate self-signed certificate
     admin    Perform admin operations on command line
     import   Import portable data as local Gogs data
     backup   Backup files and database
     restore  Restore files and database from backup
     help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h     show help
   --version, -v  print the version

- 阅读剩余部分 -

需要配置两处地方!

  • nginx.conf
#在 http 块中 添加以下配置
fastcgi_intercept_errors on;
  • your.custom.conf
#在server块中添加
#有两种指定方式
error_page 404 /404.html; #当前配置默认路径是从nginx安装路径;
# OR 指定特定路由地址
# error_page 404 https://happyhack.cn/404.html;
#如需自定义路径,添加一个location块
location /404.html{
    root /data/wwwroot/errorpages;
}

也可以指定其他状态码到同一个页面。使用正则同样可以!

error_page 404 = 401 /your/errorpage.html;

直奔主题!

使用技巧

递增和递减

要代替以下实现:

$article = Article::find($article_id);
$article->read_count++;
$article->save();

你可以这样做:

$article = Article::find($article_id);
$article->increment('read_count');

以下这些方法也可以实现:

Article::find($article_id)->increment('read_count');
Article::find($article_id)->increment('read_count', 10); // +10
Product::find($produce_id)->decrement('stock'); // -1

模型的 boot() 方法

在一个 Eloquent 模型中,有个神奇的地方,叫 boot(),在那里,你可以覆盖默认的行为:

class User extends Model
{
    public static function boot()
    {
        parent::boot();
        static::updating(function($model)
        {
            // 写点日志啥的
            // 覆盖一些属性,类似这样 $model->something = transform($something);
        });
    }
}

- 阅读剩余部分 -

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. 酷壳