Heim > Artikel > Backend-Entwicklung > Sprechen Sie über Sicherheitsprobleme bei schwachen PHP-Typen
In diesem Artikel möchte der Editor mit Ihnen über PHP Weak Typing sprechen. PHP Weak Typing bietet Programmierern großen Komfort beim Schreiben von Code, aber alles hat zwei Seiten mit dem Editor.
0x00 Eine vorläufige Studie zu schwachen Typen
Niemand stellt die Einfachheit und Leistungsfähigkeit von PHP in Frage. Es bietet Entwicklern viele Funktionen, die sie nutzen können. Einer davon ist ein Mechanismus vom schwachen Typ.
Unter dem schwachen Typmechanismus können Sie solche Operationen ausführen
<?php $var = 1; $var = array(); $var = "string"; ?>
php prüft den Typ der eingehenden Variablen nicht streng und kann den Variablentyp auch frei konvertieren.
Zum Beispiel im Vergleich von $a == $b
$a = null; $b = false; //为真 $a = ''; $b = 0; //同样为真
Die Entwickler des PHP-Kernels wollten jedoch ursprünglich, dass Programmierer durch dieses System, das keine Deklarationen erfordert, effizienter werden. Entwicklung, daher werden in fast allen integrierten Funktionen und Grundstrukturen viele lose Vergleiche und Konvertierungen verwendet, um zu verhindern, dass Variablen im Programm aufgrund von Unregelmäßigkeiten des Programmierers häufig Fehler melden. Dies bringt jedoch Sicherheitsprobleme mit sich.
0x02 Wissensvorbereitung PHP-Kernel-zval-Struktur
Variablen, die in PHP deklariert wurden, werden in ZE unter Verwendung der Struktur zval gespeichert.
zval ist in zend/zend.h definiert
typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type;/* active type */ zend_uchar is_ref__gc; }; typedef union _zvalue_value { long lval; /* long value */ double dval;/* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;
wobei PHP den Variablentyp anhand des Typs bestimmt und den Wert speichert
Das Obige ist die Kapselung schwacher Typen im PHP-Kernel das Prinzip und die Grundlage von allem, worüber wir später sprechen werden.
Zwang der 0x03-Variable
Durch das, was wir gerade gelernt haben, wissen wir, dass zval.type den in zval.value gespeicherten Typ bestimmt.
Wenn der Quellcode einige uneingeschränkte Typvergleiche oder mathematische Operationen durchführt, kann dies dazu führen, dass sich zval.type ändert und sich gleichzeitig der Inhalt von zval.value ändert.
Wenn int auf string trifft
cp.1 Mathematische Operationen
Wenn PHP einige mathematische Berechnungen durchführt
ar_dump(0 == '0'); // true var_dump(0 == 'abcdefg'); // true var_dump(0 === 'abcdefg'); // false var_dump(1 == '1abcdef'); // true
Wenn ein Vergleichsparameter eine Ganzzahl ist, wird die Konvertierung des anderen Parameters in eine Ganzzahl erzwungen.
entspricht dem Vergleich des Zeichenfolgenteils
intval mit dem Ganzzahlteil. Beachten Sie insbesondere, dass der konvertierte Wert von „1assd“ 1 ist. und 'asdaf' ist 0
Es zeigt auch, dass intval mit der ersten Einheit beginnt, die keine Zahl ist
Alle da sind auch
var_dump(intval('3389a'));//输出3389
Dieses Beispiel sagt uns: Glauben Sie dem folgenden Code immer nicht
if($a>1000){ mysql_query('update ... .... set value=$a') }
Sie denken, dass das Betreten des Zweigs zu diesem Zeitpunkt eine Ganzzahl ist
Tatsächlich kann $a 1001/**/union sein...
cp.2 Lose Beurteilung der Anweisungsbedingungen
Zum Beispiel verwendet der PHP-Schalter einen losen Vergleich, der automatisch auf 0 geändert wird. Wenn kein Einbruch erfolgt In jedem Fall wird es bis zur Einbindung ausgeführt und schließlich bis zur Funktion ausgeführt, die wir benötigen. Hier ist die lose Beurteilung der erfolgreich eingebundenen
<?php if (isset($_GET['which'])) { $which = $_GET['which']; switch ($which) { case 0: case 1: case 2: require_once $which.'.php'; break; default: echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false); break; }
cp.3-Funktion
var_dump(in_array("abc", $array));
in_array – Überprüfen Sie, ob das Array vorhanden ist. Es gibt einen Wertparameter
needle, der der Wert ist, nach dem gesucht werden soll.
Hinweis: Wenn es sich bei der Nadel um eine Schnur handelt, wird beim Vergleich die Groß-/Kleinschreibung beachtet. Heuhaufen dieses Arrays.
strict Wenn der Wert des dritten Parameters strict TRUE ist, prüft die Funktion in_array() auch, ob der Nadeltyp mit dem im Heuhaufen übereinstimmt.
Wie Sie sehen können, werden die Typen nur durch das Hinzufügen von strict streng verglichen. Was wäre also, wenn wir ××× erneut mit Strings vergleichen?
var_dump(in_array("abc", $array1));</br> var_dump(in_array("1bc", $array2));
Es durchläuft jeden Wert des Arrays und führt einen „==“-Vergleich durch („verwende ===, wenn strikt festgelegt ist“)
Das Ergebnis ist offensichtlich
Wenn es einen Wert in Array1 gibt, der 0 ist, dann ist die erste Rückgabe wahr //intval('abc')=0
Wenn es einen Wert in Array2 gibt, der 1 ist, dann der zweite wird True//intval('1bc')=1 sein
Das gleiche Prinzip gilt für array_search
Die Anwendung hier ist sehr breit,
Viele Programmierer überprüfen den Array-Wert ,
Dann können wir das konstruierte int 0 oder 1 verwenden, um die Erkennungsfunktion zu täuschen und dafür zu sorgen, dass sie true zurückgibt.
Zusammenfassend lässt sich sagen, dass wir an allen Stellen, an denen PHP glaubt, dass es sich um Ints handelt, einen String eingeben zum Konvertieren gezwungen, z. B.
$a = 'asdfgh';//字符串类型的a</br> echo $a[2]; //根据php的offset 会输出'd'</br> echo $a[x]; //根据php的预测,这里应该是int型,那么输入string,就会被intval成为0 也就是输出'a'
, wenn das Array auf die Zeichenfolge
stößt. Es ist sehr interessant Früher handelte es sich bei allen um Vergleiche zwischen String und Int.
Wie wird also die chemische Reaktion ablaufen, wenn Array auf Int oder String trifft?
Aus dem PHP-Handbuch wissen wir, dass
die Array-Konvertierung in int/floating point float die Anzahl der Elemente zurückgibt.
die Konvertierung in bool gibt zurück, ob Elemente im enthalten sind Array; Konvertierung in String gibt „Array“ zurück und löst eine Warnung aus.
Was ist also die praktische Anwendung?
if(!strcmp($c[1],$d) && $c[1]!==$d){ ... }
Es kann festgestellt werden, dass dieser Zweig erfordert, dass die beiden durch den Vergleich der Strcmp-Funktion gleich sind, und dass „==“ erfordert, dass die beiden nicht gleich sind.
strcmp()-Funktion vergleicht zwei Zeichenfolgen.
Die Funktion gibt Folgendes zurück:
0 – wenn die beiden Zeichenfolgen gleich sind
223c79a0fa09d5dc9e7538590180560c0 – wenn string1 größer als string2
Die strcmp-Funktion hier konvertiert tatsächlich die beiden Variablen in ASCII und führt dann eine mathematische Subtraktion durch, um die Differenz eines int zurückzugeben.
Das heißt, das Ergebnis der Eingabe von „a“ und „a“ zum Vergleich ist 0
Was passiert also, wenn $array mit „a“ verglichen wird?
http://localhost:8888/1.php?a[]=1 var_dump(strcmp($_GET[a],'a'));
Zu diesem Zeitpunkt hat PHP null zurückgegeben!
Mit anderen Worten, wir machen diesen Funktionsfehler so, dass er immer wahr ist und umgehen die Funktionsprüfung.
0x04 Hüten Sie sich immer vor schwachen Typen
Für Programmierer sind schwache Typen beim Schreiben von Code zwar sehr praktisch, machen sie aber auch einfacher Programmierer vergessen die Gewohnheit von $array =array();. Es wird gesagt, dass alle Eingaben schädlich sind
Tatsächlich kann man sagen, dass die Typen aller Eingaben auch verdächtig sind. Vertrauen Sie niemals einer Vergleichsfunktion oder einer mathematischen Operation unter schwach typisiertem PHP. Ansonsten bist du definitiv derjenige, der von PHP betrogen wird.
Verwandte Tutorials: PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSprechen Sie über Sicherheitsprobleme bei schwachen PHP-Typen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!