2009-05-12 2 views
6

자바 보안 코딩이 중요한 이유를 이해하는 데 문제가 있습니다. 예를 들어 변수를 비공개로 선언하는 것이 중요한 이유는 무엇입니까? 클래스 외부에서 변수에 액세스하는 것이 불가능 해지 겠지만 클래스를 디 컴파일하여 값을 얻을 수는 있습니다. 마찬가지로, 클래스를 final로 정의하면이 클래스를 서브 클래스로 만들 수 없게됩니다. 클래스를 하위 클래스 화하면 보안에 위험 할 수 있습니까? 다시 필요한 경우 원래 클래스를 디 컴파일하여 원하는 악성 코드로 다시 구현할 수 있습니다. 응용 프로그램이 사용자에 의해 "신뢰"되면 문제가 발생합니까? 그러면 사람들은 어떻게 든이 신뢰를 남용 할 수 있습니까? 기본적으로 내가 찾고있는 것은 보안 코딩 지침을 준수해야하는 이유에 대한 좋은 예입니다.자바 보안 코딩이 중요한 이유는 무엇입니까?

답변

15

프로그래밍이 어렵습니다.

노출되지 않아야하는 변수 (예 : encapsulation)를 노출시키지 않는 엄격한 API를 정의하면 API 사용자를 도와 프로그래밍을 쉽게합니다. 이것은 좋은 것으로 간주됩니다.

이유는 기본적으로 "보안"이 아니며 비밀 내용을 비밀로 유지하는 것처럼 명확성, 단순성 및 이해 가능성이 있습니다.

보너스로, API 사용자가 등 뒤에서 변수를 변경하지 않는다는 것을 알게되면 올바르게 작동하는 것이 훨씬 쉽습니다.

+1

캡슐화가 안전성 측면에서 항상 설명되는 이유는 무엇입니까? 또한 캡슐화가 프로그래밍을 쉽게하는 이유는 무엇입니까? – JDelage

4

"안전하다"는 의미는 클래스 내부 작업이 누구에게나 사용된다는 것을 의미합니다.

"보안 서버"와 같이 보안이라는 용어는 한 클래스 사용자가 원하는 작업을 수행하는 방법에 대해 걱정할 필요가 없다는 의미로 사용됩니다.

귀하의 예를 촬영 : 예를 들어, 당신이 원하지 않는 무언가가, 그들의 실존의 수업 노하우의 사용자를 할 것 클래스의 변수를 노출

: 그냥 켜 버튼을 눌러 가볍다면, 작업을 수행하는 데 필요한 구리 나 그물이 내부에 필요하지 않습니다.

+0

흥미 롭습니다! 마지막으로이 문맥에서의 "보안"에 대한 좋은 설명. – Jackson

1

다른 사람들이 이미 말한 내용을 추가하기 만하면됩니다. 이러한 기능 중 일부는 단순히 의도 된 상태로 볼 수도 있습니다. 회원을 만들면 private 다른 사람들이 액세스 할 수 없다는 것을 "불가능"하게 만듭니다 (가능하지만 그 점은 여기에 있습니다).하지만 더 중요한 것은 구현 세부 사항이며 의존하지 말아야한다는 것입니다. .

3

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

첫 번째 변수는 보호 또는 비공개 변수로 선언 할 때 공개 API에 포함되지 않습니다. 다른 클래스는 나중에 클래스에 따라 달라질 수 있으며 새 기능을 포함 시키거나 성능을 향상시키려는 경우 가능한 한 많이 변경하는 것이 중요합니다. 모든 값이 내부 가치와 메커니즘은 공개됩니다. 그것들을 변경하면 당신에 의존하는 다른 클래스가 깨질 수 있습니다.

변수를 공개하면 다른 클래스가 값을 변경할 수 있습니다. 프로그램을 중단 할 수있는 경우 내부 값을 변경하고 이상한 예기치 않은 동작을 생성합니다. 클래스의 정확한 성능에 의존하는 시스템을 작성하고 내부 값이 변경되면 더 이상 해당 시스템에 의존 할 수 없습니다. 서브 클래 싱을 사용하면이 작업이 더욱 복잡해집니다. 시스템은 예상되는 조치를 수행하기 위해 특정 유형의 클래스에 의존 할 수 있습니다.서브 클래스 화를 통해 동일한 유형이지만 예상되는 동작을 수행하지 않는 새로운 클래스를 생성 할 수 있습니다.

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

"보안 코딩"의이 유형은 누군가가 귀하의 소스 코드를 보지 못하게하지 않지만 나중에 코드를보다 신뢰성 있고 유용하게 사용하는 데 도움이됩니다.

+0

보호 된 변수는 공용 API의 일부입니다. 개인용 또는 필요한 경우 일부 "개인용 패키지"기본 액세스 변수를 사용하십시오. –

4

Java는 object-oriented programming 언어이며, 객체 지향 프로그래밍의 핵심 개념 중 하나는 encapsulation입니다.

캡슐화의 배경은 객체의 상태를 유지하는 내부 변수와 알고리즘과 같은 내부 동작과 같은 구현 세부 사항을 "숨기고"다른 객체가 수행 할 수있는 인터페이스 만 제공하는 것입니다 객체와 함께 작동합니다.

이 개념을 사용하면 private 변수를 사용하여 내부 상태를 숨기고 다른 개체가 내부 상태에 직접 영향을 미치지 않도록 할 수 있습니다. Java에서는 객체 작업을 위해 getter 및 setter (예 : getColorsetColor)를 보는 것이 일반적입니다.

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

예를 들어, 내부 상태에 대한 액세스를 제한하면 개체가 변경되기 전에 몇 가지 온 전성 검사를 수행 할 수 있습니다. 예로서 고체

0100 percent 사이 값을 갖도록 선수 오브젝트 Score 거기 말한다. 지정된 값이 허용 범위 내에 있는지 확인하는 setPercent(int) 메서드를 제공하면 Score 개체가 허용되지 않는 상태로 설정되는 것을 방지 할 수 있습니다.

따라서 직접 score.percent = 150 같이 문을 작성하여 내부 상태를 조작하려고하면 setPercent 방법은 오류가 발생하거나 지정된 값이 허용되지 않는 경우를 발생 Exception 경우를 방지 할 수있다.

1

개체에 private (숨김)이 아닌 내부 속성이 있고이 속성에 액세스하는 코드가 멀티 스레딩 환경에서 실행되므로 N 개의 스레드가 동시에 액세스하기 시작합니다. 5 개의 스레드가이를 변경하려고합니다. 속성, 4 읽어야합니다. 상황이 깔끔하게 돌아가도록하는 방법은 없습니다. 어느 순간에도 스레드가 어느 데이터를 보유하고 있는지 알 수 없으며 해당 개체의 속성을 성공적으로 변경했습니다.

동기 액세스를 처리 할 책임이있는 특수 코드를 프로그래밍해야합니다. 그래도 프로그램에서 해당 속성에 액세스하는 나머지 680 클래스를 확인해야하므로 코드가 올바르게 작동 할 것이라는 보장은 없습니다 직접 액세스하십시오. 한마디로

, 당신은 큰 문제에, 디버깅 스레드가 한 데이터가 chagned 때 모르는 당신부터 악몽이다, 그의는 등 무슨 일이 생긴

그냥 하나 개의 시나리오에서 어떤 당신이 캡슐화하지 않으면 일어난다.

좋은 점은 코드가 1 % 빨라지고 스택에로드가 적어 시스템의 정기적 인 충돌과 성공적인 디버깅 가능성으로 인해 약간의 성능 향상을 얻을 수 있다는 것입니다.

1

"보안 코딩"이란 용어는 C, Java, Ruby, 어셈블리 언어 또는 그 밖의 다른 보안 취약성을 피하려고 분명하게 시도하는 소프트웨어를 의미합니다. 보안 언어 시스템을 선택한 후 아마도 가장 핵심적인 부분은 좋은 프로그래밍 실습을 유지하는 것입니다. 프로그램이 불분명하다면, 자신감을 가질 가치가 거의 없을 것입니다. 이 년 전 업데이트

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

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

보다 일반적으로 신뢰할 수없는 데이터 만 처리하는 프로그램을 다루는 경우가 많습니다. 예를 들어 웹 서버 (XSS 및 SQL 주입) 및 신뢰할 수없는 파일을 다루는 데스크톱 응용 프로그램 (일반적으로 문제는 C 코드가 버퍼 오버 플로우가 발생하여 C++이 더 우수함)입니다. 일부 상황에서는 서비스 거부 (DoS)가 심각한 문제가 될 수 있습니다.

일부 중복되어 있습니다. 예를 들어 인터프리터는 인터프리터 코드의 권한으로 실행되며 상당히 강력 할 수 있습니다.

관련 문제