$ _REQUEST, $ _GET 및 $ _POST 중 가장 빠른 것은?


177

이 코드들 중 어느 것이 더 빠를까요?

$temp = $_REQUEST['s'];

또는

if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

6
세 번째 경우가 있습니다. !isset($_REQUEST['s']).
Franz

5
다른 사람들이 귀하의 코드를 명확하게 이해하는 것이 얼마나 중요합니까? POST와 GET은 명시 적이지만 REQUEST는 다양한 소스에서 올 수 있습니다. REQUEST, POST 및 GET superglobals가 각 요청마다 항상로드되므로 효율성이 무시할 만하다고 생각합니다.
Kevin

답변:


273

$_REQUEST기본적으로 $_GET, $_POST및 의 내용을 포함합니다 $_COOKIE.

그러나 이것은 기본값 일 뿐이며 variables_order; 쿠키로 작업하고 싶지는 않습니다.

내가 선택해야한다면, 나는 아마 사용하지 것이다 $_REQUEST, 나는 선택할 것 $_GET또는 $_POST- 내 응용 프로그램이 무엇을해야하는지에 따라 (즉, 둘 중 하나만) : 일반적으로 말하기를 :

  • $_GET누군가 애플리케이션 에서 데이터 요청할 때 사용해야 합니다.
  • 또한 $_POST누군가 데이터 응용 프로그램으로 푸시 (삽입 또는 업데이트 또는 삭제) 할 때 사용해야 합니다.

어느 쪽이든, 성능에 큰 차이는 없습니다 : 다른 스크립트와 비교할 때 그 차이는 무시할 수 있습니다.


1
이상적으로는 항상 $ _REQUEST를 사용할 수 있어야합니다. 그러나 물론 그것은 완벽한 세상 일뿐입니다.
Tyler Carter

2
$ _REQUEST는 $ _POST 및 $ _GET을 직접 사용하는 것보다 비싸거나 적어도 비용이 많이 듭니다.
Darrell Brogdon

3
성능 차이가 무시할 만하고 유지 보수 관점이 더 중요하다는 개념에 대해 +1 : $ _GET 및 $ _POST는 $ _REQUEST가 할 수없는 방식으로 의미를 전달합니다.
Jon Cram

9
$ _REQUEST를 사용해도 XSS / XSRF가 발생하지 않습니다. XSS / XSRF의 뉘앙스를 이해하지 못하면 XSS / XSRF가 발생합니다. 토큰으로 완화하는 한 아무런 문제가 없으며 $ _REQUEST를 사용하면 이점이 있습니다 (모든 변수는 하나의 수퍼 전역에 있습니다). 실제로 'variables_order'로 인해 다른 슈퍼 글로벌을 기반으로 사용하기 전에 $ _REQUEST를 다시 작성합니다. $ _COOKIE, $ _GET, $ _POST를 처리합니다. 이렇게하면 POST vars의 우선 순위가 가장 높고 쿠키 vars가 가장 낮아져 많은 버그 (예 : Adobe Flash 및 magic quotes)를 암시 적으로 수정할 수 있습니다.
CubicleSoft

그것의 이름으로, Get = get from, Post = post to
Grumpy

32

GET vs. POST

1) GET과 POST는 배열을 만듭니다 (예 : array (key => value, key2 => value2, key3 => value3, ...)). 이 배열에는 키 / 값 쌍이 있습니다. 여기서 키는 양식 컨트롤의 이름이고 값은 사용자의 입력 데이터입니다.

2) GET과 POST는 모두 $ _GET과 $ _POST로 취급됩니다. 이들은 초 전역이므로 범위에 관계없이 항상 액세스 할 수 있습니다. 따라서 특별한 작업을 수행하지 않고도 모든 함수, 클래스 또는 파일에서 액세스 할 수 있습니다.

3) $ _GET은 URL 매개 변수를 통해 현재 스크립트에 전달 된 변수의 배열입니다.

4) $ _POST는 HTTP POST 메소드를 통해 현재 스크립트에 전달 된 변수의 배열입니다.

GET을 언제 사용해야합니까?

GET 메소드를 사용하여 양식에서 전송 된 정보는 모든 사람이 볼 수 있습니다 (모든 변수 이름 및 값이 URL에 표시됨). GET은 전송할 정보의 양에 제한이 있습니다. 제한은 약 2000 자입니다. 그러나 변수가 URL에 표시되므로 페이지를 책갈피에 추가 할 수 있습니다. 경우에 따라 유용 할 수 있습니다.

민감하지 않은 데이터를 전송하는 데 GET을 사용할 수 있습니다.

참고 : GET을 사용하여 비밀번호 나 기타 중요한 정보를 보내지 마십시오!

POST를 언제 사용해야합니까?

POST 메소드를 사용하여 양식에서 전송 된 정보는 다른 사람이 볼 수 없으며 (모든 이름 / 값은 HTTP 요청의 본문에 포함됨) 전송할 정보의 양에는 제한이 없습니다.

또한 POST는 파일을 서버에 업로드하는 동안 멀티 파트 이진 입력 지원과 같은 고급 기능을 지원합니다.

그러나 변수는 URL에 표시되지 않으므로 페이지를 책갈피에 추가 할 수 없습니다.


6
REQUEST에 대해서도 추가해주세요.
Black Mamba

$ _REQUEST는 어떻습니까?
Aamir Kalimi

22

$ _GET은 검색어 또는 URL에서 변수를 검색합니다.>

$ _POST는 (일반적으로) 형식과 같은 POST 메소드에서 변수를 검색합니다.

$ _REQUEST는 $ _GET과 $ _POST의 병합입니다. 여기서 $ _POST는 $ _GET보다 우선합니다. 유효성 검사를 위해 자체 굴절 양식에 $ _REQUEST를 사용하는 것이 좋습니다.


3
+1 이것은 기본적으로 내가 가르친 것입니다. 다른 답변만큼 기술적이지는 않지만 GET쿼리 문자열, POST양식 제출 에서 훨씬 쉽게 기억할 수 있습니다.
jp2code

18

나는 사용을 제안 $_POST하고$_GET 명시 적으로.

어쨌든 적절한 사이트 디자인으로 $ _REQUEST를 사용하는 것은 불필요하며 더 쉽게 열 수 있도록하는 것과 같은 단점이 있습니다. CSRF/XSS , URL에 데이터를 저장함으로써 발생 공격 및 기타 사소한 이 있습니다.

속도 차이는 어느 쪽이든 최소화해야합니다.


8

요청을 사용하십시오. 아무도 그렇게 간단한 작업의 속도에 신경 쓰지 않으며 코드가 훨씬 깨끗합니다.


7
좋은 대답은 많은 상황에서 GET 또는 POST 중 하나를 사용하는 대신 상황을 기반으로 선택해야한다는 경고가 있습니다.
ceejayoz

3
아무도 신경 쓰지 않는 것이 맞지만 내 의견으로는 사용하는 $_REQUEST것이 잘못된 결론입니다. 내 대답을 참조하십시오.
Franz

4
왜 $ _REQUEST를 사용하는 것이 $ _GET 또는 $ _POST보다 더 깨끗합니까? $ _REQUEST는 장면 뒤에서 동일한 논리를 수행하며 GET 또는 POST를 선택하면 더 많은 제어가 가능합니다.
Jay Zeng

6
_REQUEST가 더 위생적인 ​​요구 사항이라고 주장합니다.

2
사용자가 URL을 복사하고 동일한 작업을 수행 할 수있게하려면 GET을 사용하는 것이 좋습니다 (예 : URL은 'google.com/q=searchWord'와 같이 표시되지만 POST는 웹 사이트에 데이터를 게시하는 데 사용해야 함) 한 번만 삽입하거나 많은 데이터가 활성화되어 사용자가 데이터베이스에 데이터를 삽입하거나 로그인하는 등 URL을 유지할 수 없어야합니다.
Dean Meehan

7

걱정마 이 보안 문제 때문에 그러나 당신은 여전히, 두 번째 솔루션 (플러스 기존의 해당 변수의 없음에 대한 추가 검사)를 사용한다 $_REQUEST(이후이 $_GET$_POST그 배열의 유일한 소스되지 않습니다).

$_REQUEST어제 문제에 대한 게시물이 있다고 생각합니다. 찾아 보도록하겠습니다.

편집 : 아 글쎄, 직접 게시물은 아니지만 어쨌든 여기 있습니다 : http://kuza55.blogspot.com/2006/03/request-variable-fixation.html


6
if (isset($_GET['s'])) {
  $temp = $_GET['s'];
}
else {
  $temp = $_POST['s'];
}

더 안전하고 눈에 띄는 속도 차이를 만들지 않기 때문에 사용하십시오


전혀 나쁜 해결책은 아닙니다. 그것은 관련된 보안 결함을 처리 $_REQUEST하지만 여전히 동일한 스크립트에 액세스 할 수 있습니다 (내 경우에는 동일한 스크립트가 다른 '조치'와 함께 사용되며 때로는 $ _GET이 괜찮을 수도 있지만 다른 경우에는 $가 필요합니다. _POST는 데이터를 숨기거나 보호합니다).
Xandor

4

해커가 $ _POST 또는 $ _GET 값을 무시하는 쿠키를 설정할 수 있기 때문에 특정 보안 문제가 있습니다. 민감한 데이터를 처리하는 경우 $ _REQUEST를 사용하지 않는 것이 좋습니다. – 잔 도르

당신은 $_GET대신 사용할 수 없습니다$_POST어떤 경우에는 .

언제 ??

  • 파일을 업로드 할 때
  • URL에 데이터를 표시하지 않을 때.

GET전송할 정보의 양에도 제한이 있습니다. 제한은 약 2000 자입니다.

다른 것은 당신이 사용하여 데이터를 검색 할 수없는 경우가 거의 없습니다 $_POST

언제 ?

  • 데이터가 URL로 전달 될 때

휴식 서비스

`GET` - Provides a read only access to a resource.

`PUT` - Used to create a new resource.

사용할 잘못이 없습니다 $_REQUEST.

그러나이를 수행하는 방법은 $ _SERVER [ 'REQUEST_METHOD']를 명시 적으로 확인하는 것입니다. GET에는 비어있는 $ _POST에 의존하지 않습니다.


1
$_SERVER['REQUEST_METHOD']스크립트 를 사용 하여 스크립트를 호출하는지 확인 하는 데 유용한 조언 그러나 아무 문제가 없다고 말하는 것은 $_REQUEST100 % 사실이 아닙니다. 해커가 $ _POST 또는 $ _GET 값을 재정의하는 쿠키를 설정할 수 있기 때문에 특정 보안 문제가 있습니다. 민감한 데이터를 처리하는 경우을 사용하지 않는 것이 좋습니다 $_REQUEST.
Xandor

답변에 감사의 말을 전합니다
Parth Chavda

3

$ _GET은 검색어 또는 URL에서 변수를 검색합니다.>

$ _POST는 (일반적으로) 형식과 같은 POST 메소드에서 변수를 검색합니다.

$ _REQUEST는 $ _GET과 $ _POST의 병합입니다. 여기서 $ _POST는 $ _GET보다 우선합니다. 유효성 검사를 위해 자체 굴절 양식에 $ _REQUEST를 사용하는 것이 좋습니다.


2
재정의는 request_order쿠키 값 에 의존 하고 쿠키 값을 포함 할 수 있으므로 매우 신뢰할 수 없거나 유용한 기능이 아닙니다.
Ja͢ck

1

더 명백한 두 번째 방법을 사용합니다. 그렇지 않으면 변수가 어디에서 오는지 알 수 없습니다.

어쨌든 GET과 POST를 모두 확인해야하는 이유는 무엇입니까? 분명히 하나 또는 다른 것을 사용하는 것이 더 의미가 있습니다.


1
이전에 GET한 항목 (예 : 항목 이동)과 POST여러 항목 ( 확인란이있는 양식 )에만 사용되는 것으로 확인했습니다 .
Franz

1

_GET 또는 _POST 만 사용합니다. 나는 통제하는 것을 선호합니다.

OP의 코드 조각 중 하나가 마음에 들지 않는 것은 HTTP 메소드가 사용 된 정보를 버리는 것입니다. 그리고 그 정보는 입력 소독에 중요합니다.

예를 들어, 스크립트가 DB에 입력 될 양식의 데이터를 승인하면 양식이 POST를 더 잘 사용 하는 것입니다 (등시성 작업에만 GET 사용). ). 그러나 스크립트가 GET 메소드를 통해 입력 데이터를 수신하면 (일반적으로) 거부해야합니다. 나를 위해, 그러한 상황은 누군가가 무언가를 시도하고 있다는 표시이기 때문에 오류 로그에 보안 위반을 쓰는 것을 보증 할 수 있습니다.

OP에 코드 조각이 있으면 이러한 살균이 불가능합니다.


실제로, 페이지에 원하는 것을 게시하는 작은 페이지를 작성하는 것은 간단합니다. 따라서 리퍼러 헤더가 전송되지 않으면 포스트 vars는 vars를 얻는 것보다 안전하지 않습니다. $_POST검색 엔진 크롤러가 다음과 같은 작업을 수행하지 못하게 하는 것이 명시
적의

나는 반대로 아무 말도하지 않았다. 내가 말한 것은 HTML 양식이 POST를 사용하고 스크립트 처리가 GET을 통해 양식의 데이터를 수신하면 두 kobra의 예제와 같이 스크립트가 해당 정보를 알고 그 사실을 버리고 싶지 않다는 것입니다. (Btw : 리퍼러도 안전하지 않습니다.)

1

나는 그것을 사용 $_POST하고 그들의 내용 과 $_GET다르게 $_REQUEST영향을받지 않기 때문에 variables_order.
사용시기 $_POST$_GET실행중인 작업 종류에 따라 다릅니다. 서버에서 처리되는 데이터를 변경하는 작업은 POST 요청을 통해 수행해야하며 다른 작업은 GET 요청을 통해 수행해야합니다. 예를 들어, 사용자 계정을 삭제하는 작업은 사용자가 링크를 클릭 한 후에 직접 실행해서는 안되며 이미지를 보는 동안 링크를 통해 수행 할 수 있습니다.


1

나는 이것을 사용한다.

$request = (count($_REQUEST) > 1)?$_REQUEST:$_GET;

이 문장은 $ _REQUEST에 둘 이상의 매개 변수가 있는지 확인합니다 ($ _REQUEST의 첫 번째 매개 변수는 필요할 때 사용할 수있는 요청 URI가 될 것입니다. 일부 PHP 패키지는 $ _GET을 반환하지 않으므로 $ _GET에 대해 1 이상이 걸리는지 확인하십시오. 기본값은 $ _POST입니다.


0

조기 최적화 중입니다. 또한 보안상의 이유로 GET을 POST 할 대상에 사용 해야하는지 여부를 고려해야합니다.


3
POST에 대해 GET보다 안전한 것이 있다고 사람들에게 말하지 마십시오.

나는하지 않았다. 요점은 "REQUEST를 입력하는 것이 훨씬 더 쉽다"는 점에서 사용에 약간의 생각이 있어야하고 혼용없이 사용해서는 안된다는 점입니다.
Alex Brasetvik 2009

의미가 kobra가 예상 된 방법을 사용하여 데이터가 전송되었는지 확인해야한다는 것입니다. 그의 코드 예제 중 하나는 그러한 테스트를 불가능하게합니다.

0

그것은 추악하고 코드 라이브를 푸시 할 때 최종 솔루션으로 권장하지 않지만 나머지 함수를 빌드하는 동안 'catch-all'매개 변수 그래버를 갖는 것이 때로는 편리합니다.

public static function parseParams() {
    $params = array();
    switch($_SERVER['REQUEST_METHOD']) {
        case "PUT":
        case "DELETE":
            parse_str(file_get_contents('php://input'), $params);
            $GLOBALS["_{$_SERVER['REQUEST_METHOD']}"] = $params;
            break;
        case "GET":
            $params = $_GET;
            break;
        case "POST":
            $params = $_POST;
            break;
        default:
            $params = $_REQUEST;
            break;
    }
    return $params;
}

창조적 인 누군가가 명령 줄 매개 변수 나 IDE에서 오는 것을 처리하기 위해 추가 할 수도 있습니다. 지정된 휴면 기능이 수행하는 작업을 결정하면 해당 호출에 적합한 것을 선택하여 배포 버전에 필요한 것을 얻을 수 있습니다. 'REQUEST_METHOD'가 설정되어 있다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.