suchen
HeimBackend-EntwicklungPHP-TutorialDetaillierte Erklärung der PHP-Binärsicherheit
Detaillierte Erklärung der PHP-BinärsicherheitMar 29, 2018 pm 03:45 PM
php二进制安全

本文主要和大家分享Php二进制安全详解,希望能帮助到大家。

1. php的二进制安全 binary-safe

php的内部函数在操作二进制数据时能保证达到预期的结果,例如 str_replacestristrstrcmp 等函数,我们就说这些函数是二进制安全的。

下面通过 c 语言 和  php 的对比 来看 他们对二进制数据的处理
#include "stdio.h"#include "string.h"int main(){char a[] = "aa\0b";char b[] = "aa\0c";printf("%d\n", strcmp(a, b));printf("%ld\n", strlen(a));
}/* 0 2 */
可以看出来 c语言  "\0" 是字符串结束,所以认为 "aa\0b'"aa\0c" 是一样的,长度为2 抛弃了 "\0b""\0c" .
<?php/**
 * Created by PhpStorm.
 * User: leon
 * Date: 17/11/6
 * Time: 上午10:24
 */
    $a = "aa\0b";    $b = "aa\0c";    $c = "\0\0";    $d = &#39;a&#39;;    $e = &#39;a&#39;;
    var_dump(strcmp($a, $b));
    var_dump(strcmp($c, $d));
    var_dump(strlen($a));
    var_dump(strlen($c));

# res : int(-1) int(0) int(4) int(2)
php "aa\0b" 和  "aa\0c" 是不同的 ,并且长度为4

2. php实现二进制安全的原理

PHP中字符串通过 zend_string 表示:
Detaillierte Erklärung der PHP-Binärsicherheit

PHP中 变量   zend_value 表示:
Detaillierte Erklärung der PHP-Binärsicherheit

  • gc: 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析

  • h: 哈希值,数组中计算索引时会用到

  • len: 字符串长度,通过这个值保证二进制安全

  • val: 字符串内容,变长struct,分配时按len长度申请内存


  • len: 字符串长度,通过这个值保证二进制安全 ,它不需要像C 一样用哟   ‘\0’ 结尾符来判断字符串的结束,而是通过len

3.SDS

C   : 以 ’\0’ 为结束符,所以c的字符串不能包含文本,图片、音频、视频、压缩文件这样的二进制数据。
Php : 记录 len  
SDS : simple dynamic string 简单动态字符串的抽象类型,应用到字符表示:

SDS 数据结构:

struct sdshdr {    # 记录 buf 数组中已使用字节的数量
    # 等于 SDS 所保存字符串的长度
    int len;    # 记录 buf 数组中未使用字节的数量
    int free;    # 字节数组,用于保存字符串
    char buf[];
};

redis 的结构定义中也记录了SDS所保存字符串的长度,通过这个值保证二进制安全,SDS 的 API 都会用 字符串的len 属性来判断字符串是否结束

1. php的二进制安全 binary-safe

php的内部函数在操作二进制数据时能保证达到预期的结果,例如 str_replacestristrstrcmp 等函数,我们就说这些函数是二进制安全的。

下面通过 c 语言 和  php 的对比 来看 他们对二进制数据的处理
#include "stdio.h"#include "string.h"int main(){char a[] = "aa\0b";char b[] = "aa\0c";printf("%d\n", strcmp(a, b));printf("%ld\n", strlen(a));
}/* 0 2 */
可以看出来 c语言  "\0" 是字符串结束,所以认为 "aa\0b'"aa\0c" 是一样的,长度为2 抛弃了 "\0b""\0c" .
<?php/**
 * Created by PhpStorm.
 * User: leon
 * Date: 17/11/6
 * Time: 上午10:24
 */
    $a = "aa\0b";    $b = "aa\0c";    $c = "\0\0";    $d = &#39;a&#39;;    $e = &#39;a&#39;;
    var_dump(strcmp($a, $b));
    var_dump(strcmp($c, $d));
    var_dump(strlen($a));
    var_dump(strlen($c));

# res : int(-1) int(0) int(4) int(2)
php "aa\0b" 和  "aa\0c" 是不同的 ,并且长度为4

2. php实现二进制安全的原理

PHP中字符串通过 zend_string 表示:
Detaillierte Erklärung der PHP-Binärsicherheit

PHP中 变量   zend_value 表示:
Detaillierte Erklärung der PHP-Binärsicherheit

  • gc: 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析

  • h: 哈希值,数组中计算索引时会用到

  • len: 字符串长度,通过这个值保证二进制安全

  • val: 字符串内容,变长struct,分配时按len长度申请内存


  • len: 字符串长度,通过这个值保证二进制安全 ,它不需要像C 一样用哟   ‘\0’ 结尾符来判断字符串的结束,而是通过len

3.SDS

C   : 以 ’\0’ 为结束符,所以c的字符串不能包含文本,图片、音频、视频、压缩文件这样的二进制数据。
Php : 记录 len  
SDS : simple dynamic string 简单动态字符串的抽象类型,应用到字符表示:

SDS 数据结构:

struct sdshdr {    # 记录 buf 数组中已使用字节的数量
    # 等于 SDS 所保存字符串的长度
    int len;    # 记录 buf 数组中未使用字节的数量
    int free;    # 字节数组,用于保存字符串
    char buf[];
};

redis 的结构定义中也记录了SDS所保存字符串的长度,通过这个值保证二进制安全,SDS 的 API 都会用 字符串的len 属性来判断字符串是否结束。

相关推荐:

php二进制安全的含义

PHP-Binärsicherheit_PHP-Tutorial

Probleme im Zusammenhang mit der Binärsicherheit von PHP-Funktionen

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der PHP-Binärsicherheit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

二进制算法怎么算二进制算法怎么算Jan 19, 2024 pm 04:38 PM

二进制算法是一种基于二进制数的运算方法,其基本运算包括加法、减法、乘法和除法。除了基本运算外,二进制算法还包括逻辑运算、位移运算等操作。逻辑运算包括与、或、非等操作,位移运算包括左移和右移操作。这些操作都有对应的规则和操作数的要求。

如何使用C语言将二进制转换为十六进制?如何使用C语言将二进制转换为十六进制?Sep 01, 2023 pm 06:57 PM

二进制数以1和0表示。16位的十六进制数系统为{0,1,2,3…..9,A(10),B(11),……F(15)}为了从二进制表示转换为十六进制表示,位串id被分组为4位块,从最低有效侧开始称为半字节。每个块都替换为相应的十六进制数字。让我们看一个示例,以清楚地了解十六进制和二进制数字表示。001111100101101100011101&nbsp;3&nbsp;&nbsp;E&nbsp;&nbsp;5&nbsp;&nbsp;B&nb

php怎么设置implode没有分隔符php怎么设置implode没有分隔符Apr 18, 2022 pm 05:39 PM

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

EDVAC有哪两个重大的改进EDVAC有哪两个重大的改进Mar 02, 2023 pm 02:58 PM

EDVAC的两个重大的改进:一是采用二进制,二是完成了存贮程序,可以自动地从一个程序指令进到下一个程序指令,其作业可以通过指令自动完成。“指令”包括数据和程序,把它们用码的形式输入到机器的记忆装置中,即用记忆数据的同一记忆装置存贮执行运算的命令,这就是所谓存贮程序的新概念。

Golang如何读取二进制文件?Golang如何读取二进制文件?Mar 21, 2024 am 08:27 AM

Golang如何读取二进制文件?二进制文件是以二进制形式存储的文件,其中包含了计算机能够识别和处理的数据。在Golang中,我们可以使用一些方法来读取二进制文件,并将其解析成我们想要的数据格式。下面将介绍如何在Golang中读取二进制文件,并给出具体的代码示例。首先,我们需要使用os包中的Open函数打开一个二进制文件,这将返回一个文件对象。然后,我们可以使

Golang能否处理二进制文件?Golang能否处理二进制文件?Mar 20, 2024 pm 04:36 PM

Golang能否处理二进制文件?在Go语言中,处理二进制文件是非常常见且方便的。通过使用内置的包和方法,我们可以轻松地读取、写入和操作二进制文件。本文将介绍如何在Go中处理二进制文件,并提供具体的代码示例。读取二进制文件要读取一个二进制文件,我们首先需要打开这个文件并创建一个对应的文件对象。然后,我们可以使用Read方法从文件中读取数据,并以字节的形式存储在

轻松学会Go语言中16进制转二进制轻松学会Go语言中16进制转二进制Mar 15, 2024 pm 04:45 PM

题目:轻松学会Go语言中16进制转二进制,需要具体代码示例在计算机编程中,经常会涉及到对不同进制数之间的转换操作。其中,16进制和二进制之间的转换是比较常见的。在Go语言中,我们可以通过一些简单的代码示例来实现16进制到二进制的转换,让我们一起来学习一下。首先,我们来了解一下16进制和二进制的表示方法。16进制是一种表示数字的方法,使用0-9和A-F来表示1

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),