현재 위치: > 최신 기사 목록> JSON_ENCODE ()와 Sprintf 사용에 대한 메모

JSON_ENCODE ()와 Sprintf 사용에 대한 메모

gitbox 2025-04-28

PHP 프로그래밍에서 SprintfJson_encode () 는 매우 일반적으로 사용되는 두 가지 기능입니다. Sprintf 는 문자열을 형식화하는 데 사용되며 JSON_ENCODE ()는 PHP 데이터 구조를 JSON 형식의 문자열로 변환하는 데 사용됩니다. 비록 각각 강력한 기능을 가지고 있지만 우연히 사용하면 일부 문제 또는 안전 위험이 도입 될 수 있습니다. 오늘 우리는이 두 기능을 사용하는 일반적인 함정을 분석하고 피하는 방법에 대해 논의 할 것입니다.

Sprintf 의 일반적인 함정

sprintf 함수는 주어진 형식 문자열에 따라 전달 된 매개 변수를 지정된 문자열로 포맷 할 수 있습니다. 일반적인 사용 시나리오에는 SQL 쿼리 문에 데이터 삽입, 로그 메시지 구성 등이 포함됩니다. 그러나 Sprintf 의 부적절한 사용은 다음과 같은 문제로 이어질 수 있습니다.

1. 형식 문자열 오류

printfsprintf 의 첫 번째 매개 변수는 형식 문자열이며, 후속 매개 변수는 형식에 따라 형식화됩니다. 형식 문자열이 잘못된 경우 출력이 잘못되거나 심각한 오류가 발생할 수 있습니다.

예를 들어:

 $number = 123;
echo sprintf("%d is the number", $number);  // 올바른 출력:123 is the number
echo sprintf("%s is the number", $number);  // 오류 출력:123 is the number

위의 예에서, %s는 숫자가 아닌 문자열을 포맷하는 데 사용되며 %d는 정수를 포맷하는 데 사용됩니다. 형성자 및 데이터 유형의 일치에주의를 기울이지 않으면 예상치 못한 결과가 발생할 수 있습니다.

2. SQL 주입 위험

Sprintf는 종종 SQL 쿼리를 빌드하는 데 사용됩니다. 사용자 입력이 적절한 탈출 또는 매개 변수화 된 쿼리없이 SQL 쿼리 문자열에 직접 포함 된 경우 SQL 분사 취약점이 발생할 수 있습니다. 예를 들어:

 $username = $_GET['username'];
$query = sprintf("SELECT * FROM users WHERE username = '%s'", $username);

사용자 가 $ username을 입력하고 제대로 필터링되거나 탈출되지 않은 경우 공격자는 악의적 인 SQL 문을 입력하여 데이터베이스를 공격 할 수 있습니다.

보안 실무 : 사용자 입력을 SQL 쿼리에 직접 입력하는 대신 항상 매개 변수화 쿼리를 사용하십시오. PHP의 PDO 및 MySQLI는 모두 매개 변수화 된 쿼리를 지원하며 SQL 주입의 위험을 피하는 것이 좋습니다.

3. 배열 및 객체 서식 문제

Sprintf는 배열 또는 객체를 직접 포맷 할 수 없습니다. %s는 배열 또는 객체를 포맷하는 데 사용될 수 있지만 __toString () 메소드 만 호출하거나 문자열로 직접 출력합니다. 이는 일반적으로 원하는 결과가 아닙니다. 예를 들어:

 $array = [1, 2, 3];
echo sprintf("Array: %s", $array);  // 산출:Array: Array

안전 실무 : 배열 또는 객체를 포맷 해야하는 경우 먼저 문자열로 변환 할 수 있으며, 일반적으로 json_encode () 또는 implode ()를 사용하여 구현할 수 있습니다.

json_encode () 의 일반적인 함정

JSON_ENCODE ()는 PHP 데이터 구조를 JSON 형식의 문자열로 변환하는 데 사용됩니다. 이 기능은 API 개발 및 데이터 교환에서 매우 일반적입니다. 그러나 실제로 사용하면 json_encode () 도 문제를 일으킬 수도 있습니다.

1. 비 ultf-8 문자열

JSON_ENCODE ()는 UTF-8에 인코딩 된 문자열을 JSON으로 올바르게 변환하는 것만 지원합니다. 다른 문자 세트 (예 : gbk)의 문자열을 인코딩하려고하면 json_encode ()가 거짓을 반환하고 명시 적 오류 메시지를 제공하지 않습니다. 이 문제를 피하려면 통과 된 문자열이 UTF-8 인코딩되어 있는지 확인하십시오.

 $string = "이것은 중국어 텍스트입니다";
echo json_encode($string);  // 正常산출: "이것은 중국어 텍스트입니다"

문자열이 UTF-8 인코딩이 아닌 경우 json_encode ()가 false를 반환 하고이 오류를 직접 포착하지 못할 수 있습니다.

안전 실습 : MB_CONVERTT_ENCODING ()을 사용하거나 데이터베이스에서 가져온 문자열이 이미 UTF-8 인코딩되어 있는지 확인하십시오.

2. 오류 JSON 형식

JSON_ENCODE ()는 리소스 ( 리소스 ) 및 클로저 ( 폐쇄 )와 같은 특수 데이터 구조를 처리 할 수 ​​없습니다. 이 데이터를 인코딩하려고하면 json_encode ()가 false를 반환합니다.

 $resource = fopen('file.txt', 'r');
echo json_encode($resource);  // 반품:false

안전 실무 : JSON_ENCODE () 로 전달하기 전에 데이터에 리소스 유형이 포함되어 있지 않거나 적절한 변환 기능으로 처리하십시오.

3. json_encode ()false를 반환합니다

json_encode ()false를 반환하면 인코딩 프로세스 중에 오류가 발생했지만 특정 오류 정보를 제공하지 않습니다. 더 나은 디버깅을 위해 JSON_LAST_ERROR ()를 사용하여 오류 코드와 JSON_LAST_ERROR_MSG ()를 가져와 오류 메시지를 가져올 수 있습니다.

 $data = ['key' => "\xB1\x31"];
$json = json_encode($data);
if ($json === false) {
    echo 'JSON 실수: ' . json_last_error_msg();
}

요약 : SprintfJson_encode ()를 안전하게 사용하는 방법

  1. Sprintf를 정당하게 사용하여 문자열을 형식으로 사용하십시오 . 서식이 데이터 유형과 일치하고 SQL 주입 취약점을 피한 후 먼저 배열을 형식화 할 때 문자열로 변환하십시오.

  2. NONTF-8 인코딩 된 문자열을 JSON_ENCODE () 로 전달하지 마십시오.

  3. json_encode ()가 거짓말을 반환하는 상황을 처리합니다. 거짓 : JSON_LAST_ERROR_MSG ()를 사용하여 인코딩 오류의 특정 원인을 찾으십시오.

  4. 리소스 또는 객체를 형식화하지 마십시오 : 예측할 수없는 오류를 피하기 위해 적절한 방법으로 프로세스 어레이, 객체 또는 리소스를 적절한 방법으로합니다.

이러한 보안 사양을 따르면 SprintfJson_encode ()를 사용할 때의 일반적인 함정을 효과적으로 피할 수 있으므로 코드의 보안 및 견고성이 향상됩니다.


기사의 끝