체인의정석

eslint plugin security 모듈 본문

개발/backend

eslint plugin security 모듈

체인의정석 2021. 8. 30. 18:55
728x90
반응형

https://www.npmjs.com/package/eslint-plugin-security

 

eslint-plugin-security

Security rules for eslint

www.npmjs.com

eslint plugin security 사용 , 보안성을 향상시켜주는 모듈

 

사용방법은 위의 링크에 제시된 대로 

 

.eslintrc 파일에 extends와 plugins를 추가시켜주니 작동이 되었다.

 

npm run build를 실행하고 나니 새로운 problem이 생겼다.

 

Generic Object Injection Sinkeslint(security/detect-object-injection)

https://stackoverflow.com/questions/51715616/how-to-fix-codacy-alert-generic-object-injection-sink

 

how to fix codacy alert "Generic Object Injection Sink"

Below is my code. I don't think there is any problem. How can I fool codacy? If I can't use obj[key], then what the hell is this thing? There is no way I can avoid []. handleClick = (e, titlePro...

stackoverflow.com

이 에러는 인덱스의 키값에 대한 보안 문제에 해당되는데 아래와 같은 예시에서 많이 발생한다.

 

https://stackoverflow.com/questions/44882542/why-is-it-bad-pratice-calling-an-array-index-with-a-variable/44882765#44882765

 

Why is it bad pratice calling an array index with a variable?

I'm currently developing a little game in Javascript and I'm using Codacy to review my code and help me cleaning it. One of the most seen error is Generic Object Injection Sink (security/detect-obj...

stackoverflow.com

아래와 같이 value를 바로 넣어버리게 되면,  object에 다른 값이 들어간 생태로 value 값으로 들어갈 수 있다.

 

const property = "constructor";
const object = [];
const value = object[property];

Object의 프로토타입 중 일부인 Array() 함수는 원래의 Object.Prototype 값을 가지고 있기 때문에 배열에 인덱스로 값을 그대로 넣어버리면 디폴트 값으로 있는 Object.Prototype오버라이딩 시켜서 잠재적인 문제를 일으 킬 수 있다. 따라서 아래와 같이 수정해야 한다.

const property = "constructor";
const object = [];
if (object.hasOwnProperty(property)) {
    const value = object[property];
}

이렇게 디폴트 값이 있는지 확인을 한 후에 값을 넣어주게 되면, 문제가 해결되게 된다.

 

https://eslint.org/docs/rules/no-prototype-builtins

 

no-prototype-builtins - Rules

 

eslint.org

하지만 다른 린트와 충돌하여 에러가 났다.

 

더 찾아본 결과 인덱스 값에 숫자형일 때는 숫자형을 명시해주고 문자열일 때는 문자열임을 체크해주어도 해당 에러가 해결된다고 한다.

따라서 문자열 키값을 다음과 같이 변경하여 해결하였다.

배열이름[`${key}`] = String(배열이름[`${key}`]);

문제가 해결되니 린트에서 problem이 해결된걸 볼 수 있었다.

 

이런 문제들은 린터가 없엇다면 생각하기 어려운 점이였을텐데 보안에 신경쓸때는 해당 린트를 쓰는것도 좋은것 같다.

728x90
반응형
Comments