목차
문제의 근본 원인을 이해하십시오
우선 순위 권장 사항 : 데이터 저장을위한 모범 사례
1. 웹 루트 디렉토리에 민감한 데이터 저장을 피하십시오.
2. 데이터 저장에 더 적합한 형식을 사용하십시오.
3. Ultimate Solution : 데이터베이스 사용
PHP 코드 : 구문 처리 기술을 동적으로 생성합니다
1. 백 슬래시를 사용하여 특수 문자를 피하십시오
2. 스위치 문자열 참조 방법
3. 문자열 스티칭
생성 된 코드를 확인하십시오
요약 및 예방 조치
백엔드 개발 PHP 튜토리얼 PHP에서 PHP 코드의 동적 생성 : 보안 실무 및 구문 처리 기술

PHP에서 PHP 코드의 동적 생성 : 보안 실무 및 구문 처리 기술

Sep 02, 2025 pm 05:12 PM

PHP에서 PHP 코드의 동적 생성 : 보안 실무 및 구문 처리 기술

이 튜토리얼은 PHP 코드가 포함 된 문자열을 작성할 때 PHP가 php?> tag 및 $ 변수가 누락 된 문제를 탐구합니다. 이 기사는 JSON 또는 데이터베이스 사용 및 웹 루트 디렉토리 외부에 저장하는 것과 같은 민감한 데이터 저장에 대한 모범 사례를 강조합니다. 동시에, 코드가 예상대로 생성되고 실행되도록하기 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Stock Market GPT

Stock Market GPT

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

뜨거운 주제

PHP에서 이메일 주소가 유효한지 확인하는 방법은 무엇입니까? PHP에서 이메일 주소가 유효한지 확인하는 방법은 무엇입니까? Sep 21, 2025 am 04:07 AM

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

PHP에서 물체를 딥 카피 나 복제하는 방법은 무엇입니까? PHP에서 물체를 딥 카피 나 복제하는 방법은 무엇입니까? Sep 21, 2025 am 12:30 AM

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

PHP에서 두 배열을 병합하는 방법은 무엇입니까? PHP에서 두 배열을 병합하는 방법은 무엇입니까? Sep 21, 2025 am 12:26 AM

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

PHP 프로젝트에서 네임 스페이스를 사용하는 방법은 무엇입니까? PHP 프로젝트에서 네임 스페이스를 사용하는 방법은 무엇입니까? Sep 21, 2025 am 01:28 AM

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

PHP의 마법 방법은 무엇이며`__call ()`및`__get ()`의 예를 제공합니다. PHP의 마법 방법은 무엇이며`__call ()`및`__get ()`의 예를 제공합니다. Sep 20, 2025 am 12:50 AM

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

PHP로 데이터베이스에서 레코드를 업데이트하는 방법은 무엇입니까? PHP로 데이터베이스에서 레코드를 업데이트하는 방법은 무엇입니까? Sep 21, 2025 am 04:47 AM

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

PHP에서 파일 확장을 얻는 방법은 무엇입니까? PHP에서 파일 확장을 얻는 방법은 무엇입니까? Sep 20, 2025 am 05:11 AM

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

MySQL 조건부 응집 : 필드의 조건 합계 및 계산을 구현하기위한 사용 사례 명령문 MySQL 조건부 응집 : 필드의 조건 합계 및 계산을 구현하기위한 사용 사례 명령문 Sep 16, 2025 pm 02:39 PM

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

See all articles