현재 위치: > 최신 기사 목록> [안전한 문자열 비교를 달성하기 위해 strncmp 함수를 사용하는 방법은 무엇입니까? PHP 보안 코딩을위한 필수 기술]

[안전한 문자열 비교를 달성하기 위해 strncmp 함수를 사용하는 방법은 무엇입니까? PHP 보안 코딩을위한 필수 기술]

gitbox 2025-06-20

1. strncmp 함수는 무엇입니까?

strncmp 함수는 두 줄을 비교하기 위해 PHP가 제공하는 함수입니다. strcmp 와 달리 strncmp는 지정된 문자 수 내에서 비교되므로 정상 문자열 비교보다 더 정확하고 안전합니다. strncmp 함수의 구문은 다음과 같습니다.

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> )
</span></span>
  • $ str1 : 첫 번째 문자열.

  • $ str2 : 두 번째 문자열.

  • $ 길이 : 비교할 최대 문자 수입니다.

이 함수는 정수 값을 반환하고 두 문자열의 크기 관계에 따라 다음 상황을 반환합니다.

  • 0의 반환 값은 두 줄이 지정된 길이에서 정확히 같음을 의미합니다.

  • 반환 값은 0보다 작습니다. $ str1$ str2 보다 작습니다.

  • 반환 값은 0보다 큽니다. $ str1$ str2 보다 큽니다.

2. 문자열 비교에 strncmp를 사용해야하는 이유는 무엇입니까?

PHP에서 일반적으로 사용되는 문자열 비교 함수는 strcmpstrcasecmp 입니다. 이러한 기능은 전체 문자열을 처음부터 끝까지 비교합니다. 그러나 보안 관련 애플리케이션에서 이러한 기능을 직접 사용하면 특히 시간 공격에 직면 할 때 잠재적 인 위험이 발생할 수 있습니다.

2.1 타임 공격

Time Attack은 비교 작업에서 시스템에 소요되는 시간 차이를 측정하여 데이터 컨텐츠를 유도하는 공격입니다. 공격자는 지속적으로 다른 문자열을 시도하고 비교 작업에 의해 소비 된 시간을 기준으로 올바른 문자열을 점차적으로 추론 할 수 있습니다.

예를 들어, strcmpstrcasecmp 함수는 문자 별 두 문자를 비교하고 첫 번째 불일치 문자가 발견 될 때 결과를 반환합니다. 이것은 두 문자열의 처음 몇 문자가 동일하다면, 그 기능은 후속 문자를 비교하는 데 더 많은 시간이 걸린다는 것을 의미합니다. 공격자는이를 활용하여 반복 시험을 통해 올바른 캐릭터 순서를 찾을 수 있습니다.

2.2 STRANCMP 보안

STRNCMP 함수를 사용하면 개발자가 문자열을 비교하는 문자 수를 제한 할 수 있습니다. 이는 두 문자열의 처음 몇 자리가 동일하더라도 StrNCMP는 지정된 문자 길이 만 비교하여 다른 문자를 계속 비교하지 않으므로 시간 차이로 문자열을 유추 할 가능성이 줄어 듭니다. STRNCMP 함수의 정확한 제어와 결합하여 잠재적 인 시간 공격을 효과적으로 피할 수 있습니다.

3. 안전한 문자열 비교에 strncmp를 사용하는 방법은 무엇입니까?

안전한 문자열 비교를 할 때 strncmp를 다음과 같은 방법으로 사용할 수 있습니다.

3.1 고정 길이 스트링 비교

두 개의 고정 길이 문자열을 비교 해야하는 경우 비교할 문자 수를 직접 지정할 수 있습니다. 예를 들어, 길이 16의 두 해시를 비교 해야하는 경우 :

 <span><span><span class="hljs-variable">$hash1</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$hash2</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$hash1</span></span><span>, </span><span><span class="hljs-variable">$hash2</span></span><span>, </span><span><span class="hljs-number">32</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'두 해시는 동일합니다'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'다른 해시 값'</span></span><span>;
}
</span></span>

이 예에서는 strncmp 함수를 사용하여 32 자 비교 만 제한하여 시간 공격을 피할 수 있습니다.

3.2 사용자 입력을 비교하십시오

사용자가 입력 한 비밀번호 또는 기타 민감한 데이터를 확인 해야하는 경우 StrCMP를 직접 사용하지 않아야합니다. 사용자가 입력하고 저장 한 비밀번호 해시 값은 strncmp 와 비교할 수 있습니다. 예를 들어:

 <span><span><span class="hljs-variable">$userInput</span></span><span> = </span><span><span class="hljs-string">'password123'</span></span><span>;
</span><span><span class="hljs-variable">$storedHash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$4.2T70akfYlBpgk2JqJbVvDrzVX9pIHH9RbHg5bWlfu'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strncmp</span></span><span>(</span><span><span class="hljs-variable">$userInput</span></span><span>, </span><span><span class="hljs-variable">$storedHash</span></span><span>, </span><span><span class="hljs-number">60</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'비밀번호가 성공적으로 일치합니다'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'오류 비밀번호'</span></span><span>;
}
</span></span>

이 예에서는 사용자가 비밀번호를 입력하여 저장된 해시 값과 비교했다고 가정합니다. 60에 비해 문자 수를 제한함으로써 보안을 보장합니다.

4. strncmphash_equals 함수의 비교

STRNCMP는 어느 정도의 보안을 제공하지만 PHP는 보안 문자열 비교를 위해보다 구체적으로 다른 기능을 제공합니다. Hash_equals는 시간 공격을 피하도록 특별히 설계되었으며 문자열 길이 또는 내용 유사성의 영향을받지 않으므로 해시 비교를위한 더 나은 선택입니다. 사용법은 다음과 같습니다.

 <span><span><span class="hljs-variable">$expected</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;
</span><span><span class="hljs-variable">$actual</span></span><span> = </span><span><span class="hljs-string">'d41d8cd98f00b204e9800998ecf8427e'</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$expected</span></span><span>, </span><span><span class="hljs-variable">$actual</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'해시 값은 동일합니다'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'다른 해시 값'</span></span><span>;
}
</span></span>

Hash_equals는 더 높은 보안을 제공하지만 부분 문자를 비교하는 경우 (예 : 해시 값의 처음 32 자 비교)를 비교하는 경우에도 STRNCMP는 여전히 실행 가능한 옵션입니다.

5. 결론

문자열을 비교할 때 보안은 우리가 고려하는 첫 번째 요소 중 하나 여야합니다. PHP의 STRNCMP 기능을 사용하면 특히 고정 길이 문자열을 비교할 때 시간 공격의 위험을 효과적으로 줄일 수있어 개발자가 애플리케이션 보안을 향상시키는 데 도움이 될 수 있습니다. 그러나 strncmp는 전능하지 않으며, 더 복잡한 보안 요구 사항 (예 : 해시 값의 완전한 비교)을 사용하는 것이 더 이상적인 선택이 될 것입니다.

문자열 비교 방법을 합리적으로 선택함으로써 PHP 응용 프로그램이 더 안전하고 신뢰할 수 있도록 사용자의 민감한 정보를 잠재적 공격으로부터 보호 할 수 있습니다.