Les langages faiblement typés sont également appelés langages de définition faiblement typés. Le contraire des définitions fortement typées. Les langages tels que VB et PHP sont faiblement typés. Cet article vous donnera une introduction détaillée aux problèmes de sécurité des types faibles de PHP. Vous pouvez vous y référer si nécessaire.
Avant-propos
Je crois que tout le monde sait que PHP est le meilleur langage au monde, et les problèmes de PHP lui-même peuvent également être considérés comme sécurité Web. Un aspect. Les fonctionnalités de PHP sont des types faibles et des fonctions intégrées gestion lâche des paramètres entrants.
Cet article enregistre principalement les problèmes dans les fonctions PHP que j'ai rencontrés sur la plateforme offensive et défensive, ainsi que les problèmes causés par les types faibles de PHP. Il a une certaine valeur de référence pour tout le monde lors de l’apprentissage ou de l’utilisation de PHP. Jetons un coup d’œil ci-dessous.
Introduction aux types PHP faibles
La raison pour laquelle l'éditeur pense que PHP est très puissant est que PHP fournit de nombreuses fonctionnalités uniques aux développeurs. use , dont l'un est le mécanisme de type faible PHP.
En PHP, vous pouvez effectuer les opérations suivantes.
$param = 1; $param = array(); $param = "stringg";
Le langage faiblement typé n'a aucune restriction sur le type de données des variables. Vous pouvez attribuer des variables à n'importe quel autre type de variable à tout moment, et les variables peuvent également être converties en Any. autre type de données.
Conversion de typeProblèmes
La conversion de type est un problème inévitable. Par exemple, lorsque vous devez convertir des paramètres GET ou POST en type int, ou lorsque les deux variables ne correspondent pas, PHP convertira automatiquement les variables. Cependant, PHP est un langage faiblement typé, ce qui entraîne de nombreux problèmes inattendus lors de la conversion de type.
Opérateur de comparaison
Conversion de type
En comparaison de $a==$b
$a=null;$b=flase ; //true $a='';$b=null; //true
Il existe de nombreux exemples de ce type, et ces comparaisons sont toutes égales.
Il existe également des problèmes de conversion de type lors de l'utilisation d'opérateurs de comparaison, comme suit :
0=='0' //true 0 == 'abcdefg' //true 0 === 'abcdefg' //false 1 == '1abcdef' //true
Lorsque des variables de types différents sont comparées, il peut y avoir des problèmes de conversion de variables. problèmes après la conversion.
Comparaison de hachage
En plus de la méthode ci-dessus, il existe également des problèmes lors de la comparaison de hachage. Comme suit :
"0e132456789"=="0e7124511451155" //true "0e123456abc"=="0e1dddada" //false "0e1abc"=="0" //true
Lors de l'exécution d'opérations de comparaison, si une chaîne comme 0ed+
est rencontrée, cette chaîne sera analysée en notation scientifique. Par conséquent, les valeurs des deux nombres dans l’exemple ci-dessus sont toutes deux égales à 0 et sont donc égales. Ce schéma ne sera pas égal si 0ed+
n'est pas satisfait. Cette question est testée dans la collision md5 dans la plateforme offensive et défensive.
Hexadécimalconversion décimale
Il y a également un problème lors de la comparaison des chaînes de restes hexadécimaux.
Les exemples sont les suivants :
"0x1e240"=="123456" //true "0x1e240"==123456 //true "0x1e240"=="1e240" //false
Lorsque l'une des chaînes commence par 0x, PHP analysera la chaîne en décimal, puis la comparera 0x1240 analysée en décimal est 123456 , donc le. la comparaison avec 123456 de type int et de type chaîne est égale. La difficulté de nommer la plate-forme offensive et défensive est due à cette caractéristique de l'inspection.
Conversion de type
Les conversions courantes consistent principalement à convertir int en chaîne et chaîne en int.
int en chaîne :
$var = 5; 方式1:$item = (string)$var; 方式2:$item = strval($var);
chaîne en int : intval()
fonction.
Pour cette fonction, vous pouvez d'abord regarder 2 exemples.
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0
Explicationintval()
Lors de la conversion, il sera converti depuis le début de la chaîne jusqu'à ce qu'il rencontre un caractère non numérique. Même si une chaîne qui ne peut pas être convertie apparaît, intval()
ne signalera pas d'erreur mais renverra 0. Les caractéristiques de
intval()
sont testées dans la question de MYSQL dans la plateforme offensive et défensive.
En même temps, les programmeurs ne doivent pas utiliser le code suivant lors de la programmation :
if(intval($a)>1000) { mysql_query("select * from news where id=".$a) }
À l'heure actuelle, la valeur de $a peut être 1002 union…..
Le relâchement des paramètres des fonctions intégrées
Le relâchement des fonctions intégrées signifie que lors de l'appel d'un function, La fonction reçoit un type de paramètre que la fonction ne peut pas accepter. L'explication est un peu difficile à expliquer, illustrons donc le problème directement à travers des exemples pratiques. Ci-dessous, nous nous concentrerons sur quelques-unes de ces fonctions.
md5()
$array1[] = array( "foo" => "bar", "bar" => "foo", ); $array2 = array("foo", "bar", "hello", "world"); var_dump(md5($array1)==var_dump($array2)); //true
La description de la fonction md5() dans le manuel PHP est string md5 ( string $str [, bool $raw_output = false ] )
, et la valeur dans md5()
doit être de type paramètre de chaîne. Mais lorsque vous transmettez un tableau, md5()
ne signalera pas d'erreur et Knowledge ne pourra pas calculer correctement la valeur md5 du tableau. Cela entraînera l'égalité des valeurs md5 de deux tableaux. Cette md5()
fonctionnalité est également envisagée en contournement à nouveau dans la plateforme offensive et défensive.
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()
也是一样的问题。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!