NodeJS 보안 모범 사례

이 기사에서는 노드 애플리케이션 보안에 대한 몇 가지 모범 사례를 다룰 것입니다. 이러한 관행은 가능한 취약성 문제를 확인하고 누군가 발견하기 전에 해결하도록 안내합니다.

Unsplash

보안을 고려하는 것은 어렵습니다. 그럼에도 불구하고 개발자는 애플리케이션에 발생할 수있는 모든 피해에 직면 할 준비가되어 있어야합니다. 여기서는 일반 개발자가 애플리케이션을 개발하는 동안 놓치는 몇 가지 잘 알려진 문제를 다룰 것입니다.

배경

2009 년경 Ryan Dahl이 Node를 소개했을 때 자바 스크립트 생태계에 엄청난 호황이있었습니다. Linkedin, Walmart, Paypal, ebay, Uber와 같은 최고의 회사들이이를 채택하기 시작했습니다. 긍정적 인 점은 이제 애플리케이션의 백엔드와 프론트 엔드 모두에 하나의 언어를 사용할 수 있다는 것입니다. 인기와 함께 Node에 대한 몇 가지 보안 문제도있었습니다.

Npm은 세계에서 가장 큰 오픈 소스 패키지 생태계 중 하나입니다. 50 만 개 이상의 패키지로 매일 500 개의 새로운 모듈로 성장하고 있습니다. 우리는이 패키지를 매주 30 억 번 이상 다운로드합니다. 이 규모에서 생태계의 보안은 최우선 순위입니다. 오픈 소스 커뮤니티의 패키지는 몇 가지 보안 위험을 발견했습니다.

공격자는 한 번만 올바르게 처리하면되지만 애플리케이션 개발자는 항상 옳 아야합니다.
-소스 NA

보안 필요

2015 년에 npm 에 게시 된 rimrafall (실제로 이전에 rimraf라는 패키지가 있었음)이라는 패키지 가 악성으로 발견 되어 npm 에서 삭제되었습니다. 또 다른 패키지는 validator.js와 비슷하게 들리는 validator였습니다. 이 패키지는 socket.io라는 이름과 유사하고 uglifyjs는 uglify-js라는 이름과 유사한 또 다른 패키지 socketio도 발견되었습니다.

이러한 문제로 인해 npm은 2018 년 에 프로젝트 종속성 트리에 대한 적시 보안 검토를 수행하고 npm 감사 보안 보고서를 생성하는 새로운 명령 인 npm audit 를 출시하면서 보안에 집중하기 시작했습니다 . 이 보고서에는 종속성의 보안 취약성에 대한 정보가 포함되어 있으며 추가 문제 해결을위한 npm 명령 및 권장 사항을 제공합니다. 운 좋게도 Node.js 보안 프로젝트와 Snyk는 보안 권고를 유지하며 두 회사 모두 CI / CD 환경에서 도구를 실행하기위한 유료 구독 계획을 제공합니다.

앱을 보호하는 방법

애플리케이션을보다 안전하게 만드는 방법에 대해 알아 보겠습니다. 보안을 유지하는 가장 일반적인 방법에 대해 논의 할 것입니다. 논의되는 대부분의 항목은 NodeJS뿐만 아니라 모든 언어와 프레임 워크를 의미합니다.

더 이상 사용되지 않는 패키지 또는 버전을 사용하지 않음

보안 및 성능 문제를 고려한 현재 버전 릴리스의 업데이트를 고려합니다. 그러나 커뮤니티에서 잘 알지 못하는 이전 버전 및 패키지는 사용되지 않습니다.

Linter 보안 규칙 사용

eslint-plugin-security처럼 보안 관련 linter 및 플러그인을 사용해야 합니다. 유사하게 이러한 플러그인을 사용하면 보안 취약점과 문제가 코딩 될 때 가능한 한 빨리 발견 할 수 있습니다. 이것은 또한 코드 관행의 일관성을 유지하는 데 도움이 될 수 있습니다.

엄격 모드 사용

이 플래그를 사용하여 Javascript의 변형을 제한 할 수 있습니다. Strict 모드는 단순한 부분 집합이 아닙니다. 의도적 으로 일반 코드와 다른 의미를 갖습니다. 오류를 발생 시키도록 변경하여 일부 Javascript 오류, 최적화를 수행하기 어렵게 만드는 일부 실수를 제거하는 데 도움이됩니다.이 모드는 엄격 모드가 아닌 동일한 코드보다 언젠가 더 빠르게 실행될 수 있으며 ECMAScript의 미래에 정의 될 일부 구문을 금지합니다. .

정적 코드 분석

JSHint, JSLint 또는 ESLint를 사용하면 코드 초기에 많은 잠재적 인 문제를 포착 할 수 있습니다.

헬멧 모듈 사용

이름으로 무슨 일이 일어나 든 예방을 나타냅니다. Helmet은 다음과 같은 다양한 HTTP 헤더를 확인하여 애플리케이션을 보호하는 데 도움이됩니다.

Unsplash

안전하게 쿠키 사용

쿠키가 악용 할 앱을 열지 않도록하려면 기본 세션 쿠키 이름을 사용하지 않고 쿠키 보안 옵션을 적절하게 설정해야합니다. 또한 익스프레스 세션 또는 쿠키 세션 과 같은 미들웨어 쿠키 세션 모듈을 사용할 수 있습니다. 또한 쿠키 데이터가 클라이언트에게도 표시된다는 사실을 인식해야합니다.

인증 보호

가능한 모든 후보를 체계적으로 열거하고 각 후보가 문제의 진술을 충족하는지 여부를 확인할 수 있습니다. 웹 애플리케이션에서 로그인 엔드 포인트는이를 위해 완벽 할 수 있습니다.

이러한 종류의 공격으로부터 애플리케이션을 보호하려면 일종의 속도 제한 을 구현해야합니다 . 또한 rate-limiter 패키지를 사용하거나 미들웨어로 래핑하고 경로 사이에 배치 할 수도 있습니다.

추가 보안을 위해 패키지 사용

응용 프로그램에 보안 계층을 추가하는 데 도움이 될 수있는 많은 패키지가 있습니다.

  • csurf 미들웨어는 CSRF (cross-site request forgery)로부터 보호합니다.
  • 오픈 소스 sqlmap 도구를 사용 하여 앱에서 SQL 주입 취약성을 감지합니다.
  • nmapsslyze 도구를 사용 하여 SSL 암호, 키 및 재협상 구성과 인증서의 유효성을 테스트합니다.
  • safe-regex 를 사용하여 정규식이 정규식 서비스 거부 공격에 취약하지 않도록합니다 .

보안 애플리케이션을 구축 할 때 우리가해야 할 가장 중요한 일 중 하나입니다. 이를 수행하지 못하면 명령 주입 , SQL 주입 또는 저장된 교차 사이트 스크립팅을 포함한 광범위한 공격이있을 수 있습니다 .

사용자 입력을 검증 할 수 있습니다 . 우리가 사용할 수있는 인기있는 라이브러리는 joi 입니다. Joi는 JavaScript 개체에 대한 개체 스키마 설명 언어 및 유효성 검사기입니다.

오류 처리

코딩 오류가 발생하면 x-Powered-By : Express와 같은 기본 인프라에 대한 민감한 세부 정보가 유출 될 수 있습니다.

스택 추적은 취약성으로 취급되지 않지만 종종 공격자가 관심을 가질 수있는 정보를 드러냅니다. 오류를 생성하는 작업의 결과로 디버깅 정보를 제공하는 것은 나쁜 습관으로 간주됩니다.

Unsplash

eval 문 사용 방지

Eval— 악의적 진술이라고도 함 — 런타임 동안 사용자 정의 JS 코드를 실행할 수 있습니다. 이는 성능 문제 일뿐만 아니라 사용자 입력에서 제공 될 수있는 악성 JavaScript 코드로 인한 중요한 보안 문제이기도합니다. 피해야 할 또 다른 언어 기능은 new Function생성자입니다. setTimeoutsetInterval중 동적 자바 스크립트 코드를 통과해서는 안됩니다.

정규 표현식 보안

정규식 서비스 거부 공격이라는 공격 벡터 가 있습니다. 대부분의 정규식 구현이 특수하게 조작 된 입력에 대해 극단적 인 상황에 도달하여 매우 느리게 작동 할 수 있다는 사실을 노출합니다.

Node.js는 본질적으로 단일 스레드라는 사실과 결합하여 단일 사용자 입력으로 전체 서버를 중단 할 수 있습니다. 이러한 일을 할 수있는 정규식을 일반적으로 Evil Regexes 라고 합니다. 이러한 표현에는 다음이 포함됩니다. 반복이있는 그룹화, 반복 된 그룹 내부 : 반복 또는 겹치는 교대

사악한 정규식의 예 : (a +) +, ([a-zA-Z] +) *, (a | aa) +

노드 보안 도구 및 프로젝트

npm-audit : 패키지에 대한 보안 감사 실행

npm-shrinkwrap :이 명령 package-lock.json은 게시 가능으로 용도 를 변경 npm-shrinkwrap.json하거나 단순히 새 것을 만듭니다. 이 명령으로 생성 및 업데이트 된 파일은 다른 기존 또는 향후 package-lock.json파일 보다 우선 합니다.

requiresafe : 취약성 확인

retire.js :이 패키지는 알려진 취약점이있는 모듈 버전의 사용을 감지하는 데 도움이됩니다. 간단히 npm install -g retire. 그 후 retire명령으로 실행하면 node_modules디렉토리 에서 취약점을 찾습니다 .

express-security :이 패키지는 Express 프레임 워크에 고유합니다. 연구원이 보안 버그를보고 할 수 있도록 응용 프로그램에 추가하려는 경우.

sqlmap : SQL 주입 결함을 탐지 및 악용하고 데이터베이스 서버를 인수하는 프로세스를 자동화하는 오픈 소스 침투 테스트 도구입니다.

snyk : Node Security Project와 비슷하지만 그 목적은 코드베이스에서 보안 관련 문제를 감지 할 수있을뿐만 아니라 수정할 수있는 도구를 제공하는 것입니다.

결론

우리가 모든 것을 다루지는 않았지만. 이 연구 기사가 Node.js 생태계의 보안이 작동하는 방식과 Node.js 애플리케이션을보다 안전하게 만들기 위해 수행 할 수있는 단계를 더 잘 이해하는 데 도움이 되었기를 바랍니다.

저에게 연락하고 싶다면 여기 내 트위터 핸들이 있습니다.

즐거운 코딩 되세요!

일반 영어로 된 JavaScript의 메모

세 개의 새로운 출판물이 출시되었습니다! 우리의 새 출판물을 팔로우하여 우리의 새로운 출판물에 대한 사랑을 보여주세요 : Plain English의 AI, Plain EnglishUX, Plain EnglishPython — 감사합니다. 계속해서 배우세요!

우리는 또한 항상 양질의 콘텐츠를 홍보하는 데 관심이 있습니다. 우리의 출판물에 제출하고 싶은 기사가있는 경우, 귀하의 Medium 사용자 이름과 함께 submissions@plainenglish.io 로 이메일을 보내 주시면 작가로 추가해 드리겠습니다. 또한 어떤 출판물에 추가하고 싶은지 알려주십시오.

참조 판독 값

Suggested posts

JavaScript 테스트의 기초

JavaScript 테스트의 기초

"잠깐만 요, JavaScript 테스팅에 대한 또 다른 기사"라고 생각할 수 있습니다. 예, JavaScript 테스트의 기본 사항에 대해 더 많이 이야기하고 싶은 이유는이 주제에 대한 많은 기사가 JavaScript 테스트를 작성하기위한 코드 스 니펫과 도구를 보여줌으로써 매우 유사한 방식으로 작성 되었기 때문입니다.

Big-O 렌즈를 통한 Javascript의 배열 및 객체 성능

Big-O 렌즈를 통한 Javascript의 배열 및 객체 성능

프로그램의 효율성은 요소의 검색, 정렬, 액세스, 삽입 및 제거와 같은 작업을 수행하기 위해 엄청난 양의 데이터를 처리 할 때 시간 복잡성에 직접적으로 의존합니다. 성능 향상의 필요성에 따라 객체와 배열을 선택적으로 사용할 수 있습니다.

Related posts

성능 최적화 된 A / B 테스트 솔루션

성능 최적화 된 A / B 테스트 솔루션

의제 : 소개 : TL;하지만 읽을 수 있습니다. A / B 테스트, CloudFront 및 Lamba @ edge에 대해 이미 알고있는 경우 AWS Lambda @ edge를 사용한 A / B 테스트로 직접 이동하십시오. A / B 테스트 란 무엇입니까? A / B 테스트는 웹 사이트의 두 가지 버전에 대한 사용자의 참여를 비교하는 데 초점을 맞춘 UX 연구 방법론입니다.

fp-ts (Typescript)에서 Option 및 둘 중 하나 사용

저는 함수형 프로그래밍을 좋아합니다. 몇 년 동안 실수를하거나 토끼 구멍을 뚫는 것으로부터 저를 몇 번 구해 주었기 때문입니다. 동일한 입력이 주어지면 출력이 항상 동일하다는 것을 알면 안심입니다.

Syncfusion Blazor 파일 업로드 구성 요소에서 이미지를 미리 보는 방법

Syncfusion Blazor 파일 업로드 구성 요소에서 이미지를 미리 보는 방법

Syncfusion Blazor 파일 업로드는 하나 이상의 파일, 이미지, 문서, 오디오, 비디오 및 기타 파일을 서버에 업로드하기위한 구성 요소입니다. 여러 파일 선택, 진행률 표시 줄, 자동 업로드, 끌어서 놓기, 폴더 (디렉터리) 업로드, 파일을 포함하는 다양한 기능을 갖춘 HTML5 업로드 구성 요소 (<input type =”file”>)의 확장 버전입니다. 검증 등.

6 React 개발자로서 후회

내가 일찍했으면하는 것

6 React 개발자로서 후회

React는 배울 수있는 훌륭한 도구입니다. 그것은 우리가 우리 자신의 방식으로 일을 할 수있게합니다.