PHP
요청 데이터 읽기
수색…
비고
GET과 POST 중에서 선택하기
GET 요청은 페이지를 렌더링하는 데 필요한 데이터를 제공하는 데 가장 적합하며 여러 번 사용할 수 있습니다 (검색어, 데이터 필터 ...). 그것들은 URL의 일부로서 책갈피에 붙일 수 있고 종종 재사용 될 수 있습니다.
반면에 POST 요청은 서버에 한 번만 데이터를 제출하기위한 것입니다 (문의 양식, 로그인 양식 ...). ASCII 만 허용하는 GET과 달리 POST 요청은 파일 업로드를 포함하여 바이너리 데이터도 허용 합니다 .
차이점에 대한 자세한 설명은 여기에서 찾을 수 있습니다.
데이터 요청 취약성
GET 및 POST를 직접 사용하는 경우의 취약점은 무엇입니까?
유효성 검사없이 $ _GET 및 $ _POST 슈퍼 전역에서 데이터를 검색하는 것은 좋지 않은 것으로 간주되며 코드 또는 SQL 주입을 통해 사용자가 잠재적으로 데이터에 액세스하거나 코드를 손상시킬 수있는 방법을 엽니 다. 유효하지 않은 데이터는 이러한 공격을 막기 위해 검사되고 거부되어야합니다.
요청 데이터는 코드에서 사용되는 방법에 따라 이스케이프해야합니다 ( 여기 및 여기 참조) . 이 답변 에는 일반적인 데이터 사용 사례에 대한 몇 가지 다른 이스케이프 함수가 나와 있습니다.
파일 업로드 오류 처리
$_FILES["FILE_NAME"]['error']
(여기서 "FILE_NAME"
은 양식에있는 파일 입력의 이름 속성 값입니다)은 다음 값 중 하나를 포함 할 수 있습니다.
-
UPLOAD_ERR_OK
- 오류없이 파일을 업로드하여 성공했습니다. -
UPLOAD_ERR_INI_SIZE
- 업로드 된 파일이php.ini
의 upload_max_filesize 지시어를 초과합니다. -
UPLOAD_ERR_PARTIAL
- 업로드 된 파일이 HTML 양식에 지정된 MAX_FILE_SIZE 지시문을 초과합니다. -
UPLOAD_ERR_NO_FILE
- 업로드 된 파일이 없습니다. -
UPLOAD_ERR_NO_TMP_DIR
- 임시 폴더가 없습니다. (PHP 5.0.3부터). -
UPLOAD_ERR_CANT_WRITE
- 파일을 디스크에 쓰지 못했습니다. (PHP 5.1.0부터). -
UPLOAD_ERR_EXTENSION
- PHP 확장 프로그램이 파일 업로드를 중단했습니다. (PHP 5.2.0부터).
오류를 확인하는 기본 방법은 다음과 같습니다.
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
POST 데이터 읽기
POST 요청의 데이터는 연관 배열 형식으로 superglobal $_POST
에 저장됩니다.
존재하지 않는 배열 항목에 액세스하면 알림이 생성되므로 isset()
또는 empty()
함수 또는 null 병합 연산자를 사용하여 항상 존재 여부를 확인해야합니다.
예:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
GET 데이터 읽기
GET 요청의 데이터는 연관 배열의 형태로 superglobal $_GET
에 저장됩니다.
존재하지 않는 배열 항목에 액세스하면 알림이 생성되므로 isset()
또는 empty()
함수 또는 null 병합 연산자를 사용하여 항상 존재 여부를 확인해야합니다.
예 : (URL : /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
원시 POST 데이터 읽기
일반적으로 POST 요청에서 전송되는 데이터는 application/x-www-form-urlencoded
의 MIME 유형으로 구조화 된 키 / 값 쌍입니다. 그러나 웹 서비스와 같은 많은 응용 프로그램은 XML 또는 JSON 형식의 원시 데이터를 대신 보내야합니다. 이 데이터는 두 가지 방법 중 하나를 사용하여 읽을 수 있습니다.
php://input
은 원시 요청 본문에 대한 액세스를 제공하는 스트림입니다.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
는 원시 POST 데이터가 들어있는 전역 변수입니다. php.ini
의 always_populate_raw_post_data
지시어가 활성화 된 경우에만 사용할 수 있습니다.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
이 변수는 PHP 버전 5.6부터 사용되지 않으며 PHP 7.0에서 제거되었습니다.
파일 업로드에 사용되는 콘텐츠 유형이 multipart/form-data
설정된 multipart/form-data
두 가지 방법 중 하나도 사용할 수 없습니다.
HTTP PUT으로 파일 업로드
PHP는 일부 클라이언트가 서버에 파일을 저장하는 데 사용되는 HTTP PUT 메소드를 지원 합니다. PUT 요청은 POST 요청을 사용하는 파일 업로드보다 훨씬 간단하며 다음과 같이 보입니다.
PUT /path/filename.html HTTP/1.1
PHP 코드에 다음과 같이하면됩니다 :
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
또한 여기에 당신은 SO / HTTP의 PUT를 통해 파일을 수신에 대한 질문 답변 흥미로운 읽을 수 있습니다.
POST로 배열 전달하기
일반적으로 PHP 양식에 제출 된 HTML 양식 요소는 단일 값을 갖습니다. 예 :
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
결과는 다음과 같습니다.
Array
(
[foo] => bar
)
그러나 값 배열을 전달하려는 경우가있을 수 있습니다. HTML 요소의 이름에 PHP와 같은 접미사를 추가하면됩니다.
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
결과는 다음과 같습니다.
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
배열 인덱스를 숫자 또는 문자열로 지정할 수도 있습니다.
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
이 출력을 반환합니다 :
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
이 기술은 $_POST
배열에 대한 후 처리 루프를 피하면서 코드를 더 가볍고 간결하게 만듭니다.