API는 호출자와 피호출자 간의 계약입니다. 가장 흔한 형태의 API 오용은 호출자가 이 계약에서 자신의 몫을 이행하지 못하기 때문에 발생합니다. 예를 들어, 프로그램이 chroot()를 호출한 후 chdir()을 호출하지 못하면 활성 루트 디렉터리를 안전하게 변경하는 방법을 지정하는 계약을 위반하는 것입니다. 라이브러리 오용의 또 다른 좋은 예는 피호출자가 호출자에게 신뢰할 만한 DNS 정보를 반환할 것으로 예상하는 것입니다. 이 경우, 호출자는 자신의 행동에 대해 특정한 가정을 함으로써(반환 값이 인증 목적으로 사용될 것으로 예상) 피호출자 API를 오용합니다. 다른 쪽에서 호출자-피호출자 계약을 위반할 수도 있습니다. 예를 들어, 코더가 하위 클래스 SecureRandom을 지정하고 임의 값이 아닌 값을 반환하는 경우 계약을 위반하는 것입니다.
null
을 비교해야 하는 약정을 위반합니다.null
인 경우 Object.equals()
, Comparable.compareTo()
및 Comparator.compare()
의 구현은 지정된 값을 반환해야 합니다. 이 약정을 따르지 않으면 예기치 못한 동작이 발생할 수 있습니다.equals()
메서드의 구현은 해당 매개 변수와 null
을 비교하지 않습니다.
public boolean equals(Object object)
{
return (toString().equals(object.toString()));
}
clone()
메서드는 super.clone()
을 호출하여 새 개체를 얻어야 합니다.clone()
구현은 super.clone()
을 호출하여 새 개체를 얻어야 합니다. 클래스가 이 규칙을 지키지 않으면 하위 클래스의 clone()
메서드가 잘못된 형식의 개체를 반환합니다.super.clone()
을 호출하지 않아서 발생하는 버그를 보여 줍니다. Kibitzer
가 clone()
을 구현하는 방법으로 인해 FancyKibitzer
의 clone 메서드는 FancyKibitzer
대신 Kibitzer
유형의 개체를 반환합니다.
public class Kibitzer implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = new Kibitzer();
...
}
}
public class FancyKibitzer extends Kibitzer
implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = super.clone();
...
}
}
Equals()
와 GetHashCode()
중 하나만 정의합니다.a.Equals(b) == true
이면 a.GetHashCode() == b.GetHashCode()
이어야 합니다. Equals()
를 오버라이드하지만 GetHashCode()
는 오버라이드하지 않습니다.
public class Halfway() {
public override boolean Equals(object obj) {
...
}
}
equals()
와 hashCode()
중 하나만 정의합니다.a.equals(b) == true
이면 a.hashCode() == b.hashCode()
이어야 합니다. equals()
를 오버라이드하지만 hashCode()
는 오버라이드하지 않습니다.
public class halfway() {
public boolean equals(Object obj) {
...
}
}
saveState()
와 restoreState()
중 하나만 정의합니다.saveState(javax.faces.context.FacesContext)
및 restoreState(javax.faces.context.FacesContext, java.lang.Object)
를 구현하거나 둘 다 구현하지 않아야 합니다. 이 두 가지 메서드는 밀접한 관계가 있으므로 상속 계층의 서로 다른 수준에 saveState(javax.faces.context.FacesContext)
및 restoreState(javax.faces.context.FacesContext, java.lang.Object)
메서드를 두는 것은 허용되지 않습니다.saveState()
를 정의해도 restoreState()
는 정의하지 않으므로 해당 클래스를 확장하는 클래스의 모든 작업에서 항상
public class KibitzState implements StateHolder {
public Object saveState(FacesContext fc) {
...
}
}
checkCallingOrSelfPermission()
또는 checkCallingOrSelfUriPermission()
함수는 호출 프로그램이 특정 서비스 또는 지정된 URI에 액세스하는 데 필요한 권한이 있는지 확인합니다. 그러나 이러한 함수는 해당 응용 프로그램 권한을 가정하여 적절한 권한이 없는 악성 응용 프로그램에 액세스 권한을 부여할 수 있으므로 조심해서 사용해야 합니다.Assert()
를 사용하면 현재 제어 흐름에 지정된 권한이 있다고 말할 수 있습니다. 이로 인해 필요한 권한이 충족되면 .NET Framework가 더 이상의 권한 검사를 수행하지 않습니다. 즉, Assert()
를 호출하는 코드를 호출하는 코드가 필요한 권한을 갖지 않을 수 있습니다. 일부 경우에는 Assert()
를 사용하는 것이 도움이 되지만 악의적인 사용자가 달리 권한이 없는 리소스를 제어할 수 있도록 허용할 때 취약점이 발생할 수 있습니다.