分类 编程 下的文章

微信原生的 wx.request 网络请求接口并不支持传统的 Cookie,但有时候我们现有的后端接口确于依赖 Cookie(比如服务器用户登录态),[weapp-cookie] 这个库可用一行代码为你的小程序实现 Cookie 机制,以保证基于 cookie 的服务会话不会失效,与 web 端共用会话机制。

安装

npm install weapp-cookie --save

将 npm 包复制到 vendor 文件夹,避免小程序可能不能找到文件(tips:使用 wepy/mpvue 等框架无需此步)

cp -rf ./node_modules/ ./vendor/

用法

在小程序根目录的 app.js 一行代码引入即可

// app.js
import './vendor/weapp-cookie/index'

// tips: 使用 wepy/mpvue 可以直接在入口 js 引入 weapp-cookie 模块
// import 'weapp-cookie'

App({
    onLaunch: function () { }
    // ...
})

- 阅读剩余部分 -

程序开发过程中总是有一些自增ID信息会展现给前端,这样就给一些人可乘之机,通过遍历ID等方式获取到数据信息。

为了解决这个问题,想了很多办法,今天自己写了一个对称加密算法分享给大家。ID加密后展示到前端,后端先解密再处理。

代码如下,欢迎指正。

<?php
/**
 * 整型数字对称加密,使用场景:对ID加密后展示
 * 只适用整型数字
 * 使用时请重新生成密钥
 */
class IntCode{
    // 密钥(0-9A-Za-z)打乱,可使用str_shuffle()函数重新生成
    private $key = 'PTvNKJdjOyB3niF891XCspl7rHMQIkELVqYbm20ZGUWhfze5txSRowg4uDA6ac';
    
    public function encode($int){
        //判断是否为整型
        if (! is_int($int)) {
            return '不是整型';
        }
        //将传入数字转换成十六进制分割成数组
        $hexArr = str_split(dechex($int));
        //将密钥分割成数组
        $keyArr = str_split($this->key);
        //密钥长度,推荐62
        $keyLen = count($keyArr);
        //随机数字
        $rand = mt_rand(0, $keyLen - 1);
        //将随机值压入结果开头
        $str = $keyArr[$rand];
        //验证码
        $verfy = $keyArr[($keyLen - $rand + strlen($int)) % $keyLen];
        //循环十六进制每一位数字,替换成密钥里的值
        foreach ($hexArr as $v) {
            $offset = hexdec($v) + $rand;
            $str .= $keyArr[$offset % $keyLen];
        }
        //将验证码压入结果末尾并返回
        return $str . $verfy;
    }
    
    public function decode($str){
        //验证$str是否合法
        if (! preg_match('/^[0-9a-zA-Z]{2,10}$/', $str)) {
            return '字符不合法';
        }
        //将传入字符串分割成数组
        $strArr = str_split($str);
        //密钥
        $key = $this->key;
        //将密钥分割成数组
        $keyArr = str_split($this->key);
        //密钥长度
        $keyLen = count($keyArr);
        //十六进制数值
        $hex = '';
        //获取随机数
        $rand = strpos($key, array_shift($strArr));
        //获取验证码
        $verfy = array_pop($strArr);
        //循环每一个字串并转换成十六进制
        foreach ($strArr as $k => $v) {
            if (strpos($key, $v) >= $rand) {
                $hex .= dechex(strpos($key, $v) - $rand);
            } else {
                $hex .= dechex($keyLen - $rand + strpos($key, $v));
            }
        }
        //十六进制转换成十进制
        $dec = hexdec($hex);
        //判断验证码是否正确
        if ($verfy !== $keyArr[($keyLen - $rand + strlen($dec)) % $keyLen]) {
            return '校验错误,给定字符串不合法'; 
        }
        return $dec;
    }
}

- 阅读剩余部分 -

本文来源网络:

  • 1、码农何苦为难穷逼
  • 2、删了就无法运行,我也不知道为什么
  • 3、早点睡吧,别改代码了
  • 4、系统终止运行了
  • 5、感觉念了一首诗
  • 6、我刚写这段代码时,我和上帝知道这段代码的意思,现在只有上帝知道了
  • 7、这样写还是生动形象的
  • 8、客户需求怎么做
  • 9、这个太狠了吧
  • 10、老实的程序员

1、码农何苦为难穷逼

1530171051-5e818c9125304_articlex.png

2、删了就无法运行,我也不知道为什么

// 写完这段就辞职
// 这段代码不知道谁写的
// 看起来没用
// 但是删完之后程序就跑不起来了
// 我也不知道为什么

- 阅读剩余部分 -

72.jpg

从事网管工作的朋友,总会遇到一些局域网补丁更新不统一的问题,但是要每一台机都自行下载这补丁,未免太浪费网络带宽了。虽然可以通过其他计算机共享补丁,但补丁太多,总不能每个都手动点击安装吧?其实可以通过批处理解决。

1、将下载的补丁统一放到一个文件夹 hotfix:

20191124222348.png

2、在文件夹中新建一个 txt 文本文档 update.txt,输入以下内容:

FOR /R %%F IN (*.msu) DO start /wait wusa %%F /quiet /norestart

3、将 update.txt 的后缀名修改为 update.bat:

20191124222855.png

- 阅读剩余部分 -

d52a2834349b033bdaf702ea1cce36d3d539bd87.png

解决办法

在 MySQL 5.7 以上版本中,启用了严格模式。

在配置文件中 /etc/mysql/my.cnf 中找到:

sql-model=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

修改为:

sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

然后重启 MySQL

STRICT_TRANS_TABLES 存储引擎启用严格模式,非法数据值被拒绝

出现此问题的原因

在 MySQL 5.0.2 以前,MySQL 对非法值检查并不严厉,而且为了数据输入还会强制将他们变为合法值。

在 MySQL 5.0.2 以后的版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。

严格模式

如果未使用严格模式,下面的情况是合法的:

- 阅读剩余部分 -

CentOS7 默认使用的是 firewall 作为防火墙

firewall 防火墙

1、查看 firewall 服务状态

systemctl status firewalld

964175-20170704104259159-913218775.png

2、查看 firewall 的状态

firewall-cmd --state

964175-20170704104425769-698844041.png

3、开启、重启、关闭、firewalld.service 服务

停止 firewall

systemctl stop firewalld.service

开启 firewall

systemctl start firewalld.service

禁止 firewall 开机启动

systemctl disable firewalld.service

4、开启、重启、关闭、firewalld.service 服务

开启 firewall

service firewalld start

- 阅读剩余部分 -

20191112215429.png

原因分析

这个问题在 64 位的 PHP 版本中并不存在,因为是在 32 位版本中,以秒计算 PHP 只支持到 2147483648,即:2^31,到 2038-01-19 03:14:08。

有效的时间戳通常从 Fri, 13 Dec 1901 20:45:54 GMT 到 Tue, 19 Jan 2038 03:14:07 GMT(对应于 32 位有符号整数的最小值和最大值)。不是所有的平台都支持负的时间戳,那么日记范围就被限制为不能早于 Unix 纪元。这意味着在 1970 年 1 月 1 日之前的日期将不能用在 Windows,一些 Linux 版本,以及几个其它的操作系统中。不过 PHP 5.1.0 及更新的版本克服了此限制。 —— [ PHP手册 ]

解决办法

如果在32系统PHP 5.1.0之后的版本,可以使用new DateTime解决。代码如下:

将时间戳转为年月日:

$d = new DateTime("@21474836490");
$d->setTimezone(new DateTimeZone("PRC"));
echo $d->format("Y-m-d H:i:s");

将年月日转为时间戳:

$d = new DateTime('2650-07-06 16:21:30');
echo $d->format('U');

如果运行时,遇到如下报错:

WARNING: It is not safe to rely on the system’s timezone settings

- 阅读剩余部分 -

php.jpg

使用 COOKIEJAR 方法

PHP 中 CURL 类在做请求时非常好用,对于COOKIE,CURL类也有很不错的支持。

获得 COOKIE 并存为文件:

// 把 COOKIE 保存至 cookie.txt
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

// COOKIE 文件存放在至 temp 文件夹下的随机文件
$cookie_file = tempnam('./temp','cookie');
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

读取文件并携带 COOKIE:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');

先把 COOKIE 保存文件,调用的时候再读取文件。

使用正则表达式

使用 COOKIEJAR 方法,会有两次 IO 操作,对效率有一定的损失。且运行在 BAE/SAE/GAE 等云计算平台时,不支持本地文件写入。使用正则表达式可以解决这些问题。

- 阅读剩余部分 -