Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Sicherheitsprobleme, die bei der Verwendung schwacher PHP-Typen beachtet werden müssen

Zusammenfassung der Sicherheitsprobleme, die bei der Verwendung schwacher PHP-Typen beachtet werden müssen

伊谢尔伦
伊谢尔伦Original
2017-06-29 13:31:441207Durchsuche

Schwach typisierte Sprachen werden auch schwach typisierte Definitionssprachen genannt. Das Gegenteil von stark typisierten Definitionen. Sprachen wie VB und PHP sind schwach typisiert. In diesem Artikel finden Sie eine detaillierte Einführung in die Sicherheitsprobleme der schwachen PHP-Typen.

Vorwort

Ich glaube, jeder weiß, dass PHP die beste Sprache der Welt ist, und die Probleme von PHP selbst können auch als solche angesehen werden Web-Sicherheit. Die Funktionen in PHP sind schwache Typen und integrierte Funktionen lockere Handhabung eingehender Parameter.

In diesem Artikel werden hauptsächlich die Probleme in PHP-Funktionen beschrieben, auf die ich auf der offensiven und defensiven Plattform gestoßen bin, sowie die Probleme, die durch die schwachen Typen von PHP verursacht werden. Es hat einen gewissen Referenzwert für jeden beim Erlernen oder Verwenden von PHP. Schauen wir uns das gemeinsam an.

Einführung in schwache PHP-Typen

Der Herausgeber hält PHP für sehr leistungsfähig, weil PHP Entwicklern viele einzigartige Funktionen bietet verwenden, einer davon ist der schwache PHP-Typ-Mechanismus.

In PHP können Sie die folgenden Vorgänge ausführen.

$param = 1;
$param = array();
$param = "stringg";

Schwach typisierte Sprache unterliegt keinen Einschränkungen hinsichtlich des Datentyps von Variablen. Sie können Variablen jederzeit jedem anderen Variablentyp zuweisen, und Variablen können auch in „Beliebig“ konvertiert werden andere Art von Daten.

TypkonvertierungProbleme

Typkonvertierung ist ein unvermeidbares Problem. Wenn Sie beispielsweise GET- oder POST-Parameter in den Typ int konvertieren müssen oder wenn die beiden Variablen nicht übereinstimmen, konvertiert PHP die Variablen automatisch. Allerdings ist PHP eine schwach typisierte Sprache, was zu vielen unerwarteten Problemen bei der Typkonvertierung führt.

Vergleichsoperator

Typkonvertierung

Im Vergleich von $a==$b

$a=null;$b=flase ; //true
$a='';$b=null; //true

Es gibt viele solcher Beispiele und diese Vergleiche sind alle gleichwertig.

Bei der Verwendung von Vergleichsoperatoren treten auch Typkonvertierungsprobleme auf, wie folgt:

0=='0' //true
0 == 'abcdefg' //true
0 === 'abcdefg' //false
1 == '1abcdef' //true

Wenn Variablen unterschiedlichen Typs verglichen werden, kann es zu Variablenkonvertierungsproblemen kommen Probleme nach der Umstellung.

Hash-Vergleich

Zusätzlich zu der oben genannten Methode gibt es auch Probleme beim Durchführen eines Hash-Vergleichs. Wie folgt:

"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada" //false
"0e1abc"=="0"  //true

Wenn beim Durchführen von Vergleichsoperationen eine Zeichenfolge wie 0ed+ angetroffen wird, wird diese Zeichenfolge in wissenschaftliche Notation analysiert. Daher sind die Werte der beiden Zahlen im obigen Beispiel beide 0 und daher gleich. Dieses Muster ist nicht gleich, wenn 0ed+ nicht erfüllt ist. Diese Frage wird bei der MD5-Kollision in der Offensiv- und Defensivplattform getestet.

HexadezimalDezimalkonvertierung

Es gibt auch ein Problem beim Vergleich hexadezimaler Restzeichenfolgen.

Beispiele sind wie folgt:

"0x1e240"=="123456" //true
"0x1e240"==123456 //true
"0x1e240"=="1e240" //false

Wenn einer der Strings mit 0x beginnt, analysiert PHP den String in eine Dezimalzahl und vergleicht ihn dann mit 0x1240, geparst in eine Dezimalzahl, also 123456 Der Vergleich mit 123456 von int-Typ und string-Typ ist gleich. Die Schwierigkeit bei der Benennung der Offensiv- und Defensivplattform ist auf diese Eigenschaft der Inspektion zurückzuführen.

Typkonvertierung

Übliche Konvertierungen sind hauptsächlich die Konvertierung von int in string und von string in int.

int zu string:

$var = 5;
方式1:$item = (string)$var;
方式2:$item = strval($var);

string zu int: intval() Funktion.

Für diese Funktion können Sie sich zunächst 2 Beispiele ansehen.

var_dump(intval('2')) //2
var_dump(intval('3abcd')) //3
var_dump(intval('abcd')) //0

Erklärungintval()Bei der Konvertierung wird die Konvertierung vom Anfang der Zeichenfolge durchgeführt, bis ein nicht numerisches Zeichen angetroffen wird. Auch wenn eine Zeichenfolge erscheint, die nicht konvertiert werden kann, meldet intval() keinen Fehler, sondern gibt 0 zurück. Die Eigenschaften von

intval() werden in der Frage von MYSQL in der Offensiv- und Defensivplattform getestet.

Gleichzeitig sollten Programmierer beim Programmieren nicht den folgenden Code verwenden:

if(intval($a)>1000) {
 mysql_query("select * from news where id=".$a)
}

Zu diesem Zeitpunkt kann der Wert von $a 1002 Union sein…..

Die Lockerheit der Parameter der integrierten Funktionen

Die Lockerheit der integrierten Funktionen bedeutet, dass beim Aufrufen von a Funktion: Der Funktion wird ein Parametertyp übergeben, den die Funktion nicht akzeptieren kann. Die Erklärung ist etwas verwirrend, deshalb wollen wir das Problem direkt anhand praktischer Beispiele veranschaulichen. Im Folgenden konzentrieren wir uns auf einige solcher Funktionen.

md5()

$array1[] = array(
 "foo" => "bar",
 "bar" => "foo",
);
$array2 = array("foo", "bar", "hello", "world");
var_dump(md5($array1)==var_dump($array2)); //true

Die Beschreibung der md5()-Funktion im PHP-Handbuch lautet string md5 ( string $str [, bool $raw_output = false ] ) , und der Wert in md5() muss sein vom Typ String-Parameter sein. Wenn Sie jedoch ein Array übergeben, meldet md5() keinen Fehler und Knowledge kann den MD5-Wert des Arrays nicht korrekt berechnen. Dies führt dazu, dass die MD5-Werte zweier Arrays gleich sind. Dieses md5() Feature wird auch im Bypass wieder in der Offensiv- und Defensivplattform berücksichtigt.

strcmp()

strcmp()函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ) ,需要给strcmp()传递2个string类型的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。

如果传入给出strcmp()的参数是数字呢?

$array=[1,2,3];
var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。

strcmp这种特性在攻防平台中的pass check有考到。

switch()

如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。如下:

$i ="2abc";
switch ($i) {
case 0:
case 1:
case 2:
 echo "i is less than 3 but not negative";
 break;
case 3:
 echo "i is 3";
}

这个时候程序输出的是i is less than 3 but not negative,是由于switch()函数将$i进行了类型转换,转换结果为2。

in_array()

在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) ,如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。

$array=[0,1,2,'3'];
var_dump(in_array('abc', $array)); //true
var_dump(in_array('1bc', $array)); //true

可以看到上面的情况返回的都是true,因为'abc'会转换为0,'1bc'转换为1。

<a href="http://www.php.cn/wiki/1007.html" target="_blank">array_search</a>()in_array()也是一样的问题。

Das obige ist der detaillierte Inhalt vonZusammenfassung der Sicherheitsprobleme, die bei der Verwendung schwacher PHP-Typen beachtet werden müssen. 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