PHP에서 PHP 코드의 동적 생성 : 보안 실무 및 구문 처리 기술
문제의 근본 원인을 이해하십시오
PHP 스크립트가 파일에 PHP 코드 (예 : php?> tag 또는 $ 변수)의 스 니펫이 포함 된 문자열을 작성하려고하면 이러한 특수 구문 요소가 "삼키거나 잘못 해석된다는 문제가 발생할 수 있습니다. 이것은 주로 PHP가 이중 인용 문자열을 처리 할 때 내용물을 구문 분석하여 변수를 찾고 대체하려고 노력하기 때문입니다. 예를 들어, "$ passwords"의 $ 암호는 PHP 통역사에 의해 현재 범위의 변수로 취급되며 변수가 정의되지 않은 경우 빈 문자열로 대체됩니다. 마찬가지로 php와 같은 구조는 일부 상황에서 오해 될 수 있습니다.
원래 샘플 코드에서 개발자는 PHP 배열의 정의가 파일에 포함 된 문자열을 작성하려고 시도했습니다.
php $ txt = " php $ passwords = array ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', );?> "; $ myFile = fopen ( "htpassw_array.php", "w") 또는 die ( "파일을 열 수 없다!"); fwrite ($ myfile, $ txt); fclose ($ myfile); ?>
그러나 출력 파일 htpassw_array.php에는 php?> tag 및 $ passwords 변수 이름이 없습니다.
= 배열 ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', );
이것은 PHP가 파일에 문자열 $ txt를 작성하기 전에 PHP 전처리를 명시하고 해석한다는 것을 명시 적으로 명시하고 있습니다.
우선 순위 권장 사항 : 데이터 저장을위한 모범 사례
대부분의 경우, 특히 민감한 정보 (예 : 비밀번호)와 관련하여 PHP 코드 형태의 파일에 데이터를 작성하려고 시도하는 것이 가장 모범 사례가 아닙니다. 암호가 포함 된 PHP 파일을 웹 서버에 액세스 할 수있는 디렉토리에 직접 배치하여 심각한 보안 위험이 있습니다. 사용자는 URL (예 : https://example.com/htpassw_array.php)에 직접 액세스하여 이러한 민감한 데이터를 다운로드하거나 볼 수 있습니다.
1. 웹 루트 디렉토리에 민감한 데이터 저장을 피하십시오.
형식 (PHP, JSON, TXT 등)에 관계없이 민감한 정보를 포함하는 파일은 루트 디렉토리 또는 웹 서버의 하위 디렉토리에 직접 배치해서는 안됩니다. 이러한 파일은 웹 루트 디렉토리 외부의 개인 디렉토리 (예 :/home/youruser와 같은 Linux 시스템 또는 Windows 시스템의 C :/Users/YourSer)에 저장해야합니다.
2. 데이터 저장에 더 적합한 형식을 사용하십시오.
구조화 된 데이터의 경우 PHP 코드 파일만이 유일한 선택이거나 최상의 선택도 아닙니다. 몇 가지 권장 데이터 저장 방법은 다음과 같습니다.
-
JSON 형식 : JSON (JavaScript 객체 표기법)은 사람들이 읽고 쓸 수있는 가벼운 데이터 교환 형식이며, 구문 분석하고 생성하기 쉽습니다. PHP에는 JSON_ENCODE () 및 JSON_DECODE () 함수가 내장되어있어 PHP 배열을 JSON 문자열로 쉽게 변환하여 저장할 수 있습니다.
예 : 비밀번호 배열을 JSON 파일로 저장하고 웹 루트 디렉토리 외부에 배치)
php $ password_data = 배열 ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); ///home/myuser/data와 같은 웹 루트 디렉토리 외부에 파일을 저장하는 것이 좋습니다. $ file_path = "/home/myuser/data/htpassw_array.json"; // php 배열을 JSON String $ json_content = json_encode로 인코딩합니다 ($ password_data, json_pretty_print); $ myFile = fopen ($ file_path, "w") 또는 다이 ( "글을 쓰기 위해 파일을 열 수 없습니다!"); fwrite ($ myfile, $ json_content); fclose ($ myfile); Echo "데이터는 다음과 같이 성공적으로 작성되었습니다.". $ file_path. "\N"; ?>
데이터를 읽어야 할 때 다음을 수행 할 수 있습니다.
php $ file_path = "/home/myuser/data/htpassw_array.json"; if (file_exists ($ file_path)) { $ json_content = file_get_contents ($ file_path); $ password_data = json_decode ($ json_content, true); // true는 연관 배열 인쇄 _r ($ password_data)로 디코딩 된 것을 의미합니다. } 또 다른 { echo "파일이 존재하지 않습니다. \ n"; } ?>
-
var_export () : var_export () 함수는 변수의 구문 분석 가능한 문자열 표현을 출력하거나 반환 할 수 있습니다. 즉, PHP 변수를 PHP 코드로 저장하고 필요한 경우 포함 또는 요구 사항을 통해 이산을 다시 가져올 수 있습니다. JSON_ENCODE ()와 비교하여 PHP 코드를 생성하지만 파일 위치에주의를 기울여야합니다.
php $ password_data = 배열 ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); $ file_path = "/home/myuser/data/htpassw_array_export.php"; // 파르 스 가능한 php 코드 생성 문자열 $ php_content = " php \ n \ nreturn". var_export ($ password_data, true). "; \ n \ n?>"; $ myFile = fopen ($ file_path, "w") 또는 다이 ( "글을 쓰기 위해 파일을 열 수 없습니다!"); fwrite ($ myfile, $ php_content); fclose ($ myfile); Echo "데이터는 다음과 같이 성공적으로 작성되었습니다.". $ file_path. "\N"; ?>
읽을 때 :
php $ file_path = "/home/myuser/data/htpassw_array_export.php"; if (file_exists ($ file_path)) { $ password_data = $ file_path가 필요합니다. // variable print_r ($ password_data)를 반환하려면 사용이 필요합니다. } 또 다른 { echo "파일이 존재하지 않습니다. \ n"; } ?>
3. Ultimate Solution : 데이터베이스 사용
데이터베이스 (예 : MySQL, PostgreSQL, SQLite 등)는 사용자 인증, 구성 또는 지속적인 스토리지 및 효율적인 쿼리가 필요한 데이터에 가장 적합한 선택입니다. 데이터베이스는 트랜잭션, 인덱싱, 권한 관리 및 데이터 무결성과 같은 고급 기능, 파일 스토리지를 훨씬 초과합니다.
PHP 코드 : 구문 처리 기술을 동적으로 생성합니다
일반적으로 데이터를 실행 가능한 PHP 코드로 저장하는 것이 권장되지는 않지만 특정 시나리오 (예 : 코드 생성기, 자동 배포 스크립트 또는 복잡한 구성 파일의 동적 생성)에서 PHP 코드는 다른 PHP 코드를 생성해야합니다. 이 경우 PHP 통역사가 문자열의 특수 문자를 미리 구문 분석하는 것을 방지하기 위해 올바른 구문 처리 기술을 마스터해야합니다.
1. 백 슬래시를 사용하여 특수 문자를 피하십시오
이중 인용 문자열에서 $ 기호는 PHP 변수의 표시기입니다. PHP가 변수가 아닌 문자 그대로 취급하려면 Backslash \로 탈출해야합니다.
예 : 탈출 $ 기호
php $ txt = " php \ $ passwords = array ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); ?> "; $ myFile = fopen ( "htpassw_array_escaped.php", "w") 또는 die ( "파일을 열 수 없다!"); fwrite ($ myfile, $ txt); fclose ($ myfile); echo "파일 htpassw_array_escaped.php가 생성되었습니다. \ n"; ?>
출력 파일 htpassw_array_escaped.php 컨텐츠 :
php $ passwords = 배열 ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); ?>
2. 스위치 문자열 참조 방법
PHP는 단일 및 이중 인용 문자열을 다양한 방식으로 처리합니다. 단일 인용 문자열에서 PHP는 변수 또는 대부분의 탈출 시퀀스 (\ '및 \\ 제외)를 구문 분석하지 않습니다. 즉, 대상 문자열에 $ 기호가 포함되어 있지만 문자로 취급되기를 원한다면 단일 인용 문자열을 사용하는 것이 더 깨끗한 방법입니다.
예 : 단일 견적 문자열 사용
php $ txt = ' php $ passwords = array ( "login1"=> "password1", "login2"=> "password2", "login3"=> "password3", ); ?> '; // 단일 따옴표는 여기에 사용되며 내부 문자열 값은 이중 인용문을 사용합니다. $ myFile = fopen ( "htpassw_array_single_quote.php", "w") 또는 die ( "파일을 열 수 없습니다!"); fwrite ($ myfile, $ txt); fclose ($ myfile); echo "파일 htpassw_array_single_quote.php가 생성되었습니다. \ n"; ?>
출력 파일 htpassw_array_single_quote.php 컨텐츠 :
php $ passwords = 배열 ( "login1"=> "password1", "login2"=> "password2", "login3"=> "password3", ); ?>
3. 문자열 스티칭
백 슬래시 탈출 또는 단일 따옴표는 일반적으로 $ 변수 기호에 대해 더 직접적이지만, 문자열 스 플라이 싱은 PHP (예 : php)에 의해 해석 될 수있는 다른 구조 또는 명확성을 위해 사용할 수 있습니다. 가능한 오해를 여러 줄로 나누고 사용하여 연결하십시오. 연산자.
예 : 문자열 스티칭 사용
php $ txt = " php". "$". "passwords = array ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); ?> "; $ myFile = fopen ( "htpassw_array_catenated.php", "w") 또는 die ( "파일을 열 수 없다!"); fwrite ($ myfile, $ txt); fclose ($ myfile); echo "파일 htpassw_array_catenated.php가 생성되었습니다. \ n"; ?>
출력 파일 htpassw_array_cancatenated.php 컨텐츠 :
php $ passwords = 배열 ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); ?>
PHP는 "이중 해석"문자열이 아니지만 일부 모서리의 경우 더 큰 제어를 제공하기 때문에이 접근법은 $ 변수를 처리 할 때 중복 될 수 있습니다.
생성 된 코드를 확인하십시오
PHP 파일을 생성하는 데 사용되는 방법에 관계없이 컨텐츠가 정확하고 실행 가능한지 확인하기 위해 검증을 수행해야합니다.
확인 예 :
다음 내용으로 htpassw_array.php 파일을 성공적으로 생성했다고 가정합니다.
php $ passwords = 배열 ( 'login1'=> 'password1', 'login2'=> 'password2', 'login3'=> 'password3', ); ?>
require_once를 통해 파일을 소개하고 var_dump를 사용하여 $ passwords 변수의 내용을 확인할 수 있습니다.
php require_once ( "htpassw_array.php"); // 파일이 var_dump ($ passwords)라고 가정합니다. ?>
예상 출력 :
배열 (3) { [ "login1"] => 문자열 (9) "password1" [ "login2"] => 문자열 (9) "password2" [ "login3"] => 문자열 (9) "password3" }
출력이 기대치와 일치하면 생성 된 PHP 코드가 유효 함을 의미합니다.
요약 및 예방 조치
- 보안 먼저 : 절대적으로 필요한 경우가 아니라면 웹 서버에 액세스 할 수있는 경로에 실행 파일 PHP 코드 형태로 민감한 데이터를 저장하지 마십시오. 데이터베이스 또는 웹 루트 디렉토리 외부의 JSON/VAR_EXPORT 파일에 우선 순위가 부여됩니다.
- PHP 문자열 파싱 이해 : 단일 따옴표와 이중 인용 문자열의 차이와 이중 인용문으로 $ 기호의 특별한 의미가 PHP 코드를 올바르게 생성하는 열쇠입니다.
- 팁 : 간단한 변수 이름의 경우 백 슬래시 탈출 또는 단일 인용 문자열로 전환하는 것이 일반적으로 가장 간단하고 효율적인 방법입니다. 보다 복잡한 PHP 코드 생성의 경우 템플릿 엔진 또는 미세한 문자열 작업이 더 적합 할 수 있습니다.
- 코드 생성 시나리오 : 동적 생성 PHP 코드는 주로 일일 데이터 저장보다는 코드 생성기 및 자동 스크립트와 같은 특정 개발 도구에 적합합니다.
- 항상 확인 : 프로덕션 환경에서 동적으로 생성 된 코드를 사용하기 전에 항상 적절한 테스트 및 검증을 수행하십시오.
위 내용은 PHP에서 PHP 코드의 동적 생성 : 보안 실무 및 구문 처리 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

usefilter_var () tovalidateemailsyntaxandcheckdnsrr () toverifydomainmxrecords.example : $ email = "user@example.com"; if (f ilter_var ($ 이메일, filter_validate_email) && checkdnsrr (Explode ( '@', $ email) [1], 'mx')) {echo "validandDeliverableEmail & qu

AseUnserialize (Serialize ($ obj))는 AllDataisserializable 이하의 경우 FordeepCopying; 그렇지 않으면, ubstract__clone () tomanuallyduplicateNestEdObjectSandavoidshartReferences.

USEARRAY_MERGE () TOCOMBINEARRAYS, DUCRITINGDUPLICATESTRINGKEYSANDENTEXINGUMERICEYS; FORSIMPLERCONCATENATION, 특히 인포드 55.6, USETHESPLATOPERATOR [... $ array1, ... $ array2].

네임 스페이스 인 네임 스페이스 inphorganizecodecodecodeandnamingnamingconflictsbygroupingclasses, 인터페이스, 함수, andconstantsOnspecificname.2.defineanamesUsUsingThenamesPaceyWordAtTHETOPOFOFILE, AFFORBINSPACENAME, suchATESKEYSTOI

The__call ()는 MethodsibleorundorundeRunded에서 정의 될 때 MethodStrigged를 정의하고, themodnameandarguments, asshowningwhendingderdefinedmethodslikesayhello ()

toupdateadaBasereCordInphp, FirstConnectusingpdoorMysqli, whenEseprepredStatementStoExecuteAcureCuresqlupDateQuery.example : $ pdo = newpdo ( "mysql : host = localhost; dbname = your_database", $ username, $ username, $ sql = "squer erestemail);

useathinfo ($ filename, pathinfo_extension) togetThefileExtension; itreliablyHandleSmultipledOtsededGecases, returningTheextension (예 : "pdf") oranEmptyStringifnoneExists.

이 기사에서는 케이스 문을 사용하여 MySQL에서 조건부 집계를 수행하여 특정 필드의 조건부 합산 및 계산 방법에 대해 자세히 설명합니다. 실제 구독 시스템 사례를 통해 레코드 상태 (예 : "END"및 "CANCEL"과 같은 총 기간 및 이벤트 수를 동적으로 계산하여 복잡한 조건부 집계의 요구를 충족시킬 수없는 전통적인 합계 기능의 한계를 극복하는 방법을 보여줍니다. 튜토리얼은 합 함수로 사례 문의 적용을 자세히 분석하고 왼쪽 조인의 가능한 널 값을 다룰 때 Coalesce의 중요성을 강조합니다.
