分类 编程 下的文章

微信原生的 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 等云计算平台时,不支持本地文件写入。使用正则表达式可以解决这些问题。

阅读全文