zyj's Blog

  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

密码散列安全

发表于 2019-10-18 | 分类于 php | 评论数:

为什么要将用户密码序列化

当设计一个需要用户设置密码的应用时,对密码进行散列是最基本的,也是必须考虑的安全考虑。如果不对用户密码进行散列处理,一旦用户数据库受到攻击时,用户密码将被窃取。同时,窃取者再去尝试其他应用,如果用户没有为每个应用单独设置密码,那么将面临风险。

通过对密码进行散列,然后再保存到数据库中,这样就使得攻击者无法直接获取原始密码,同时还可以保证你的应用可以对原始密码进行相同的散列处理,然后比对散列结果。

为何md5和sha1这些常见的函数不适合用在密码保护场景

MD5,SHA1 以及 SHA256 这样的散列算法是面向快速、高效 进行散列处理而设计的。随着技术进步和计算机硬件的提升, 破解者可以使用“暴力”方式来寻找散列码 所对应的原始数据。

因为现代化计算机可以快速的“反转”上述散列算法的散列值, 所以很多安全专家都强烈建议 不要在密码散列中使用这些散列算法。

建议使用password_hash

函数列表:

  1. password_hash()
  2. password_verify()
  3. password_needs_rehash()
  4. password_verify()
1
2
3
4
5
6
7
8
9
10
11
12
$str = password_hash('123456'); //生成散列值
password_verify('123456',$str); //颜值散列值
password_get_info($str); //返回指定散列(hash)的相关信息,返回如下:
//默认:
array (size=3)
'algo' => int 1
'algoName' => string 'bcrypt' (length=6)
'options' =>
array (size=1)
'cost' => int 10
//检测生成密码的选项是否改变
password_needs_rehash($str, PASSWORD_DEFAULT, ['cost' => 13]); //返回true

php版本升级更新

发表于 2019-10-18 | 分类于 php | 评论数:

PHP5.5更新

  1. 不再支持windows xp 和 2003

  2. yield 生成器

    生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。

    使用生成器循环,可以降低内存使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    function xrange($start, $limit, $step = 1)
    {
    for ($i = $start; $i <= $limit; $i += $step) {
    yield $i;
    }
    }


    foreach (xrange(1, 100000, 2) as $k => $val) {
    echo 'key:' . $k . ' and val:' . $val . "<br>";
    }
  3. 新增finally关键字

    不论是否异常,始终会执行finally,如果都有返回值,finally将会覆盖t ry,catch中的返回

    1
    2
    3
    4
    5
    6
    7
    try{
    return 1;
    }catch(){
    return 2;
    }finally{
    return 3;
    }
  1. foreach支持list()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    $arr = [
    [1,3,4],
    [2,3,5]
    ];
    foreach ($arr as list($a, $b)) {
    echo $a . '-' . $b . ' ';
    }
    //输出:1-3 2-3
  1. empty()支持任意表达式

    1
    2
    empty($a+$b);
    empty($a == $b);
  1. Array和String支持直接获取元素

    1
    2
    echo [1,2,3][0]; // 1
    echo 'abc'[0] // a
  2. 新增密码算法 password_hash

    1
    2
    3
    4
    5
    <?php
    $str = password_hash(123456,PASSWORD_DEFAULT);
    password_verify('123456',$str);
    password_needs_rehash($str,PASSWORD_DEFAULT,['cost'=>15]);
    password_get_info($str);
  3. 废弃mysql扩展

  4. preg_replace函数中用到的\e修饰符现在被弃用

  5. 使用 NULL 作为参数调用 set_error_handler() 将重置错误处理程序。

  6. 当使用 NULL 调用set_error_handler() 和 set_exception_handler() 时, 现在分别返回上一个错误或异常处理程序。

  7. 新增函数 array_column()

    说明:array_column() 返回input数组中键值为column_key的列, 如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <?php
    $records = array(
    array(
    'id' => 2135,
    'first_name' => 'John',
    'last_name' => 'Doe',
    ),
    array(
    'id' => 3245,
    'first_name' => 'Sally',
    'last_name' => 'Smith',
    ),
    array(
    'id' => 5342,
    'first_name' => 'Jane',
    'last_name' => 'Jones',
    ),
    array(
    'id' => 5623,
    'first_name' => 'Peter',
    'last_name' => 'Doe',
    )
    );
    var_dump(array_column($records,'first_name'));
    //返回如下:
    array (size=4)
    0 => string 'John' (length=4)
    1 => string 'Sally' (length=5)
    2 => string 'Jane' (length=4)
    3 => string 'Peter' (length=5)

    var_dump(array_column($records,'first_name','id'));
    //返回如下:
    array (size=4)
    2135 => string 'John' (length=4)
    3245 => string 'Sally' (length=5)
    5342 => string 'Jane' (length=4)
    5623 => string 'Peter' (length=5)
    var_dump(array_column($records,'first_name','last_name'))
    //返回如下:后面的会覆盖相同的健名
    array (size=3)
    'Doe' => string 'Peter' (length=5)
    'Smith' => string 'Sally' (length=5)
    'Jones' => string 'Jane' (length=4)
  8. 新增boolval()函数

    说明:将变量转换为bool值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php
    echo '0: '.(boolval(0) ? 'true' : 'false')."\n";
    echo '42: '.(boolval(42) ? 'true' : 'false')."\n";
    echo '0.0: '.(boolval(0.0) ? 'true' : 'false')."\n";
    echo '4.2: '.(boolval(4.2) ? 'true' : 'false')."\n";
    echo '"": '.(boolval("") ? 'true' : 'false')."\n";
    echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
    echo '"0": '.(boolval("0") ? 'true' : 'false')."\n";
    echo '"1": '.(boolval("1") ? 'true' : 'false')."\n";
    echo '[1, 2]: '.(boolval([1, 2]) ? 'true' : 'false')."\n";
    echo '[]: '.(boolval([]) ? 'true' : 'false')."\n";
    echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
    ?>
    //执行结果:
    0: false
    42: true
    0.0: false
    4.2: true
    "": false
    "string": true
    "0": false
    "1": true
    [1, 2]: true
    []: false
    stdClass: true

GTD方法论

发表于 2019-10-18 | 分类于 效率 | 评论数:

什么是GTD

GTD,你可以将它简单理解为做任务管理的一套方法。

GTD的英文全称是Getting Things Done ,就是相当于把事情做成的意思。

GTD有什么用

GTD是用来做任务管理的。

什么是任务管理?就是我们工作、学习和生活中会有很多事情要做,事情一多就会非常的杂乱,所有我们要做的事情,是一个个的任务,对任务进行记录、整理并去完成任务的过程就是任务管理。

它目的在于我们聚焦在当前所做的事情上,不去担心其它的事,因为其它的事你心里已经有谱了,从而在工作或者学习中达到一种“心如止水”的境界。

如何使用GTD

GTD总共有5个步骤:收集、厘清、整理、执行、回顾。

1. 收集

首先是收集,收集到的东西我们称之为材料。收集什么呢?收集任何引起我们注意力的事情,收集的时候不做任何的判断,先收集下来再说。

2. 厘清

确定收集的任务(清空收件箱)

  1. 是否可执行,如果现在暂时不能执行就放到某天中,如果不是可执行任务,就直接放垃圾箱。
  2. 如果任务可执行,判断是不是能在2分钟内完成。若能完成。就立即完成。若不能立即完成,再判断是不是需要分解成多个步骤才能完成,如果需要多个步骤,就转换成项目。如果是一步完成,就可以对这个任务进行处理(就是整理)

3. 整理

整理其实就是将每条可以执行的任务放入到对应的项目下,以及对每条任务加上一些执行的情境。
拆分项目列表,确定每个任务时间

4. 回顾

回顾就是我们要周期性的回顾这些列表,列表里面的列表项并不总是一成不变的,有些不需要的可以删除,有些需要更改的,移到其他列表中。

5. 执行

先去看”日程表“看当天有没有要处理的事,然后再去看自己的”下一步行动“清单,处理好必须当天做的事后,我们的主要目标变成了一个,就是按顺序处理”下一步行动“清单里面的任务,当然,这个顺序自己可以排序。处理完”下一步行动“清单,我们可以看看’将来/也许‘清单,如果有些任务现在可以做了,将它放到“下一步行动”清单,执行它。

curl命令

发表于 2019-08-16 | 更新于 2019-08-19 | 分类于 默认 | 评论数:

命令说明

Curl 是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作;

curl 提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传等

命令语法

1
curl [options] [URL...]

参数详解

参数 说明
-i 显示请求头和获取的内容
-I (大写i)仅仅显示请求头
-H “name: value” (HTTP)添加一个http header(http请求头);
-H “name:” (HTTP)移除一个http header(http请求头);
-D (HTTP)转储http响应头到指定文件;
-c filename 返回的cookie存储到文件
-b name=data 【参考】 (HTTP)发送cookie数据到HTTP服务器,数据格式为:”NAME1=VALUE1; NAME2=VALUE2”; 如果行中没有“=”,将把参数值当作cookie文件名; 这个cookie数据可以是由服务器的http响应头“Set-Cookie:”行发送过来的;
-j (HTTP)告诉curl放弃所有的”session cookies”; 相当于重启浏览器;
-x host:port -x [protocol://[user:pwd@]host[:port 【参考】 使用HTTP代理访问;如果未指定端口,默认使用8080端口; protocol默认为http_proxy,其他可能的值包括: http_proxy、HTTPS_PROXY、socks4、socks4a、socks5; 如: –proxy 8.8.8.8:8080; -x “http_proxy://aiezu:123@aiezu.com:80”
–socks4 <host[:port]> –socks4a <host[:port]> –socks5 <host[:port]> 【参考】 使用SOCKS4代理; 使用SOCKS4A代理; 使用SOCKS5代理; 此参数会覆盖“-x”参数;
-L –location (HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面; (在http响应码为3XX时使用,如301跳转、302跳转)
-s –silent 安静模式。不要显示进度表或错误消息;
-# –progress-bar 显示进度条;
-f –fail (HTTP)连接失败时(400以上错误)不返回默认错误页面,而是返回一个curl错误码“22”;
-S –show-error 安静模式下显示错误信息;
-o file –output file 将返回内容输出到文件。 如果是用过通配符获取多个url,可以使用“#”后跟“数字序号”,curl会自动将它替换对应的关键词,如:   curl “http://aiezu.com/{a,b}.txt" -o “#1.txt”;   将保存为:“a.txt”,“b.txt”;   curl “http://aiezu.com/{a,b}_[1-3].txt" -o “#1#2.txt”;   将保存为:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt   如果要根据规则创建保存目录,参考:“–create-dirs” 指定“-”将定向到标准输出“如控制台”;
-O –remote-name 将返回内容输出到当前目录下,和url中文件名相同的文件中(不含目录);
–create-dirs 与“-o”参数配合使用,创建必要的本地目录层次结构
-d key1=value1 -d key2=value2 请求数据 默认post 请求
-G 将请求改为get请求
-X POST 修改请求方式 默认ge t 比如:curl www.baidu.com
–referer www.baidu.com 我们还可以在curl通过--referer选项来指定我们是从哪里跳转过来的:

docker部署php开发环境

发表于 2019-08-14 | 更新于 2019-09-11 | 分类于 默认 | 评论数:

Nginx

1. 创建nginx容器
1
2
3
4
5
6
7
$ pwd
/Volumes/workspace/docker/php-environment
$ docker run --name test-nginx -d -p 8080:80 nginx:1.17.2-alpine
8b935e77ebc3710e92419efe7bcf266895088435a6a98918eea655a487ff8dee
$ docker ps -a;
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b935e77ebc3 nginx:1.17.2-alpine "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp test-nginx
2. 复制nginx配置文件
1
2
$ docker cp 8b935e77ebc3:/etc/nginx/nginx.conf ./
$ docker cp 8b935e77ebc3:/etc/nginx/conf.d/ .
3. 删除nginx容器
1
$ docker rm -f 8b935e77ebc3

PHP5.6

1. 编写Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
FROM php:5.6-fpm

ENV TZ=Asia/Shanghai

RUN cp "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"


# 更新为国内镜像
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \
&& echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \
&& echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \
&& apt-get update

RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysql mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm

RUN apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

# 安装redis
RUN pecl install redis-4.0.1 && docker-php-ext-enable redis

# 安装memcache
RUN pecl install memcache-2.2.7 && docker-php-ext-enable memcache

# 安装memcached
RUN apt-get install -y libmemcached-dev zlib1g-dev \
&& pecl install memcached-2.2.0 \
&& docker-php-ext-enable memcached

# 安装mongodb
RUN pecl install mongodb && docker-php-ext-enable mongodb

RUN apt-get update
# 安装imagick
# RUN apt-get install ImageMagick && pecl install imagick && docker-php-ext-enable imagick
RUN apt-get install -y libmagickwand-dev --no-install-recommends && pecl install imagick && docker-php-ext-enable imagick

# 安装gmagick
# RUN apt-get install -y libgraphicsmagick1-dev && pecl install gmagick-1.1.7RC3 && docker-php-ext-enable gmagick

# 安装xdebug
RUN pecl install xdebug-2.5.5 && docker-php-ext-enable xdebug;

# 镜像信息
LABEL Author="ZYJ"
LABEL Version="2019.9"
LABEL Description="PHP 5.6开发环境镜像."

PHP7.3.8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
FROM php:7.3.8-fpm

ENV TZ=Asia/Shanghai

RUN cp "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

RUN apt-get update
# 更新为国内镜像
# RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
# && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \
# && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \
# && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \
# && apt-get update

RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm


RUN apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

# 安装redis
RUN pecl install redis && docker-php-ext-enable redis


# 安装memcached
# RUN apt-get install -y --allow-downgrades libsasl2-2=2.1.27~101-g0780600+dfsg-3
RUN apt-get install -y libsasl2-dev libmemcached-dev zlib1g-dev \
&& pecl install memcached \
&& docker-php-ext-enable memcached

# 安装mongodb
RUN pecl install mongodb && docker-php-ext-enable mongodb

# 安装imagick
# RUN apt-get install ImageMagick && pecl install imagick && docker-php-ext-enable imagick
RUN apt-get install -y libmagickwand-dev --no-install-recommends && pecl install imagick && docker-php-ext-enable imagick

# 安装gmagick
# RUN apt-get install -y libgraphicsmagick1-dev && pecl install gmagick-1.1.7RC3 && docker-php-ext-enable gmagick

# 安装xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# swoole 扩展
RUN pecl install swoole-4.4.0 && docker-php-ext-enable swoole

# 镜像信息
LABEL Author="ZYJ"
LABEL Version="2019.9"
LABEL Description="PHP 7.3开发环境镜像."

使用docker-compose编排容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
version: "3"
services:
nginx:
image: nginx:1.17.2-alpine
restart: always
ports:
- "80:80"
links:
- mysql
- php
volumes:
- /Volumes/workspace/php/:/web
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/log:/var/log/nginx
environment:
- TZ=Asia/Shanghai
mysql:
image: mysql:5.7.25
environment:
- MYSQL_ROOT_PASSWORD=123456
restart: always
ports:
- "3306:3306"
volumes:
- ./mysql/mysql5725/conf:/etc/mysql/conf.d
- ./mysql/mysql5725/data:/var/lib/mysql
- ./mysql/mysql5725/log:/var/log/mysql

php:
image: zyj-php56
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
links:
- mysql
volumes:
- ./php/php56/etc:/usr/local/etc/php
- /Volumes/workspace/php/:/web

使用方法

1. 切换到docker-compose.yml文件所在目录
1
2
$ pwd
/Volumes/workspace/docker/php-environment
2. 启动
1
docker-compose up -d;
3. 停止
1
docker-compose down;
4. 重启
1
docker-compose restart;

kd加入篮网

发表于 2019-07-01 | 分类于 kd | 评论数:

Wow!

文档地址收藏

发表于 2019-06-21 | 更新于 2019-06-24 | 分类于 网址 | 评论数:

Guzzle中文文档

Guzzle官方英文文档

PHPUnit手册

畅言云评论

优秀文章分享

发表于 2019-06-21 | 更新于 2019-08-02 | 分类于 优秀文章 | 评论数:

深入理解token

彻底理解cookie,session,token

谈csrf攻击方式

为什么ssl证书要设有效期

理解php中的streams

阿里云 Composer 全量镜像

第三方支付平台

发表于 2019-06-20 | 更新于 2019-06-24 | 分类于 默认 | 评论数:

1. PING++

一次接入 Ping++ SDK, 一步让你的 app 同时支持银行卡、支付宝、 微信等支付方式, 以及未来的所有可能。

定价方案

文档地址

2. 支付猫

支付猫个人收款接口是转为个人开发者等有在线收款需求的用户,打造的安全稳定的微信支付个人收款接口、支付宝个人收款接口。旨在帮助用户快速接入支付功能,把梦想付诸行动,从而创造更多价值!

支付猫是微信支付和支付宝的官方合作伙伴,直连微信与支付宝,相比于第三方APP监控支付宝和微信到账消息的形式,具有无法企及的安全性与稳定性,不丢单、不黑单、无风险。

郑重承诺:我们只参与数据流,不介入资金结算,安全稳定可信赖!

阅读全文 »

网站部署let-encrypt证书

发表于 2019-06-17 | 更新于 2019-06-24 | 分类于 https | 评论数:

Centos7-nginx部署let’s encrypt证书

配置环境
软件 版本
Nginx 1.14.2
Centos CentOS Linux release 7.6.1810 (Core)
安装certbot
1
2
3
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
sudo yum install certbot python2-certbot-nginx
生成证书
  1. webroot方式-基于本地有web服务器生成,需要域名能访问80端口

    1
    certbot certonly --webroot -w /data/wwwroot/example -d example.com

    说明:certainly 表明只生成证书

    ​ -w 网站目录

    ​ -d 配置https的域名

    阅读全文 »
12…5
ZYJ

ZYJ

代码改变世界

47 日志
16 分类
30 标签
RSS
GitHub E-Mail
友情链接
  • 风雪之隅
  • 阮一峰的网络日志
0%
© 2019 ZYJ
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v6.7.0