Actix Web에 패치를 보내면

5407 단어 RustSecuritytech

개시하다


며칠 전에 Actix Web에 패치를 보냈습니다.말은 그렇지만 사실은 호스트가 아니라 examples에 저장된 todo 응용 프로그램의 이야기입니다.
https://github.com/actix/examples/pull/366
이 글은 내가 왜 이 패치를 보냈는지, 이 todo 응용 프로그램의 오류를 어떻게 발견했는지 소개하고 싶다.기술적인 이슈는 거의 없다.

어떻게 찾았어요?


나는 웹 애플리케이션을 시도할 때, 그 앱이 믿을 만한지 확인하기 위해, 자주 XSS의 코드를 입력상자에 끼워 넣는다.악의는 없습니다.자위야.엔지니어라면 다들 할 것 같아서요.(응, 안 해, 그래)
그럼에도 불구하고 최근에 템플릿 엔진을 사용하는 것은 당연해졌다. 그렇게 alert가 표시된 일은 거의 없다.그리고 요즘은 XSS를 만드는 게 부끄러울 정도예요.이런 상황에서 며칠 전에 시도한 액티브 웹의 examples/todo는 alert를 완벽하게 보여 준다.


하지만 소스 코드를 봤더라도 Rust의 템플릿 엔진Tera을 잘 사용하겠습니다.최근의 템플릿 엔진이 기본적으로 HTML을 피하지 않는 것이 없을 줄은 몰랐기 때문에 나는'이게 나쁜 것을 찾았나?'라고 생각했다.

무슨 문제가 생겼어요?


테라가 HTML을 어떻게 피하는지 살펴봅시다.테라가 템플릿 엔진에서 평가한 수치는 src/renderer/processor.rs의 evalexpression였다.
        if self.should_escape && needs_escape && res.is_string() && !expr.is_marked_safe() {
            res = Cow::Owned(
                to_value(self.tera.get_escape_fn()(res.as_str().unwrap())).map_err(Error::json)?,
            );
        }
이것<script>alert(1)</script>should_escape의 구조기Processor이다.그리고 이것newshould_escape부터내게 맡기다.autoescape_suffix해내다autoescape_suffix.html이다.오, 점 포함.예, Tera는 파일 형식이 아니라 확장자로 지정됩니다.htm.확실히 todo 응용 프로그램의 원본에 사용된 템플릿 파일의 확장자는 .xml 이다.
기본값
이렇게 되면 autoescape_on도 반드시 도피 대상이 되어야 한다.

수정된 내용


원래 테라는 확장자.html.tera의 파일을 사상적으로 처리하기 때문에 확장자.tera를 도피 대상으로 설정했다.
https://github.com/actix/examples/blob/a1f2f9514e04f5872d89e7d52e5e59dfa4ae01fd/todo/templates/index.html.tera
이렇게 해서 드디어 XSS가 없으면 입력할 수 있다.

맞다


테라가 자동으로 대피할 것이라는 의견이 많았고, 지티허브에는 이 파일 이름을 사용한 사람https://github.com/actix/examples/pull/366/files#diff-571e364f06e9977e9b8dc3d0a0a02382이 있었다.
조심하세요.그리고 사용.html 또는 템플릿autoescape_on을 가르쳐 줍니다.
그렇지 않으면 .tera가 표시됩니다.

좋은 웹페이지 즐겨찾기