문제

나는 zend 코드에서 PHP를 리팩토링하고 있으며 모든 코드는 다음과 같이 가득 차 있습니다. $_GET["this"] 그리고 $_POST["that"].나는 항상 더 많은 PHP를 사용했습니다 $this->_request->getPost('this') 그리고 $this->_request->getQuery('that') (이것은 getGet 대신 getquery를 사용하면 그리 논리적이지 않습니다.)

그래서 내 방법이 관리하기 더 안전한지/더 나은지/쉬운지 궁금합니다.Zend Framework 문서에서 요청 개체가 입력한 내용을 검증하지 않기 때문에 자신의 입력을 검증해야 한다는 내용을 읽었습니다.

그러면 두 가지 질문이 남습니다.

  • 이 둘 중 무엇이 가장 좋나요?(혹은 다른 더 좋은 방법이 있다면)
  • 이 방법으로 PHP 입력의 유효성을 검사하는 가장 좋은 방법은 무엇입니까?

감사해요!

도움이 되었습니까?

해결책

나는 보통 $ this-> _ request-> getParams ()를 사용합니다. 게시물 또는 URL 매개 변수를 검색합니다. 그런 다음 사용합니다 zend_filter_input 검증 및 필터링을 수행합니다. getParams ()는 유효성 검사를하지 않습니다.

zend_filter_input을 사용하면 Zend Validators를 사용하여 응용 프로그램 수준 유효성 검사를 수행 할 수 있습니다 (또는 직접 작성할 수 있음). 예를 들어, '달'필드가 숫자인지 확인할 수 있습니다.

$data = $this->_request->getParams();

$validators = array(
    'month'   => 'Digits',
);

$input = new Zend_Filter_Input($filters, $validators, $data);

다른 팁

브라이언의 대답을 확장합니다.

당신이 언급했듯이 당신은 또한 체크 아웃 할 수 있습니다 $this->_request->getPost() 그리고 $this->_request->getQuery(). 일반화하면 getParams(), 그것은 일종의 사용과 같습니다 $_REQUEST Superglobal과 나는 그것이 보안 측면에서 수용 될 수 있다고 생각하지 않습니다.

Zend_filter에 추가하여 간단한 PHP를 사용하여 필요한 것을 캐스팅 할 수도 있습니다.

예 :

$id = (int) $this->_request->getQuery('id');

다른 값의 경우 더 복잡해 지므로 DB 쿼리에 인용해야합니다 (Zend_db, 인용 식별자 참조, $db->quoteIdentifier()) 및 견해에서 $this->escape($var); 콘텐츠를 피하기 위해.

Get/Post 데이터에 대해 한 크기의 모든 유효성 검사 기능을 작성할 수 없습니다. 어떤 경우에는 필드가 정수가되어야하고 다른 경우에는 날짜가 필요합니다. 그렇기 때문에 Zend 프레임 워크에 입력 검증이없는 이유입니다.

필요한 곳에 검증 코드를 작성해야합니다. 물론 일부 도우미 방법을 쓸 수는 있지만 getPost ()가 그 자체로 자신을 위해 무언가를 검증 할 것으로 기대할 수는 없습니다 ...

그리고 GetPost/GetQuery의 장소조차도 아무것도 검증 할 수있는 곳이 아닙니다. 임무는 당신이 당신이 방해하지 않는 데이터를 얻는 것입니다.

$dataGet  = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();

if( isset($dataGet) && $valid->isValid($dataGet) ){
 // do some...
} else{
  // not set
}

나는 항상 더 많은 PHP를 사용했습니다 $this->_request->getPost('this') 그리고 $this->_request->getQuery('that') (이것은 getGet 대신 getquery를 사용하면 그리 논리적이지 않습니다.)

이 둘 중 무엇이 가장 좋나요?(혹은 다른 더 좋은 방법이 있다면)

선택에 대해 간단히 설명하자면 getQuery().표현 선택은 그것이 어떻게 거기에 도달했는지가 아니라 그것이 어떤 종류의 데이터인지에 따라 결정됩니다.GET 및 POST는 POST 요청의 경우 "포스트 데이터"로 알려진 섹션을 포함하여 모든 종류의 정보를 전달하는 요청 방법일 뿐입니다.GET 요청에는 그러한 블록이 없으며 전달되는 모든 변수 데이터는 URL의 쿼리 문자열(? 다음 부분)의 일부입니다.

그래서, 동안 getPost() POST 요청의 게시 데이터 섹션에서 데이터를 가져옵니다. getQuery() GET 또는 POST 요청(및 기타 HTTP 요청 메서드)의 쿼리 문자열에서 데이터를 검색합니다.

(DB 행 변경과 같이 부작용을 일으킬 수 있는 작업에는 GET 요청을 사용해서는 안 됩니다.)

따라서 첫 번째 질문에 대한 답변으로 다음을 사용하세요. getPost() 그리고 getQuery() 이 방법을 사용하면 데이터 소스가 어디에 있는지 확인할 수 있습니다(관심하지 않더라도 getParams() 작동하지만 추가 데이터가 포함될 수 있습니다).

이 방법으로 PHP 입력의 유효성을 검사하는 가장 좋은 방법은 무엇입니까?

입력을 검증하는 가장 좋은 장소는 첫 번째 그걸 써.즉, 끌어당기면 getParams(), getPost(), 또는 getQuery().이렇게 하면 필요한 곳에서 데이터가 항상 정확하며, 전달해도 안전하다는 것을 알 수 있습니다.다른 컨트롤러(또는 컨트롤러 작업)에 전달하는 경우 안전을 위해 그곳에서 다시 확인해야 한다는 점을 명심하세요.이를 수행하는 방법은 애플리케이션에 따라 다르지만 여전히 확인이 필요합니다.

주제와 직접 관련이 없지만 입력에 숫자를 얻을 수 있도록 $ var+0을 사용할 수도 있습니다 (그러나 $ var가 플로트 인 경우 플로트를 유지합니다) 대부분의 경우 $ id = $에 사용할 수 있습니다. this-> _ request-> getQuery ( 'id')+0;

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