标签 Technology 下的文章

查找文本中的字符串将字符串替换为想要的文本

sed -i "s/DB_HOST/DB_MY_HOST/g" .env

.env文件中的DB_HOST替换为DB_MY_HOST

将目标行替换为想要的文本

sed -i "/DB_DATABASE/c\DB_DATABASE=bingo_db/ .env

.env中的包含DB_DATABASE行替换为DB_DATABASE=bingo_db

以上两个方法都可以修.env文件中的某个配置项、第二种使用c\行替换比较方便

常见HTTP代码含义

300(多种选择)针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

500   (服务器内部错误)  服务器遇到错误,无法完成请求。
501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
    

Mysql存储引擎的区别

innodb的引擎比较适合于插入和更新操作比较多的应用
而MyISAM 则适合用于频繁查询的应用

MyISAM --表锁。
innodb--设计合理的话是行锁。
MYISAM 支持表锁、读读之间并发、写写读写串行
InnoDB支持行锁(共享锁、lock in share mode)、排它锁、行锁(innodb) 表锁(myisam)

php中include与require的区别

include_once 如果文件不存在会抛出一个警告
require_once 如果文件不存在会抛出一个致命错误
include 将指定的文件读入并执行里面的程序、require将文件读入、用自身替换读入的内容

  1. 在七牛控制台中创建Bucket。
  2. 下载PHP-SDK包。

可以通过composer来安装 composer require qiniu/php-sdk

  1. 获取密钥信息: AccessKey、SecretKey。
  2. 项目中将文件直接传至七牛服务器、通过回调来返回需要的数据、减轻业务服务器压力。

具体逻辑:

-  客户端获取服务器颁发的上传凭证(token)。
-  客户端上传资源至七牛,并带上token作为请求内容的一部分。
-  七牛处理资源、带上参数访问回调地址。
-  回调接口处理数据返回七牛。
-  七牛返回回调接口的处理数据给客户端。

demo:

//laravel中获取上传token
public function qiniu_token ()
    {
        //用户ID加密处理.
        $uid    = $this->hashid_enconde(Auth::user()->id);
        $bucket = env('QINIU_BUCKET');
        $policy = [
            'x:uid'            => $uid,
            //回调域名
            //Laravel中回调地址尽量走api路由、走web路由post过来的数据会因为csrf验证而导致419错误
            'callbackUrl'      => env('QINIU_CALLBACK'),
            //回调中需要传给服务器的数据、其中有七牛的魔法参数、和自定义的参数
            'callbackBody'     => '{"fname":"$(fname)", "fkey":"$(key)", "mimeType":"$(mimeType)","fsize":"$(fsize)", "uid":"'.
                                  $uid.'"}',
            'callbackBodyType' => 'application/json',
            //自定义文件存储路径(七牛中就是一串字符串...)
            'saveKey'          => "tools/".$uid."/$(year)/$(mon)/$(etag)$(ext)",
        ];
        $auth = new \Qiniu\Auth();
        
        return $auth->uploadToken($bucket, null, 3600, $policy);
    }

回调策略详见 文档

Blade 模板

@extends('layouts.app')
@section('content')
    <div class="container">
        <bill :upload-token="{{$token}}"></bill>
    </div>
@endsection

前端upload组件(iviewui)bill.vue

<template>
    <div>
         <Upload
                  ref="upload"
                  multiple
                  :data="uploadToken"
                  :default-file-list="uploadList"
                  :on-success="handleUploadSuccess"
                  :format="['jpg','jpeg','png']"
                  <!-- 此处填写七牛服务器地址 -->
                  action="https://upload.qiniup.com">
            <Button icon="ios-cloud-upload-outline">图片上传</Button>
          </Upload>
        <input v-model="images_url"></input>
    </div>
</template>

<script>
    export default{
        props:{
            uploadToken: Object
        },
        data(){
            return{
                uploadList:[],
                images_url:[],
            }
        },
        methods:{
            handleUploadSuccess(){
                this.$Message.success('图片上传成功');
                this.images_url.push(res.data);
            }
        }
    }
</script>

回调:

    /**
     * 持久化媒体文件
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function qiniuCallback (Request $request)
    {
        //将文件信息存入数据库中
        $media = Media::create([
            'user_id'     => $this->hashid_decode($request->get('uid')),
            'name'        => $request->get('fname'),
            'key'         => $request->get('fkey'),
            'mimeType'    => $request->get('mimeType'),
            'size'        => $request->get('fsize'),
            'description' => $request->get('des'),
        ]);
        //$media->url 使用Eloquent模型访问器功能生成图片路径,回调返回参数可自定义
        return $this->successResponseData(200, $media->url);
    }
  1. 上传资源完成之后可以通过异步数据处理将图片裁剪、添加水印。也是在上传策略中配置。详见

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