PHP: 사용자 입력에서 (예기치 않은) 배열 처리하기
P粉547362845
P粉547362845 2024-04-01 17:56:37
0
1
589

저는 문자열 대신 "예기치 않은" 배열이 포함된 변수를 전송하면 치명적인 오류나 기타 바람직하지 않은 동작이 발생할 수 있다는 사실을 최근 발견했습니다. 예:

다음과 같은 배열이 있습니다:

으아아아

사용자는 이 목록에서 요소를 찾는 데 사용되는 $_REQUEST["key"]를 보냅니다.

으아아아

$_REQUEST["key"] 的类型为 stringintfloatboolnullstring, int, float, bool 또는 null 유형인 경우 , 스크립트는 발견된 항목을 표시하거나 아무것도 표시하지 않습니다(= null). 이는 원하는 동작입니다.

$_REQUEST["key"]array배열인 경우 스크립트가 치명적인 오류와 함께 중지됩니다.


이제 확실한 해결책은 코드 전체에 수천 개의 유형 검사(is_scalar()!is_array())를 추가하는 것입니다. 하지만 보안 관점에서 다음 대안이 합리적으로 들리는지 궁금합니다.

각 요청이 시작될 때 다음 스크립트가 실행됩니다.

으아아아

이렇게 하면 어레이를 서버로 보내는 것이 효과적으로 비활성화됩니다. 코드 배열의 위치가 실제로 필요한 경우 json_decode() 을 사용하여 수동으로 디코딩됩니다.

이거 좋은 생각인가요?

P粉547362845
P粉547362845

모든 응답(1)
P粉668113768

각 입력 변수를 수동으로 검증하지 않으려면 각 입력 변수를 수동으로 디코딩합니다. 나에게는 똑같은 짜증이 나지만 더 혼란스럽고 성능이 떨어지며 새로운 버그가 있습니다(예: json_encode() 입력이 유효한 UTF-8이 아니면 중단됩니다).

일반적으로 애플리케이션 입력을 명시하는 것이 좋습니다. 알려진 상태에서 알려진 변수 세트를 사용하면 실제로 시간과 문제를 줄일 수 있습니다.

으아아아

TypeError만 걱정된다면 모든 것을 try/catch 블록으로 묶을 수 있습니다.

코드 중복을 피하기 위해 함수를 사용할 수 있습니다:

으아아아

검증 프레임워크를 구축하거나 타사 프레임워크를 사용할 수 있습니다.

모든 입력을 엉망으로 만들기 전에 특정 특수 사례를 방지하기 위해 해야 할 일이 많이 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿