현재 위치: > 최신 기사 목록> PHP에서 Bindec () 함수가 이진이없는 스트링 주입에 의해 공격되는 것을 효과적으로 방지하는 방법은 무엇입니까?

PHP에서 Bindec () 함수가 이진이없는 스트링 주입에 의해 공격되는 것을 효과적으로 방지하는 방법은 무엇입니까?

M66 2025-06-23

PHP 개발에서 Bindec () 함수는 이진 문자열을 소수 값으로 변환하는 데 사용됩니다. 원리는 간단하고 효율적이지만 전달 된 매개 변수가 순수한 이진 문자열이 아닌 경우 ( 01 만 포함) 예상치 못한 동작 및 잠재적 보안 위험으로 이어질 수 있습니다. 이 기사는 프로그램의 보안 및 안정성을 보장하기 위해 Bindec () 함수가 이진이 아닌 문자열에 주입되는 것을 효과적으로 방지하는 방법을 소개합니다.

1. bindec () 함수의 기본 동작

bindec ()은 문자열이 다음과 같은 바이너리 숫자라고 가정하고 문자열 매개 변수를 수락합니다.

 echo bindec("1101"); // 산출 13

그러나 이진이 아닌 문자로 통과하는 경우 : 예를 들어 :

 echo bindec("1102abc"); 

Bindec ()는 첫 번째 비 이진 문자 및 모든 후속 문자를 무시하고 유효한 부분 만 변환하며 출력은 6 입니다 ( 110 에 해당하는 소수).

이것은 오류를보고하지 않지만 논리적 취약점으로 이어질 수 있습니다. 공격자는 이진이없는 문자를 주입하여 프로그램 논리를 방해 할 수 있습니다.

2. 안전 위험 분석

이진이없는 문자열 주입은 다음을 일으킬 수 있습니다.

  • 데이터 변조 : 불법 문자는 처리되어야하는 이진 데이터를 잘라냅니다.

  • 비즈니스 로직 오류 : 이진 전환 결과를 기반으로 한 프로그램 판사와 비정상 입력은 판단 오류로 이어집니다.

  • 잠재적 공격 표면 : ​​다른 취약점과 결합 된 것이 악용 될 수 있습니다.

따라서 입력의 엄격한 검증이 예방의 열쇠입니다.

3. 주사 공격을 방지하기위한 효과적인 전략

3.1 입력 확인 : 정규 표현식을 사용하여 엄격하게 제한하십시오

bindec ()을 호출하기 전에 일반 표현식을 사용하여 입력에 01 만 포함되어 있는지 확인하십시오.

 $binary = $_GET['binary'] ?? '';

if (!preg_match('/^[01]+$/', $binary)) {
    // 불법 입력 처리
    die('입력은 순수한 바이너리 스트링 여야합니다');
}

$result = bindec($binary);
echo "결과를 변환하십시오:" . $result;

여기서 preg_match ( '/^[01]+$/', $ binary)는 문자열이 01 으로 구성되며 길이가 1 이상인지 확인합니다.

3.2 건 및 경계 점검

검증이 전달 되더라도 오버플로 또는 예외를 방지하기 위해 후속 처리 중에 숫자 범위를 판단하는 것이 좋습니다.

 $decimal = bindec($binary);
if ($decimal < 0 || $decimal > PHP_INT_MAX) {
    die('값은 허용 범위를 초과합니다');
}

3.3 캡슐화 기능을 사용한 통합 처리

손쉬운 유지 보수 및 업그레이드를 위해 안전한 변환 기능을 캡슐화하십시오.

 function safeBindec(string $binary): int {
    if (!preg_match('/^[01]+$/', $binary)) {
        throw new InvalidArgumentException('입력은 순수한 바이너리 스트링 여야합니다');
    }
    $decimal = bindec($binary);
    if ($decimal < 0 || $decimal > PHP_INT_MAX) {
        throw new OutOfRangeException('값은 허용 범위를 초과합니다');
    }
    return $decimal;
}

// 사용의 예
try {
    $input = $_POST['bin'] ?? '';
    $result = safeBindec($input);
    echo "안전한 전환 결과:" . $result;
} catch (Exception $e) {
    echo "실수:" . $e->getMessage();
}

3.4 필터 기능을 통합하여 안전을 향상시킵니다

PHP의 내장 필터는 간단한 검증을 수행 할 수도 있습니다.

 $binary = filter_input(INPUT_GET, 'binary', FILTER_SANITIZE_STRING);
if (!preg_match('/^[01]+$/', $binary)) {
    die('유효하지 않은 이진 문자열');
}

4. 요약

  • bindec () 함수는 부분적으로 비 이진 문자를 구문 분석하여 잠재적 인 주입 위험을 초래합니다.

  • 가장 중요한 것은 통화 전에 입력을 엄격하게 확인하여 01 만 포함하도록하는 것입니다.

  • 일반 표현식과 예외 처리를 결합하면 강력한 보안 메커니즘이 달성됩니다.

  • 쉽게 유지 관리 및 통합 관리를 위해 검증 및 변환 로직을 캡슐화하는 것이 좋습니다.


 <?php
// 안전한 사용의 샘플 코드 데모 bindec()

function safeBindec(string $binary): int {
    if (!preg_match('/^[01]+$/', $binary)) {
        throw new InvalidArgumentException('입력은 순수한 바이너리 스트링 여야합니다');
    }
    $decimal = bindec($binary);
    if ($decimal < 0 || $decimal > PHP_INT_MAX) {
        throw new OutOfRangeException('값은 허용 범위를 초과합니다');
    }
    return $decimal;
}

try {
    // 가정합니다 URL 이진 문자열을 얻으십시오,도메인 이름을 대체하십시오 m66.net
    $input = $_GET['bin'] ?? '';
    $result = safeBindec($input);
    echo "결과를 변환하십시오:" . $result;
} catch (Exception $e) {
    echo "실수:" . $e->getMessage();
}
?>