GET 또는 POST에 관계없이 외부 변수를 단일 개체로 조합하는 php 함수
-
22-08-2019 - |
문제
다른 사람의 PHP 코드를 한 번 검토한 적이 있는데 그 사람은 모든 GET 및 POST 변수를 하나의 일반 객체로 롤링하여 전달할 수 있는 함수나 클래스 메서드를 가지고 있었습니다.GET과 POST에 동일한 이름-값 쌍이 나타나면 POST가 승리합니다.
정확히 이 기능을 수행하는 잘 코딩된 PHP 추가 기능이 있습니까?
해결책
당신은 사용할 수 있습니다 $_REQUEST
, 그러나 여기에는 다음 내용이 포함되어 있습니다. $_GET
, $_POST
그리고 $_COOKIE
, 그리고 이 슈퍼 전역 변수의 존재(및 덮어쓰기 목적을 위한 순서)는 실행 환경의 구성에 따라 달라집니다.
이로 인해 문제가 발생하는 경우 간단한 버전을 롤업하는 것이 좋습니다. 그 핵심은 다음과 같습니다.
$requestData = array_merge( $_GET, $_POST );
그런 다음 이를 어떤 방식으로 마무리하여 추가로 유용한 기능을 제공할 수 있습니다.자동으로 적용 stripslashes()
다음을 사용하여 엉망이 된 값에 magic_quotes
, 누락된 변수에 대한 기본값 제공 등
다른 팁
두 변수를 모두 병합합니다 (또는 사용 $_REQUEST
또는 글로벌 등록 대신) 값의 출처를 확실하게 식별 할 수 없으므로 보안 결함을 유발할 수 있습니다. 따라서 액세스 할 때 $_REQUEST['foobar']
URL, 우편 본문 또는 쿠키를 통해 값이 전송되었는지 알 수 없습니다. 이로 인해 스크립트가 취약해질 수 있습니다 크로스 사이트 요청 위조.
따라서 편안함을 통해 보안을 찾아 값이 출처를 기대하는 변수를 사용하는 것이 좋습니다. $_GET
URL이 통과 할 것으로 예상되는 인수의 경우 $_POST
우편을 통해 통과 한 사람들을 위해 $_COOKIE
쿠키 용.
나는 그것이 갈라지는 것이 나쁜 관행을 고려할 것입니다 $_GET
~와 함께 $_POST
. 그것들은 완전히 다른 것들을위한 것이며, 그것들을 동등하게 취급함으로써, 당신은 HTTP 프로토콜을 효과적으로 오용하고 있습니다. 말한 바와 같이, $_REQUEST
당신이 원하는 것을하지만 조금 예측할 수 없습니다. 당신은 자신의 글로벌 기능을 쉽게 작성하여 동일한 작업을 수행 할 수 있습니다.
function param($name, $default = null) {
return isset($_POST[$name])
? $_POST[$name]
: (isset($_GET[$name])
? $_GET[$name]
: $default);
}
하지만 정말 .. 나쁜 연습입니다.
$ _request Global Variable을 사용할 수 있습니다. PHP를 사용하여 웹 기반 애플리케이션을 작성할 때 응용 프로그램의 경우 웹 SAPI (CGI 또는 웹 서버 모듈과 같은)에서 응용 프로그램이 실행될 때 기본적으로 해석 된 PHP에 의해 정의됩니다. $ _request는 $ _get 및 $ _post의 모든 데이터의 연관 배열이며 기본적으로 정의됩니다. 이를 사용하려면 확장/라이브러리가 필요하지 않습니다.
이것은 앱 전체의 글로벌을 처리하는 내 프레임 워크의 클래스입니다. 변수의 처리는 여기서 수행되지 않습니다.
class stGlobal
{
//instance
private static $instance;
//global settings
public $post = '';
public $get = '';
public $files = '';
public $request = '';
private function initialize()
{
$this->post = $_POST;
$this->get = $_GET;
$this->files = $_FILES;
$this->request = $_REQUEST;
}
public function getInstance()
{
if (!isset(self::$instance))
{
$class = __CLASS__;
self::$instance = new $class();
self::$instance->initialize();
}
return self::$instance;
}
}
어디서나 사용합니다
$myObj = stGlobal::getInstance();