문제

Java 보안 코딩이 중요한 이유를 이해하는 데 문제가 있습니다.예를 들어 변수를 비공개로 선언하는 것이 왜 중요한가요?내 말은 클래스 외부에서 해당 변수에 액세스하는 것이 불가능하다는 것을 알지만 간단히 클래스를 디컴파일하여 값을 얻을 수 있다는 뜻입니다.마찬가지로 클래스를 final로 정의하면 이 클래스를 하위 클래스로 분류하는 것이 불가능해집니다.클래스를 서브클래싱하는 것이 보안에 위험한 경우는 언제입니까?필요한 경우 다시 원본 클래스를 디컴파일하고 원하는 악성 코드로 다시 구현할 수 있습니다.사용자가 애플리케이션을 "신뢰"할 때 문제가 발생합니까?그렇다면 사람들은 어떻게든 이 신뢰를 남용할 수 있을까요?기본적으로 제가 찾고 있는 것은 왜 보안 코딩 지침을 따라야 하는지에 대한 좋은 예입니다.

도움이 되었습니까?

해결책

프로그래밍은 어렵다.

노출되어서는 안되는 변수를 노출하지 않는 엄격한 API를 정의하는 경우(우리는 이것을 호출하고 싶습니다) 캡슐화), API 사용자를 돕고 프로그래밍을 더 쉽게 만듭니다.이것은 좋은 것으로 간주됩니다.

그 이유는 주로 비밀을 비밀로 유지하는 "보안"보다는 명확성, 단순성 및 이해 가능성 때문입니다.

보너스로, 물론 API 사용자가 뒤에서 "귀하의" 변수를 변경하지 않는다는 것을 알 수 있다면 작업을 올바르게 작동시키는 것이 훨씬 더 쉽습니다.

다른 팁

"안전한"것은 클래스 내부 작업이 그것을 사용하는 사람에게 숨겨져 있음을 의미합니다.

보안이라는 용어는 "서버 보안"에서 사용되지 않습니다. 한 클래스의 사용자가 클래스가 원하는 작업을 수행하는 방법에 대해 걱정할 필요가 없다는 사실을 의도하는 데 사용됩니다.

예시 :

클래스의 변수를 노출하면 클래스 사용자에게 자신의 존재에 대해 알리는 것입니다. 예를 들어, 당신이 원하지 않는 것입니다. 예를 들어 : 당신은 단추를 눌러 빛을 켜면 지금 내부에있을 필요가 없습니다. 구리 또는 작업을 수행하는 데 필요한 것입니다.

Java는 an입니다 객체 지향 프로그래밍 Langauge 및 객체 지향 프로그래밍의 주요 개념 중 하나는 다음과 같습니다. 캡슐화.

캡슐화의 배후 아이디어는 객체의 상태를 유지하는 내부 변수 및 알고리즘과 같은 내부 작업을 "숨기기"하는 것입니다. .

그 개념을 사용하여 사용하여 내부 상태를 숨기고 싶습니다. private 다른 객체가 내부 상태에 직접 영향을 미치는 것을 방지하기위한 변수. Java에서는 게터와 세터를 보는 것이 일반적입니다 (예 : getColor 그리고 setColor) 객체로 작업하기 위해.

또한 캡슐화는 코드의 견고성도 증가 할 수 있습니다.

예를 들어, 내부 상태에 대한 액세스를 제한함으로써 객체가 변경되기 전에 일부 정신 검사를 수행 할 수 있습니다.

확실한 예로서, a가 있다고 말합니다 Score a percent 사이의 가치 0 그리고 100. a setPercent(int) 지정된 값이 허용 범위 내에 있는지 확인하는 방법은 Score 용납 할 수없는 상태로 설정되는 대상.

따라서 다음과 같은 진술을 작성하여 내부 상태를 직접 조작하려고합니다. score.percent = 150 경우를 예방할 수 있습니다 setPercent 메소드는 오류를 유발하거나 an을 던집니다 Exception 지정된 값이 용납 할 수없는 경우.

여기에는 두 가지 문제가 있습니다.

변수를 보호 또는 개인으로 선언 할 때 첫 번째는 공개 API의 일부가되지 않습니다. 다른 클래스는 향후 수업에 따라 다를 수 있으며 새로운 기능을 포함시키고 성능 향상 등을 원하는 경우 가능한 한 자유롭게 변경할 수 있어야합니다. 모든 값이 모든 내부보다 공개되는 경우 가치와 메커니즘은 공개적입니다. 그것들을 바꾸면 당신의 다른 수업을 깨뜨릴 수 있습니다.

두 번째는 변수를 노출 할 때 다른 클래스가 값을 변경할 수 있다는 것입니다. 프로그램이 프로그램을 중단하고 이상한 예기치 않은 동작을 만들 수있는 경우 내부 값을 변경하는 경우. 클래스의 정확한 성능에 의존하는 시스템을 만들고 내부 값이 더 이상 해당 시스템에 의존 할 수없는 것보다 변경되는 시스템을 작성하는 경우. 서브 클래싱은 이것을 더 복잡하게 만듭니다. 시스템은 예상 작업을 수행하기 위해 특정 유형의 클래스에 의존 할 수 있습니다. 서브 클래싱을 통해 동일한 유형 인 것처럼 보이지만 예상 조치를 수행하지 않는 새 클래스를 만들 수 있습니다.

예를 들어, 보호 된 기능 getArea ()가있는 클래스 사각형이있는 경우 사각형 영역을 반환해야합니다. 그러나 정사각형을 확장하는 새로운 클래스를 만들 수 있으며, 클래스 사각형은 정사각형을 확장합니다. 이제 rectange는 getArea ()를 무시할 수 있지만 여전히 유형 사각형이므로 사각형의 기능에 의존하는 것을 깨뜨릴 수 있습니다. 수업을 최종적으로 만들면 시스템에서는 결코 발생할 수 없다고 주장합니다.

이러한 유형의 "보안 코딩"은 누군가가 귀하의 소스 코드를 보지 못하게하지는 않지만 향후 코드를보다 신뢰할 수 있고 사용할 수 있도록하는 데 도움이됩니다.

다른 사람들이 이미 말한 내용에 추가하기 위해 : 이러한 기능 중 일부는 단순히 상태의 의도로 간주 될 수 있습니다. 내가 회원을 만들면 private 나는 다른 사람들이 액세스 할 수있는 "불가능한"것을 만들어냅니다 (가능하지만 여기에 요점 외에도), 더 중요한 것은 사용자에게 이것이 구현 세부 사항이라고 말하고 의존해서는 안된다는 것을 말합니다.

객체가 비공개 (숨겨진) 내부 속성이 있고이 속성에 액세스하는 코드가 멀티 스레딩 환경에서 실행되는 경우 N 스레드가 동시에 액세스하기 시작하면 5 개의 스레드 가이 속성을 변경하려고합니다. 읽다. 당신이 물건을 깔끔하게 실행할 수있는 방법은 없으며, 스레드는 순간에 어떤 데이터를 보유하고 있는지 알지 못하고 해당 객체의 속성을 성공적으로 변경하지 않았습니다.

동기식 액세스를 처리 할 책임이있는 특수 코드를 프로그래밍해야하며 여전히 보장되지 않으면 코드가 제대로 작동하지 않아도됩니다. .

요컨대, 당신은 큰 문제가 있고, 디버깅은 데이터가 언제 쫓겨 났는지 알지 못하기 때문에 악몽입니다.

캡슐화하지 않으면 무슨 일이 일어나고 있는지에 대한 한 가지 시나리오 만 ...

좋은 점은 코드가 1% 더 빠르게 실행되며 스택에 부하가 적으며, 시스템의 정기적 인 충돌과 성공적인 디버깅에 대한 사소한 기회로 지불 할 성능 이점을 달성했을 것입니다.

"보안 코딩"이라는 용어는 C, Java, Ruby, Assembly Language 또는 기타 어떤 것도 보안 취약점을 피하려는 소프트웨어 구성을 말합니다. 아마도 안전한 언어 시스템을 선택한 후에 가장 중심적인 부분은 훌륭한 프로그래밍 관행을 유지하는 것입니다. 프로그램이 불분명하다면, 당신은 자신감에 가치가있을 가능성이 거의 없습니다.

Java의 경우 두 가지 주목할만한 가이드가 있습니다.

Java에는 두 가지 보안 코딩 모드가 있습니다.

하나는 코드가하는 모든 권한이없는 코드를 다루고 있습니다. 예를 들어 라이브러리를 작성하거나 서명 코드를 작성하는 경우이 작업을 수행해야합니다. 악의적 인 코드가 의도하지 않은 방식으로 권한을 활용하는 것은 불가능해야합니다. 이것은 어렵다!

더 일반적으로 신뢰할 수없는 데이터 만 다루는 프로그램을 다루고 있습니다. 예를 들어, 웹 서버 (XSS 및 SQL 주입 생각) 및 신뢰할 수없는 파일을 다루는 데스크탑 응용 프로그램 프로그램 (일반적으로 문제는 버퍼 오버플로가있는 C 코드의 문제입니다. 진정한 C ++는 더 좋습니다). 일부 상황에서는 서비스 거부 (DOS)가 심각한 문제가 될 수 있습니다.

겹침이 있습니다. 예를 들어 통역사는 통역사 코드의 권한으로 실행되며 상당히 "강력한"일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top