2010-05-17 6 views
8

일반적으로, 모든 제정신 개발자 (살균 등 적절한 유형으로 캐스팅 검증)개인/보호 된 방법의 입력 보안?

내 질문은 모든 public 메소드의 입력을 확보하기 위해 노력하고있다 : 또한 보호/개인 메소드에 전달 된 매개 변수의 유효성 검사 코드에서 지내 ? 필자가 공용 메서드의 매개 변수를 적절하게 보안하고 외부 (다른 클래스, db, 사용자 입력 등 ...)에서 값을 반환하는 경우 필자의 의견으로는 필요하지 않습니다.

하지만 메소드 바디에서 메소드 호출과 검증 된 값의 반환을 위해 검증이 반복되는 프레임 워크와 애플 리케이션 (예 : prestashop)에 계속 직면하고 있습니다. 나쁜 디자인의 표시이기도합니다.

+0

정규 표현식을 사용하지 않는 한 유효성 검사에서 많은 성능 오버 헤드가 발생하지 않습니다. – Andy

+0

나는 아주 나쁜 검증을 보았다. 앞서 언급 한 prestashop에서는 테이블/열 이름의 유효성을 검사하기 위해 regexp를 사용하는 ORT에서 메소드 isTableOrIdentifier를 가지며 실제로 한 객체의 내부에서 수십 번 호출됩니다 (지금은 수백 또는 수천 개의 객체를 가져 오는 것으로 상상합니다) –

+0

적절한 작업을 수행하는 경우 단위 테스트의 수준, 그리고 일부 개인 회원의 일부 유효성 검사를 건너 뛰는 것은 괜찮을 것입니다. 항상 위험이 있습니다. 또는 검토 자; 코드를 살펴보면 호출하는 공용 멤버가 수행 한 작업에 따라 다운 스트림 가정이 항상 정확하다는 것을 알 수 있습니다. – JoeGeeky

답변

2

공개 API가 나쁜 매개 변수로부터 스스로를 보호하는 구현을 가져야한다는 견해를 따르는 경우 기준은 메소드의 가시성이 아니어야하며 API 사용자가 직접 해당 메소드를 호출 할 것인지 (또는 검증을 연기하는 다른 것을 통해 간접적으로 호출). 한다고 방법

예는 유효성 검사를 수행하는 :

class A { 
    protected final function myMethodDefaultImplementation(...) { 
     /* subclasses can just call this method in their myMethod implementations */ 
     /* should do validation */ 
     ... 
    } 
    protected abstract myMethod(...); 

    public function orderByDate() { 
     return $this->orderBy(ORDER_BY_DATE) 
    } 

    private function orderBy($crit) { 
     /* should do validation */ 
     ... 
    } 
} 
0

정확히 - 앱을 잘 디자인하면 꼭 필요한 것은 아닙니다.

3

protected의 경우 나중에 메서드를 재정의하거나 다른 클래스에서 호출 할 수 있으므로 메소드의 유효 입력을 가정 할 수 없으므로 유효성을 검사해야한다고 생각합니다. 다른 응용 프로그램에서 사용할 구성 요소 인 경우 특히 그렇습니다.

비공개의 경우 개인 메서드를 호출하기 전에 데이터의 유효성을 검사 할 수 있도록 메서드에 전달되는 내용을 제어 할 수 있으므로 낭비라고 생각합니다.

-1

만 가능한 마지막 기회에서 입력을 살균. OO 의미론 (OO semantics)이이를 어떻게 다른지 보지 않습니다.

예를 들어

매개 변수가있는 쿼리 나 나는 순간 :)에서 생각할 수있는 예를 ONY ORM을 (사용할 수 없습니다 어떤 이유로 경우,이 같은 기능을 쓸 것 :

function getname($id) { 
    $id = intval($id); 
    mysql_query("SELECT * FROM users WHERE id = $id"); 
    ... 
} 

이제 모든 코드에서이 함수를 호출하여 예기치 않은 결과가 발생할 수 있습니다.

+0

왜 downvote? 이것이 완료된 방법입니다. SQL을 삽입 할 수있는 API를 작성하는 것은 의미가 없습니다. 말할 것도없이 ** 정확히 ** 수용된 솔루션과 동일합니다. –

0

나는 어떤 유형의 메소드 (public, private, protected)가 중요하지 않다면 visibility 키워드를 보지 않고도 필요할 때마다 적절한 예방 조치를 취한다고 말할 수 있습니다.