개발자
Editor를 만드는데 Notion처럼 안쪽 내용을 드래그해서 그 드래그한 내용을 mark같은 태그로 감싸주는 기능을 만드려고 합니다 기능구현은 문제가 없지만 데이터를 저장할때 html태그가 포함된 string으로 저장할 방법밖에 생각이 안납니다 그래서 저장전 혹은 태그로 감싸기전 여러 확인작업을 거칠것이긴하나 XSS공격이 조금 무섭네요 혹시 다른 아이디어가 있을까요?
답변 1
인기 답변
"잘" 쓰면 당연히 괜찮습니다. 하지만, 프로그램이 복잡해 질수록 잘 쓰는게 어렵기 때문에 Trusted Types 같은 것들을 이용해서 특정 경우에만 작동이 되도록 강제 하기도 합니다. (퍼포먼스 관점에서는 여전히 안 좋을 수 있습니다. innerHTML이 실행 되고 나서야 html 파싱과 렌더링이 시작되니까요.) 이미 렌더링 되어있는 html을 DB등에 저장하기 위해서 어쩔수 없이 string으로 변환 했다가 다시 렌더링 해야 하는 상황인가요? 대상이 되는 노드의 패턴이 일정하거나 간단하다면, 텍스트와 속성만 저장해 둔 후에 다시 자바스크립트 상에서 같은 모양의 노드를 직접 만드는게 당연히 좋긴 합니다. 그게 아니라면 상황에 따라 다를 것 같습니다. 예를 들어, (1) 렌더링 되어있는 노드 읽기 (2) 다른 태그로 감싸기 -> (3) 문자열로 저장 -> (4) 불러오기 -> (5) innerHTML 이라는 순서라고 했을때, 지금 질문을 봤을때 (2) 에서 복잡한 과정을 하는 것 같지 않거든요, 그러면 애초에 (1) 에서 XSS가 일어났어야 (5) 에서도 일어난다는 것인데. 그러면 (1) 번을 먼저 제대로 처리 하는게 맞을것 같고요. 아니면, (1) 에서는 self-XSS 라서 별로 상관없는데, (5) 에서는 다른 사람들도 그 페이지를 볼 수 있는 경우라면 조금복잡합니다. 가장 간단한건 DOMPurify 같은 라이브러리를 활용해서 스크립트가 작동 될 수 있을만한 부분들을 다 제거하는 것입니다. 하지만, 라이브러리 자체 버그나 취약점이 있을 수 있어서 놓치는 부분들이 있을 수 있고, 업데이트를 계속 해줘야 합니다. 조금 더 철저하고 비싼 접근법으로 가면 그냥 innerHTML에서 XSS가 일어날 수 있다고 가정을 해버리고, 렌더링을 할 때 sandbox 환경에서 할 수도 있습니다. 아예 다른 origin에서 렌더링을 시키고, XSS가 발생해도 딱히 아무것도 할 수 없게 해버리는 거죠.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 01월 20일
XSS(Cross Site Scripting) 공격은 JavaScript를 통해 사용자의 정보를 해킹하는 기법으로, 주로 웹사이트에 스크립트를 삽입하는 방식으로 이루어집니다. innerHTML을 사용하여 문자열을 HTML로 바꾸는 경우, 이러한 문제가 발생할 수 있습니다. innerHtml을 안전하게 사용하려면 다음과 같은 방법들이 있습니다: 1. 데이터를 출력하기 전에 escape 처리를 하여, 태그 등의 특수문자가 그대로 실행되지 않도록 합니다. 2. 가능하다면 textContent 혹은 innerText 속성을 사용합니다. 이는 내부의 HTML 코드등을 무시하고 순수한 텍스트만 처리하기 때문에 Xss 공격 위험성이 없습니다. 하지만 드래그하여 HTML태그로 감싸는 기능을 구현하신다니, 어쩌면 좀 더 복잡한 해결책이 필요할 수도 있습니다. 여기서 아이디어 사항은 서버에서 저장되는 모든 데이터에 대해 화이트리스트 기반의 HTML 새니타이징(sanitizing)될 수 있다면 정말 좋을 것 같습니다. 예를 들어서, "strong", "em", "mark"와 같은 태그만 들어오게끔 하여, 잠재적인 공격벡터를 줄이는 것입니다. 또한 Content Security Policy (CSP)를 설정하여, 특정 도메인에서 로드되는 스크립트만 실행하게 하면 XSS 공격을 막을 수 있습니다. 이 외에도, 프론트엔드 자바스크립트 라이브러리 이용 시 리액트(React)와 같은 라이브러리를 사용하면, 기본적으로 XSS 공격을 방지하는 기능들을 내장하고 있습니다. 예를 들어, 리액트의 JSX에서는 중괄호 안에 변수를 넣으면 해당 변수의 값을 HTML escape 처리해주므로 실수로 인해 XSS가 발생하지 않게 도와줍니다. 마지막으로 범용적인 방법들 외에도 다양한 라이브러리나 미들웨어 등도 제공하고 있으니, 상황에 맞게 적절히 선택해서 활용해 보시면 좋을 것 같습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!