← 질문 목록
#365깊이 0
사용자 입력을 왜 전부 의심해야 하는가?
공격자가 마음대로 정할 수 있는 값이라서다. 그중 가장 파괴적인 길이 데이터가 코드로 해석되는 것이고, SQL 인젝션과 XSS는 겉모습만 다를 뿐 이 구조를 공유한다.
- 입력이 문자열로 들어온다
그다음은 검증 없이 쿼리나 HTML에 이어 붙인다입니다. 그다음
검증 없이 쿼리나 HTML에 이어 붙인다그다음은 해석기는 어디까지가 데이터인지 모른다입니다. 그다음
해석기는 어디까지가 데이터인지 모른다그다음은 입력 일부가 명령으로 해석될 수 있다입니다. 그다음
입력 일부가 명령으로 해석될 수 있다
막는 원칙은 붙이지 않는 것이다. 쿼리는 파라미터 바인딩으로 값과 명령을 분리해 전달하고, 화면에 내보낼 때는 그 문맥에 맞게 이스케이프한다.
이스케이프는 문맥마다 다르다. HTML과 자바스크립트 문자열과 URL은 위험한 글자가 서로 달라 한 번의 치환으로 전부를 막을 수 없다. 사용자에게 HTML 자체를 허용한다면 치환이 아니라 정화 도구가 필요하다.
주의
클라이언트 검증은 보안이 아니다. 화면의 검사는 도구로 얼마든지 건너뛸 수 있으므로 사용성 장치일 뿐이고, 지키는 검증은 서버 진입점에서 다시 한다.
의심할 범위는 폼 입력만이 아니다. 헤더, 쿠키, URL 경로, 업로드된 파일 이름까지 — 신뢰 경계 밖에서 온 것은 전부 같은 자격이다. 코드가 되지 않아도 경로를 타고 남의 파일에 닿거나 서버를 대신 움직이게 하는 길도 있다.
공격 이름보다 데이터와 명령이 섞이는 구조를 봐야 한다. 인젝션 계열의 답은 늘 같다 — 데이터와 명령을 한 줄에 섞지 않는다.