kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

PHPGD 验证码

https://m.php.cn/faq/544577.html

https://www.php.cn/faq/383496.html

1
2
3
4
5
6
7
8
1、产生一张png的图片
2、为图片设置背景色
3、设置字体颜色和样式
4、产生4位数的随机的验证码
5、把产生的每个字符调整旋转角度和位置画到png图片上
6、加入噪点和干扰线防止注册机器分析原图片来恶意注册
7、输出图片
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
function phpgd()
{
	$code = "";
	$charset = "ABCDEFGHJKMNPQRSTUWXY3456789"; // 去掉 I O Z 0 1 2
	$charset_length = strlen($charset);

	for ($i = 0; $i < 4; $i++) {
		$rand_index = rand(0, $charset_length - 1);
		$rand_char = substr($charset, $rand_index, 1);
		$code .= $rand_char;
	}

	$_SESSION["captcha"] = $code;

	// 展示验证码图片
	$image_width = 120;
	$image_height = 40;
	$image = imagecreatetruecolor($image_width, $image_height);
	$bg_color = imagecolorallocate($image, 255, 255, 255);
	imagefill($image, 0, 0, $bg_color);

	$font_size = 20;
	$font_color = imagecolorallocate($image, 0, 0, 0);

	$x = 10;
	$y = ($image_height - $font_size) / 2 + $font_size;
	for ($i = 0; $i < 4; $i++) {
		$char = substr($code, $i, 1);
		imagettftext($image, $font_size, rand(-10, 10), $x, $y, $font_color, "/usr/share/fonts/open-sans/OpenSans-Bold.ttf", $char);
		$x += $font_size + rand(5, 10);
	}

	$x = $image_width;
	$y = $image_height;
	// 干扰线
	for ($i = 0; $i < 8; $i ++) {
		$lineColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
		imageline($image, rand(0, $x), 0, rand(0, $x), $y, $lineColor);
	}
	// 干扰点
	for ($i = 0; $i < 200; $i ++) {
		$fontColor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
		imagesetpixel($image, rand(0, $x), rand(0, $y), $fontColor);
	}

	header('Content-Type: image/png');
	imagepng($image);
	imagedestroy($image);
}

https://blog.csdn.net/bzjoko/article/details/128786504

字体

1
/usr/share/fonts/

https://blog.csdn.net/allway2/article/details/126685336

imagettftext() 函数 是 PHP 中的一个内置函数,用于使用 TrueType 字体将文本写入图像。

句法:

参数:此函数接受上述八个参数,如下所述:

1
2
3
4
5
6
7
8
$image:它指定要处理的图像。
$size:它指定要使用的字体大小,以磅为单位。
$angle:它以度为单位指定角度。
$x:指定 x 坐标。
$y:它指定 y 坐标。
$color:它指定文本所需颜色的索引。
$fontfile:它指定要使用的字体。
$text:它指定要写入的文本。

返回值:此函数在成功时返回一个数组。

html url 编解码,特殊字符等

https://blog.csdn.net/qq_38766930/article/details/123703178

+、空格、=、%、&、#等字符

urlencode rawurlencode

https://www.jianshu.com/p/99c09270ad52

其实对于URL编码,rawurlencode才是标准,它定义在 RFC3986 上,这个 RFC 描述了如何定义一个 URL,URL 其实本质上不是 HTTP 协议的一部分,只是 URL 和 HTTP 协议结合的比较紧密,所以总觉得 HTTP 协议包含 URL。

先描述下rawurlencode,它也叫做百分号编码(Percent-encoding),首先思考一个问题,为什么URL需要编码,原因就在于早期的 URL 只有 ASCII 字符,所以无需编码。

但世界上有多种语言,为了让 URL 符合语义标准,必须转码,主要有以下几种字符需要编码:

1
2
3
4
ASCII 控制字符。
Non-ASCII,比如中文字符。
保留字符,比如/符号有特殊含义,为了输出原始/符号,必须编码。
不安全字符,这些字符(比如<、\、%)应该可以称为“应用字符”,对应的就是 HTML 中的“实体字符”。

那么具体如何编码呢?

1
2
3
非字母和数字字符替换为%符号,后面跟着字符的十六进制。
破折号、下划线、点号和波浪号无需编码。
空格替换为%20。

接着说说urlencode,它基于rawurlencode标准,但有略微的不同,它定义在rfc1866,这个rfc属于html标准的一部分,编码方式和 application/x-www-form-urlencoded MIME 编码方式一致。

urlencode处理 query string 的编码,而 rawurlencode 被认为处理 url 编码,这可以看做一个区别。

urlencode 和 rawurlencode 在编码方式上有二处区别:

1
2
波浪号需要百分号编码。
空格替换为+。

那么为什么不能保持一致呢?可能是历史原因,但 rfc2396 认为 url 中的 + 符号是一个保留字符,所以 rawurlencode 编码方式更标准。

PHP htmlspecialchars() 函数

https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

预定义的字符是:

1
2
3
4
5
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >

https://blog.csdn.net/YungGuo/article/details/110197818

apache log 中,参数之前的url是 \x , 参数是 %

例如

1
index/\xe6\x89\xa7\xe8\xa1\x8c\xe7\xbb\x93\xe6\x9e\x9c\xe5\xa6\x82\xe4\xb8\x8b?arg=%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%A6%82%E4%B8%8B

%

如果是 % 直接用 urldecode

1
urldecode($v);

\x

1
2
 \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c
 中文是: 你好世界

上面这个是utf-8编码,但数据类型是字符串类型,而不是bytes类型的utf-8编码。

这样会导致一个结果:如果直接输出,显示的是乱码,也不能使用decode进行utf-8解码得到中文。

可能有人会说,既然得到的是utf-8编码,在前面加上 “ b ” ,字符串就是bytes类型了,再利用decode进行解码不就可以得到中文吗?但显然,这是行不通的,你不可能去手动一个个添加,那有没有其他方法呢?

答案肯定是有的,既然知道这个字符串是utf-8编码的,那么我换种方式,只要将字符串中的 “ \x ” 改为 “ % ” 利用urllib中的unquote方法解码就可以得到中文了,因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。

1
urldecode(preg_replace('/\\\x([0-9a-fA-F]{2})/', '%$1', $v));

url 中 \xe6 %E6 两种解码方式

https://blog.csdn.net/YungGuo/article/details/110197818

apache log 中,参数之前的url是 \x , 参数是 %

例如

1
index/\xe6\x89\xa7\xe8\xa1\x8c\xe7\xbb\x93\xe6\x9e\x9c\xe5\xa6\x82\xe4\xb8\x8b?arg=%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%E5%A6%82%E4%B8%8B

%

如果是 % 直接用 urldecode

1
urldecode($v);

\x

1
2
 \xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c
 中文是: 你好世界

上面这个是utf-8编码,但数据类型是字符串类型,而不是bytes类型的utf-8编码。

这样会导致一个结果:如果直接输出,显示的是乱码,也不能使用decode进行utf-8解码得到中文。

可能有人会说,既然得到的是utf-8编码,在前面加上 “ b ” ,字符串就是bytes类型了,再利用decode进行解码不就可以得到中文吗?但显然,这是行不通的,你不可能去手动一个个添加,那有没有其他方法呢?

答案肯定是有的,既然知道这个字符串是utf-8编码的,那么我换种方式,只要将字符串中的 “ \x ” 改为 “ % ” 利用urllib中的unquote方法解码就可以得到中文了,因为url中的中文utf-8编码和这里的区别就是url中编码是%开头。

1
urldecode(preg_replace('/\\\x([0-9a-fA-F]{2})/', '%$1', $v));