php手册经常见到,什么是“二进制安全”?
在看PHP手册的时候,经常看到一句话”该函数是二进制安全的”。
- 二进制安全是什么呢?
- 他是如何实现的?
二进制安全是什么?
先看一段代码:
<?php
$string1 = "Hello";
$string2 = "Hello\0Hello";
echo strcoll($string1, $string2); /*返回0, 由于是非二进制安全,误判为相等 */
echo strcmp($string1, $string2); /*返回<0,不相等*/
?>
这是为什么呢?PHP是基于C实现的,PHP代码都会被zend引擎编译成opcode,最终作为C语言去执行。 而对于c语言‘\0’是字符串的结束符,它读到’\0’就会默认字符读取已经结束,从而抛掉后面的字符串。
main(){ char ab[] = "Hello"; char ac[] = "Hello\0Hello"; strcmp(ab, ac); /*返回0, 由于是非二进制安全,误判为相等 */}
有一个二进制安全的定义,我挺喜欢的:
程序不会对其中的数据做任何限制、过滤、或者假设 —— 数据在写入时是什么样的, 它被读取时就是什么样。
PHP是如何实现二进制安全的?
那么,既然PHP是基于C实现的,C 字符串类型不是二进制安全的,PHP又是如何实现的呢?这就是数据结构的功劳了。 PHP的内核中,是如此定义字符串类型的
struct{char *val;int len;
} str;
val是指向字符串内存的指针,len表示该字符串的长度,无论是否遇到“\0”字符,C都按照len长度读取该字符串。
原文链接:http://wuxinjie.github.io/php-02/
php手册经常见到,什么是“二进制安全”?相关推荐
- mysql临时开启二进制_关于MySQL二进制日志Binlog的认识
MySQL的二进制日志可以说或是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是失误安全型的. 在 ...
- 如何用 Bash 创建一个二进制发布包
linux下安装JDK的时候,Sun公司为JDK6的linux版本提供了一个shell的安装包,用起来特别的好用,基本上和在Windows下安装软件没什么两样,shell文件执行之后,几乎一切都系都设 ...
- rpm、yum、编译安装轻松管理centos7程序包
程序包管理器之RPM 一.rpm是什么 RPM 是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的.RPM ...
- Mac环境PHP踩过的“坑” (一)函数重载
为什么80%的码农都做不了架构师?>>> 零.问题¶ 在Mac下开发本来很高兴,可是有一个地方把人恶心到了,Apache+Mod_PHP方式,出现了一个strtoupper(' ...
- php session gc_maxlifetime,PHPsession 有效期 session.gc_maxlifetime
PHPsession 有效期 session.gc_maxlifetime 一个已知管用的方法是, 使用 session_set_save_handler, 接管所有的 session 管理工作, 一 ...
- Linux系统程序包管理工具-RPM
一.rpm是什么 RPM 是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是开放式的.RPM包管理器(RPM)是一 ...
- rpm、yum、编译安装轻松解决centos7程序包安装
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 程序包管理器之RPM 一.rpm是什么 RPM 是RPM Package Manager(RPM软件包管理器)的 ...
- Solaris 问答集
1.Q:Solaris的系统配置文件一般在什么地方? A:可以查看/etc/system文件,里面有一些solaris启动时默认加载的选项,包括 共享内存大小等的设置. 2.Q:在solaris中,用 ...
- 三菱PLC MC协议的配置和使用简析
1.三菱MC协议的目的 MC协议的目的是开放PLC内部寄存器给外部设备,实现外部设备和PLC的数据交互.简单说就是允许外部设备通过MC协议来读/写PLC里面的寄存器 2. 通信协议方式 通讯方式有48 ...
- STM32 F7的MAC层过滤使用+实例代码
前景描述 我司的以太网实现是LAN8720搭配片上MAC层做的,协议栈用LWIP 这种做法应该还是蛮常见的,反正不是LAN8720就是DP83864,再不然就是硬件协议栈的W5500了 想想还是有MA ...
最新文章
- 【转】HTTP Header 详解
- git 获取最新代码_常用命令之git操作(入门篇)
- 全局性事务控制如何在springboot中配置
- java 同步锁_java线程中的同步锁和互斥锁有什么区别?
- java压缩----使用sun JDK压缩--中文的文件名会是乱码
- [USACO18JAN][luoguP4183 ]Cow at Large P
- dotNet Core使用SignalR实现websocket
- java正则匹配英文句号_Scala 正则表达式 0411
- 【BZOJ3514】Codechef MARCH14 GERALD07加强版,LCT+主席树
- docker mysql8
- [GXOI/GZOI2019]宝牌一大堆(dp)
- Socket开发框架之框架设计及分析
- [渝粤教育] 重庆工程职业技术学院 Linux服务器配置与管理(唐宏) 参考 资料
- Mean filter 和 Gaussian filter对比
- msn自身头像存放位置
- Kali Linux 暴力破解 Excel密码
- 车路协同场景身份认证及 V2X 通信安全保障
- unity怪物攻击玩家减血_Unity-塔防游戏之怪物波次简单算法
- 美面魔心伊莉丝:会有蜘蛛之神制裁你
- SRC挖掘信息收集之JS文件中的秘密