와 같은 URL로 이동하는 경우 document.write()는 악성 스크립트를 직접 렌더링합니다. 페이지.

XSS를 방지하는 방법:

  const userInput = sanitizeHtml(getUserInput());

DOMPurify와 같은 라이브러리를 사용하여 입력을 삭제합니다.

CSP 헤더의 예:

  Content-Security-Policy: default-src \\'self\\'; script-src \\'self\\' https://trusted.com

2. 사이트 간 요청 위조(CSRF)

CSRF는 공격자가 사용자를 속여 자신도 모르게 악의적인 요청을 제출하도록 하는 공격입니다. 이는 브라우저가 요청과 함께 쿠키와 같은 자격 증명을 자동으로 포함한다는 사실을 이용하여 공격자가 사용자를 대신하여 작업을 수행할 수 있도록 합니다.

취약한 형태의 예:

양식이 취약한 경우 공격자는 다른 사이트에서 가짜 양식을 만들어 로그인한 사용자를 대신하여 요청을 제출할 수 있습니다.

CSRF를 방지하는 방법:

  
  Set-Cookie: sessionId=abc123; SameSite=Strict

3. 안전하지 않은 역직렬화

신뢰할 수 없는 데이터를 사용하여 애플리케이션에서 개체를 생성할 때 안전하지 않은 역직렬화가 발생하여 공격자가 임의 코드를 실행하거나 권한을 상승시킬 수 있습니다.

취약한 코드의 예:

const user = JSON.parse(dataFromUser);

dataFromUser가 변조된 경우 역직렬화 프로세스로 인해 의도하지 않은 개체가 생성되거나 위험한 메서드가 실행될 수 있습니다.

안전하지 않은 역직렬화를 방지하는 방법:

4. 서버 측 JavaScript 주입

Node.js 환경과 같이 서버측 JavaScript 실행이 필요한 경우도 있습니다. 서버 측 JavaScript 주입은 신뢰할 수 없는 데이터가 서버에서 코드로 실행될 때 발생하며, 이로 인해 코드 실행 취약점이 발생합니다.

취약한 코드의 예:

eval(userInput);

공격자가 userInput을 제어할 경우 서버에 악성 코드를 주입하고 실행할 수 있습니다.

서버측 JavaScript 삽입을 방지하는 방법:

  const safeFunction = new Function(\\'return 2   2\\');

5. 깨진 인증

인증은 사용자의 신원을 확인하는 프로세스입니다. 손상된 인증은 애플리케이션에 약하거나 결함이 있는 인증 메커니즘이 있을 때 발생하며, 이로 인해 공격자가 합법적인 사용자를 가장할 수 있습니다.

일반적인 취약점:

인증 강화 방법:

  res.cookie(\\'sessionId\\', sessionId, { httpOnly: true, secure: true });

6. 민감한 데이터 노출

비밀번호, 신용카드 번호, API 키와 같은 민감한 데이터는 주의 깊게 처리해야 합니다. 이 데이터가 안전하지 않게 저장되거나 전송되면 노출될 수 있습니다.

데이터 노출을 방지하는 방법:

  export API_KEY=your_api_key

7. 검증되지 않은 리디렉션 및 전달

이 취약점은 공격자가 URL을 조작하여 사용자를 악성 사이트로 리디렉션할 때 발생합니다.

취약한 코드의 예:

res.redirect(req.query.redirectUrl);

URL이 확인되지 않으면 공격자가 사용자를 피싱 사이트로 보낼 수 있습니다.

검증되지 않은 리디렉션을 방지하는 방법:


JavaScript 애플리케이션 보안 모범 사례

  1. 정기적인 보안 감사 및 침투 테스트: 감사 및 침투 테스트를 수행하여 애플리케이션의 취약점을 정기적으로 테스트합니다.

  2. 종속성 업데이트: 라이브러리, 프레임워크 및 패키지를 최신 상태로 유지합니다. npm 감사와 같은 도구를 사용하여 프로젝트 종속성의 취약점을 확인하세요.

  3. 최소 권한 원칙을 따르세요: 애플리케이션 내에서 구성 요소와 사용자가 갖는 권한과 액세스를 제한하세요.

  4. 보안 헤더: X-Content-Type-Options, X-Frame-Options 및 Strict-Transport-Security와 같은 HTTP 보안 헤더를 사용하여 보안을 강화합니다.

보안 헤더의 예:

X-Frame-Options: DENYStrict-Transport-Security: max-age=63072000; includeSubDomains; preload
  1. 입력 유효성 검사: 항상 클라이언트 측과 서버 측 모두에서 사용자 입력의 유효성을 검사합니다. 길이, 유형, 형식 및 허용되는 문자에 대해 입력의 유효성을 검사해야 합니다.

결론

JavaScript 애플리케이션은 강력하기는 하지만 공격자가 악용할 수 있는 다양한 취약점에 취약합니다. 이러한 일반적인 취약점을 이해하고 완화함으로써 개발자는 사용자와 데이터를 보호하는 보다 안전한 애플리케이션을 만들 수 있습니다. 정기적인 보안 감사, 보안 코딩 관행, 최신 보안 기능 사용을 통해 잠재적인 위협을 미리 예방할 수 있습니다.

자세한 내용을 읽으려면 개발자는 OWASP 상위 10대 취약점을 주시하고 이러한 통찰력을 개발 관행에 통합해야 합니다.

","image":"http://www.luping.net/uploads/20240916/172648836966e81f3179798.jpg","datePublished":"2024-11-07T21:09:09+08:00","dateModified":"2024-11-07T21:09:09+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JavaScript 애플리케이션 보안: 일반적인 취약점 및 이를 방지하는 방법

JavaScript 애플리케이션 보안: 일반적인 취약점 및 이를 방지하는 방법

2024-11-07에 게시됨
검색:824

Securing JavaScript Applications: Common Vulnerabilities and How to Avoid Them

JavaScript는 웹 개발에 가장 많이 사용되는 언어 중 하나이지만 광범위하게 사용되기 때문에 공격자의 일반적인 표적이기도 합니다. 데이터 도난, 사용자 계정 손상 등으로 이어질 수 있는 보안 침해를 방지하려면 JavaScript 애플리케이션을 보호하는 것이 중요합니다. 이 문서에서는 JavaScript 애플리케이션의 몇 가지 일반적인 취약점을 살펴보고 이를 완화하기 위한 전략을 제공합니다.

일반적인 JavaScript 취약점

1. 크로스 사이트 스크립팅(XSS)

교차 사이트 스크립팅(XSS)은 공격자가 다른 사용자가 보는 웹 페이지에 악성 스크립트를 삽입할 수 있을 때 발생합니다. 이러한 스크립트는 쿠키, 세션 토큰 또는 기타 민감한 정보를 훔칠 수 있습니다.

취약한 코드의 예:

document.write(location.search);

사용자가 https://example.com/?name=와 같은 URL로 이동하는 경우 document.write()는 악성 스크립트를 직접 렌더링합니다. 페이지.

XSS를 방지하는 방법:

  • 입력 삭제: 항상 사용자 입력을 검증하고 삭제합니다.
  const userInput = sanitizeHtml(getUserInput());

DOMPurify와 같은 라이브러리를 사용하여 입력을 삭제합니다.

  • 콘텐츠 보안 정책(CSP) 사용: CSP 헤더는 신뢰할 수 있는 소스에서 제공되지 않은 스크립트의 실행을 차단할 수 있습니다.

CSP 헤더의 예:

  Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com

2. 사이트 간 요청 위조(CSRF)

CSRF는 공격자가 사용자를 속여 자신도 모르게 악의적인 요청을 제출하도록 하는 공격입니다. 이는 브라우저가 요청과 함께 쿠키와 같은 자격 증명을 자동으로 포함한다는 사실을 이용하여 공격자가 사용자를 대신하여 작업을 수행할 수 있도록 합니다.

취약한 형태의 예:

양식이 취약한 경우 공격자는 다른 사이트에서 가짜 양식을 만들어 로그인한 사용자를 대신하여 요청을 제출할 수 있습니다.

CSRF를 방지하는 방법:

  • 안티-CSRF 토큰 사용: 각 세션 또는 양식 제출에 대해 고유한 토큰을 생성하고 서버 측에서 유효성을 검사합니다.
  
  • SameSite 쿠키: SameSite 속성으로 쿠키를 설정하면 쿠키를 사용한 교차 출처 요청을 제한할 수 있습니다.
  Set-Cookie: sessionId=abc123; SameSite=Strict

3. 안전하지 않은 역직렬화

신뢰할 수 없는 데이터를 사용하여 애플리케이션에서 개체를 생성할 때 안전하지 않은 역직렬화가 발생하여 공격자가 임의 코드를 실행하거나 권한을 상승시킬 수 있습니다.

취약한 코드의 예:

const user = JSON.parse(dataFromUser);

dataFromUser가 변조된 경우 역직렬화 프로세스로 인해 의도하지 않은 개체가 생성되거나 위험한 메서드가 실행될 수 있습니다.

안전하지 않은 역직렬화를 방지하는 방법:

  • 신뢰할 수 없는 데이터의 역직렬화 방지: 역직렬화하기 전에 항상 데이터의 유효성을 검사하고 정리하세요.
  • 안전한 라이브러리 사용: 가능하면 직렬화 및 역직렬화를 안전하게 처리하는 라이브러리를 사용하세요.

4. 서버 측 JavaScript 주입

Node.js 환경과 같이 서버측 JavaScript 실행이 필요한 경우도 있습니다. 서버 측 JavaScript 주입은 신뢰할 수 없는 데이터가 서버에서 코드로 실행될 때 발생하며, 이로 인해 코드 실행 취약점이 발생합니다.

취약한 코드의 예:

eval(userInput);

공격자가 userInput을 제어할 경우 서버에 악성 코드를 주입하고 실행할 수 있습니다.

서버측 JavaScript 삽입을 방지하는 방법:

  • eval() 방지: 사용자가 제공한 입력을 실행하는 데 eval()을 사용하지 마세요.
  const safeFunction = new Function('return 2   2');
  • 정적 코드 분석 도구 사용: ESLint와 같은 도구는 잠재적인 코드 삽입 지점을 식별하는 데 도움이 될 수 있습니다.

5. 깨진 인증

인증은 사용자의 신원을 확인하는 프로세스입니다. 손상된 인증은 애플리케이션에 약하거나 결함이 있는 인증 메커니즘이 있을 때 발생하며, 이로 인해 공격자가 합법적인 사용자를 가장할 수 있습니다.

일반적인 취약점:

  • 취약한 비밀번호: 사용자는 쉽게 추측할 수 있거나 손상될 수 있는 비밀번호를 선택할 수 있습니다.
  • 세션 하이재킹: 공격자가 세션 토큰이나 쿠키를 훔칠 수 있습니다.

인증 강화 방법:

  • 다단계 인증(MFA) 사용: 사용자가 여러 방법(예: 비밀번호 SMS 코드)을 사용하여 신원을 확인하도록 요구합니다.

  • 보안 세션 관리: 안전한 HttpOnly 및 암호화된 쿠키를 사용하세요. 세션 고정 공격을 방지하려면 로그인 후 세션 토큰을 다시 생성하세요.

  res.cookie('sessionId', sessionId, { httpOnly: true, secure: true });

6. 민감한 데이터 노출

비밀번호, 신용카드 번호, API 키와 같은 민감한 데이터는 주의 깊게 처리해야 합니다. 이 데이터가 안전하지 않게 저장되거나 전송되면 노출될 수 있습니다.

데이터 노출을 방지하는 방법:

  • 민감한 데이터 암호화: 민감한 정보를 저장하고 전송할 때는 항상 강력한 암호화 알고리즘(예: AES-256)을 사용하세요.
  • HTTPS 사용: 서버와 클라이언트 간의 모든 통신이 TLS(HTTPS)를 사용하여 암호화되었는지 확인하세요.

  • 비밀에 대한 환경 변수: API 키, 데이터베이스 자격 증명 및 기타 비밀을 애플리케이션에 하드 코딩하는 대신 환경 변수 또는 보안 저장소에 저장합니다.

  export API_KEY=your_api_key

7. 검증되지 않은 리디렉션 및 전달

이 취약점은 공격자가 URL을 조작하여 사용자를 악성 사이트로 리디렉션할 때 발생합니다.

취약한 코드의 예:

res.redirect(req.query.redirectUrl);

URL이 확인되지 않으면 공격자가 사용자를 피싱 사이트로 보낼 수 있습니다.

검증되지 않은 리디렉션을 방지하는 방법:

  • URL 허용 목록: 신뢰할 수 있고 사전 정의된 URL로만 리디렉션을 허용합니다.

  • 보안 리디렉션 방법 사용: 사용자를 리디렉션하기 전에 리디렉션 논리가 URL이 안전한지 확인하는지 확인하세요.


JavaScript 애플리케이션 보안 모범 사례

  1. 정기적인 보안 감사 및 침투 테스트: 감사 및 침투 테스트를 수행하여 애플리케이션의 취약점을 정기적으로 테스트합니다.

  2. 종속성 업데이트: 라이브러리, 프레임워크 및 패키지를 최신 상태로 유지합니다. npm 감사와 같은 도구를 사용하여 프로젝트 종속성의 취약점을 확인하세요.

  3. 최소 권한 원칙을 따르세요: 애플리케이션 내에서 구성 요소와 사용자가 갖는 권한과 액세스를 제한하세요.

  4. 보안 헤더: X-Content-Type-Options, X-Frame-Options 및 Strict-Transport-Security와 같은 HTTP 보안 헤더를 사용하여 보안을 강화합니다.

보안 헤더의 예:

X-Frame-Options: DENY
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  1. 입력 유효성 검사: 항상 클라이언트 측과 서버 측 모두에서 사용자 입력의 유효성을 검사합니다. 길이, 유형, 형식 및 허용되는 문자에 대해 입력의 유효성을 검사해야 합니다.

결론

JavaScript 애플리케이션은 강력하기는 하지만 공격자가 악용할 수 있는 다양한 취약점에 취약합니다. 이러한 일반적인 취약점을 이해하고 완화함으로써 개발자는 사용자와 데이터를 보호하는 보다 안전한 애플리케이션을 만들 수 있습니다. 정기적인 보안 감사, 보안 코딩 관행, 최신 보안 기능 사용을 통해 잠재적인 위협을 미리 예방할 수 있습니다.

자세한 내용을 읽으려면 개발자는 OWASP 상위 10대 취약점을 주시하고 이러한 통찰력을 개발 관행에 통합해야 합니다.

릴리스 선언문 이 기사는 https://dev.to/manjushsh/securing-javascript-applications-common-vulnerabilities-and-how-to-avoid-them-4cn3?1에서 복제됩니다. 침해가 있는 경우에는 Study_golang@163으로 문의하세요. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3