저는 문자열 대신 "예기치 않은" 배열이 포함된 변수를 전송하면 치명적인 오류나 기타 바람직하지 않은 동작이 발생할 수 있다는 사실을 최근 발견했습니다. 예:
다음과 같은 배열이 있습니다:
으아아아사용자는 이 목록에서 요소를 찾는 데 사용되는 $_REQUEST["key"]
를 보냅니다.
$_REQUEST["key"]
的类型为 string
、int
、float
、bool
或 null
가 string
, int
, float
, bool
또는 null
유형인 경우 , 스크립트는 발견된 항목을 표시하거나 아무것도 표시하지 않습니다(= null). 이는 원하는 동작입니다.
$_REQUEST["key"]
是 array
가 배열
인 경우 스크립트가 치명적인 오류와 함께 중지됩니다.
이제 확실한 해결책은 코드 전체에 수천 개의 유형 검사(is_scalar()
或 !is_array()
)를 추가하는 것입니다. 하지만 보안 관점에서 다음 대안이 합리적으로 들리는지 궁금합니다.
각 요청이 시작될 때 다음 스크립트가 실행됩니다.
으아아아이렇게 하면 어레이를 서버로 보내는 것이 효과적으로 비활성화됩니다. 코드 배열의 위치가 실제로 필요한 경우 json_decode()
을 사용하여 수동으로 디코딩됩니다.
이거 좋은 생각인가요?
각 입력 변수를 수동으로 검증하지 않으려면 각 입력 변수를 수동으로 디코딩합니다. 나에게는 똑같은 짜증이 나지만 더 혼란스럽고 성능이 떨어지며 새로운 버그가 있습니다(예:
json_encode()
입력이 유효한 UTF-8이 아니면 중단됩니다).일반적으로 애플리케이션 입력을 명시하는 것이 좋습니다. 알려진 상태에서 알려진 변수 세트를 사용하면 실제로 시간과 문제를 줄일 수 있습니다.
으아아아TypeError
만 걱정된다면 모든 것을 try/catch 블록으로 묶을 수 있습니다.코드 중복을 피하기 위해 함수를 사용할 수 있습니다:
으아아아검증 프레임워크를 구축하거나 타사 프레임워크를 사용할 수 있습니다.
모든 입력을 엉망으로 만들기 전에 특정 특수 사례를 방지하기 위해 해야 할 일이 많이 있습니다.