이 기사에서 편집자는 PHP 약한 타이핑에 대해 이야기하고 싶습니다. PHP 약한 타이핑은 코드를 작성할 때 프로그래머에게 큰 편의를 제공하지만 모든 것에는 양면이 있습니다.
0x00 약한 타이핑에 대한 예비 연구
PHP는 개발자가 사용할 수 있는 많은 기능을 제공하며 그 중 하나는 약한 타이핑 메커니즘입니다.
약한 유형 메커니즘에서 이러한 작업을 수행할 수 있습니다.
<?php $var = 1; $var = array(); $var = "string"; ?>
php는 들어오는 변수의 유형을 엄격하게 확인하지 않지만 변수 유형을 자유롭게 변환할 수도 있습니다.
예를 들어 $a == $b
$a = null; $b = false; //为真 $a = ''; $b = 0; //同样为真
의 비교에서, PHP 커널 개발자는 원래 선언이 필요하지 않은 이 시스템을 통해 프로그래머가 더 효율적으로 개발하기를 원했기 때문에 거의 모든 내장 함수에 그리고 프로그램의 변수가 프로그래머의 불규칙성으로 인해 자주 오류를 보고하는 것을 방지하기 위해 기본 구조에는 느슨한 비교 및 변환이 많이 사용됩니다. 그러나 이는 보안 문제를 야기합니다.
0x02 지식 준비 PHP 커널 zval 구조
PHP에서 선언된 변수는 zval 구조를 사용하여 ZE에 저장됩니다.
zval은 zend/zend.h에 정의됩니다. h
typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type;/* active type */ zend_uchar is_ref__gc; }; typedef union _zvalue_value { long lval; /* long value */ double dval;/* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;
PHP는 유형을 사용하여 변수 유형을 결정하고 store it in value
위는 PHP 커널의 약한 유형을 캡슐화한 것이며, 나중에 이야기할 모든 것의 원칙이자 기초이기도 합니다.
0x03 변수의 강제
방금 배운 내용을 통해 zval.type이 zval.value에 저장된 유형을 결정한다는 것을 알 수 있습니다.
소스 코드가 제한되지 않은 유형 비교 또는 수학 연산을 수행하면 zval.type이 변경될 수 있으며 동시에 zval.value의 내용이 변경되는 데 영향을 미칠 수 있습니다.
int가 문자열을 만날 때
cp.1 수학 연산
PHP가 몇 가지 수학적 계산을 수행할 때
ar_dump(0 == '0'); // true var_dump(0 == 'abcdefg'); // true var_dump(0 === 'abcdefg'); // false var_dump(1 == '1abcdef'); // true
비교 매개변수 중 하나가 정수이면 다른 매개변수는 강제로 정수로 변환됩니다.
문자열 부분
intval을 정수 부분과 비교하는 것과 같습니다. 실제로 zval.type의 내용을 변경합니다. 특히 '1assd'의 변환 값은 1이고 'asdaf'는 0
입니다.또한 intval이 숫자가 아닌 첫 번째 단위부터 시작한다는 것을 보여줍니다
또한
var_dump(intval('3389a'));//输出3389
이 예는 우리에게 다음 코드를 절대 믿지 말라는 것을 알려줍니다
if($a>1000){ mysql_query('update ... .... set value=$a') }
이 때 분기를 입력하는 것이 정수라고 생각합니다
사실 $a는 1001/**/union...
cp.2 명령문 조건의 느슨한 판단
예를 들어, PHP 스위치는 느슨한 비교를 사용하며 자동으로 intval이 변경됩니다. 0 각각의 경우에 중단이 없으면 포함될 때까지 실행되며 최종적으로 필요한 기능이 실행됩니다. — 배열에 특정 항목이 있는지 확인합니다. 값 매개변수
needle 검색할 값입니다. 참고: needle이 문자열인 경우 비교 시 대/소문자를 구분합니다. 이 배열을 건초더미에 쌓으세요.
strict 세 번째 매개변수 strict의 값이 TRUE이면 in_array() 함수는 needle의 종류가 haystack의 것과 동일한지 여부도 확인합니다.
strict를 추가해야만 유형이 엄격하게 비교된다는 것을 알 수 있습니다. 그러면 ×××를 문자열과 다시 비교하면 어떨까요?
<?php if (isset($_GET['which'])) { $which = $_GET['which']; switch ($which) { case 0: case 1: case 2: require_once $which.'.php'; break; default: echo GWF_HTML::error('PHP-0817', 'Hacker NoNoNo!', false); break; }
배열의 각 값을 반복하고 "==" 비교를 수행합니다("엄격이 설정된 경우 ===" 사용).
결과는 분명합니다
array1에 0인 값이 있는 경우 , 그러면 One 반환은 true가 됩니다. //intval('abc')=0
array2에 1인 값이 있으면 두 번째 반환은 true가 됩니다. //intval('1bc')=1
array_search는 동일합니다. 동일한 원리
여기에는 광범위한 응용 프로그램이 있습니다.
많은 프로그래머가 배열의 값을 확인할 것입니다.
그런 다음 구성된 int 0 또는 1을 완전히 사용하여 감지 기능을 속이고 만들 수 있습니다. return true
요약하자면, PHP가 int로 간주하는 위치에 문자열을 입력하면
var_dump(in_array("abc", $array));배열이 문자열을 만나면
이 예를 만났습니다. 독일의 ctf에서는 매우 흥미롭습니다. 앞서 이야기한 것은 string과 int의 비교에 관한 것입니다
그러면 배열이 int나 string과 접촉할 때 화학 반응은 어떻게 될까요? 우리는 PHP 매뉴얼에서
정수/부동 소수점 부동 소수점으로의 배열 변환이 요소 수를 반환한다는 것을 알고 있습니다.
bool로의 변환은 배열에 요소가 있는지 여부를 반환하고 문자열로 변환하면 '배열'을 반환합니다. 경고가 표시됩니다.
그럼 실제 적용은 뭘까요?
var_dump(in_array("abc", $array1));</br> var_dump(in_array("1bc", $array2));
이 브랜치는 strcmp 함수 비교를 통해 두 개가 동일해야 하고 "=="를 입력하려면 두 개가 같지 않아야 함을 알 수 있습니다.
strcmp() 함수는 두 문자열을 비교합니다.
이 함수는 다음을 반환합니다.
0 - 두 문자열이 같은 경우
>0 - 문자열1이 문자열2보다 큰 경우
여기서 strcmp 함수는 실제로 두 문자열을 변환합니다. 변수를 ASCII로 변환한 다음 수학적 뺄셈을 수행하여 그 차이를 int로 반환합니다.
즉, 'a'와 'a'를 입력하여 비교한 결과는 0
그럼 $array를 ‘a'와 비교하면 어떻게 될까요?
$a = 'asdfgh';//字符串类型的a</br> echo $a[2]; //根据php的offset 会输出'd'</br> echo $a[x]; //根据php的预测,这里应该是int型,那么输入string,就会被intval成为0 也就是输出'a'
이때 php에서 null이 반환되었습니다!
즉, 기능 검사를 우회하여 항상 true가 되도록 이 기능 오류를 만듭니다.
0x04 항상 약한 유형을 조심하세요
프로그래머로서 약한 유형은 코드를 작성할 때 프로그래머에게 큰 편리함을 제공하지만 $array =array(); 습관을 잊어버리게 만들기도 합니다. 모든 입력은 해롭다고 합니다
사실 모든 입력의 유형도 의심스럽다고 할 수 있습니다. 약한 유형의 PHP에서는 어떤 비교 함수나 수학 연산도 신뢰하지 마세요. 그렇지 않으면 당신은 확실히 PHP에 의해 배신당한 사람입니다.
관련 튜토리얼: PHP 비디오 튜토리얼
위 내용은 PHP 약한 유형 안전 문제에 대해 이야기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

PHP에서, 특성은 방법 재사용이 필요하지만 상속에 적합하지 않은 상황에 적합합니다. 1) 특성은 클래스에서 다중 상속의 복잡성을 피할 수 있도록 수많은 방법을 허용합니다. 2) 특성을 사용할 때는 대안과 키워드를 통해 해결할 수있는 방법 충돌에주의를 기울여야합니다. 3) 성능을 최적화하고 코드 유지 보수성을 향상시키기 위해 특성을 과도하게 사용해야하며 단일 책임을 유지해야합니다.

의존성 주입 컨테이너 (DIC)는 PHP 프로젝트에 사용하기위한 객체 종속성을 관리하고 제공하는 도구입니다. DIC의 주요 이점에는 다음이 포함됩니다. 1. 디커플링, 구성 요소 독립적 인 코드는 유지 관리 및 테스트가 쉽습니다. 2. 유연성, 의존성을 교체 또는 수정하기 쉽습니다. 3. 테스트 가능성, 단위 테스트를 위해 모의 객체를 주입하기에 편리합니다.

SplfixedArray는 PHP의 고정 크기 배열로, 고성능 및 메모리 사용이 필요한 시나리오에 적합합니다. 1) 동적 조정으로 인한 오버 헤드를 피하기 위해 생성 할 때 크기를 지정해야합니다. 2) C 언어 배열을 기반으로 메모리 및 빠른 액세스 속도를 직접 작동합니다. 3) 대규모 데이터 처리 및 메모리에 민감한 환경에 적합하지만 크기가 고정되어 있으므로주의해서 사용해야합니다.

PHP는 $ \ _ 파일 변수를 통해 파일 업로드를 처리합니다. 보안을 보장하는 방법에는 다음이 포함됩니다. 1. 오류 확인 확인, 2. 파일 유형 및 크기 확인, 3 파일 덮어 쓰기 방지, 4. 파일을 영구 저장소 위치로 이동하십시오.

JavaScript에서는 NullCoalescingOperator (??) 및 NullCoalescingAssignmentOperator (?? =)를 사용할 수 있습니다. 1. 2. ??= 변수를 오른쪽 피연산자의 값에 할당하지만 변수가 무효 또는 정의되지 않은 경우에만. 이 연산자는 코드 로직을 단순화하고 가독성과 성능을 향상시킵니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

Dreamweaver Mac版
시각적 웹 개발 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

뜨거운 주제



