PHP 용 Netbeans 7.4에서 "수퍼 글로벌 $ _POST 어레이에 직접 액세스하지 마십시오"경고


118

$ _POST , $ _GET , $ _SERVER , ...를 사용하는 동안 PHP 용 Netbeans 7.4에서이 메시지가 표시됩니다 .

수퍼 글로벌 $ _POST 어레이에 직접 액세스하지 마십시오.

무슨 뜻인가요? 이 경고를 수정하려면 어떻게해야합니까?

편집 : 이벤트 샘플 코드는 여전히이 경고를 표시합니다.


1
Netbeans에서이 메시지를 보장하는 코드는 무엇입니까?
TiMESPLiNTER 2013

2
그것은 단지 권장 사항입니다. 옵션에서 끌 수 있습니다 ... 그리고 이것은 프로그래밍 질문이 아니라고 말할 것입니다!
Matteo Tassinari 2013

1
이 경고가 무엇을 변경하기를 원하는지 알고 싶습니다! 이전 netbeans 버전이 표시되지 않기 때문입니다. 해당 매개 변수를 가져 오는 다른 방법이 있습니까? (내 말은 $ _POST)
Kannika 2013

@MatteoTassinari 나는 그것이 단지 권장 사항이라는 것을 알고 있으며 비활성화 할 위치를 알고 있지만 경고없이 수정하려면 무엇을 할 수 있습니까? 내 지식은 경고를 받기에 한계가 있다고 생각하지만 $ _POST만이 게시 양식을 제출한다는 것을 알고 있기 때문에 코드를 새로운 것으로 업데이트하기 위해 수정하고 싶습니다. 어쨌든, 당신의 의견을 주셔서 감사합니다 : D
Kannika

답변:


92

filter_input(INPUT_POST, 'var_name')대신 $_POST['var_name']
filter_input_array(INPUT_POST)대신$_POST


6
"경고의 의미"또는 "제거 방법"이라는 질문에 대답하고 있습니까? 나는 당신과 동의하기 때문에 경고가 의미하는 바이지만 기능을 사용하면 경고가 그대로 유지됩니다. 지금은 $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci

6
@stenci $ _POST를 다시 사용하고 있지만 다음과 같이해야합니다. $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk

16
글쎄, 경고가 사라질 수 있지만 필터를 지정하지 않으면 NetBeans가 지적한 보안 문제를 실제로 해결하지 못할 것입니다. 예를 들어, int를 예상하는 경우 다음을 사용하십시오.filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ

44
-1 :이 대답은 사소한 것 같습니다. 설명 없음, filter_input의 기능, php.net/filter_input 링크도 없습니다 . 사람들이 그것을보고, 사용하고, 더 나은 코드를 작성하고 있다고 생각하지만 여전히 무언가를 이해하지 못하는 것은 나를 두렵게합니다.
IARI

5
필터 인수없이 필터 함수를 사용하면 FILTER_UNSAFE_RAW가됩니다. 이는 TRUST_ALL_BAD_INPUT
Kzqai

88

조금 늦었지만 같은 문제에 대한 해결책을 찾는 동안이 질문을 보았으므로 도움이되기를 바랍니다.

당신과 같은 어둠 속에서 나를 찾았습니다. 다음을 포함하여 NetBeans 7.4에 도입 된 몇 가지 새로운 힌트를 설명하는이 기사를 방금 찾았습니다.

https://blogs.oracle.com/netbeansphp/entry/improve_your_code_with_new

추가 된 이유는 수퍼 글로벌이 일반적으로 사용자 입력으로 채워져 맹목적으로 신뢰할 수 없기 때문입니다. 대신, 어떤 종류의 필터링이 수행되어야하며, 그것이 힌트가 암시하는 것입니다. 감염된 콘텐츠가있는 경우 슈퍼 글로벌 값을 필터링합니다.

예를 들어, 내가 가진 곳 :

$_SERVER['SERVER_NAME']

대신 넣었습니다.

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

여기에 filter_input 및 filters 문서가 있습니다.

http://www.php.net/manual/en/function.filter-input.php

http://www.php.net/manual/en/filter.filters.php


말한대로 정확하게 수행하면 Netbeans는 여전히 "$ _POST"또는 "$ _GET"부분에 밑줄을 긋고 필터링되지 않은 것처럼 알림을 표시합니다. 이 문제는 Netbeans 버그 일 수 있습니다 (최소 버전 8.1에서는).
user3640967

6

대부분의 경우 (거의 항상) 귀하의 입력 내용을 삭제해야한다는 다른 답변자들의 의견에 동의합니다.

그러나 다음 코드를 고려하십시오 (REST 컨트롤러 용).

$method = $_SERVER['REQUEST_METHOD'];

switch ($method) {
            case 'GET':
                return $this->doGet($request, $object);
            case 'POST':
                return $this->doPost($request, $object);
            case 'PUT':
                return $this->doPut($request, $object);
            case 'DELETE':
                return $this->doDelete($request, $object);
            default:
                return $this->onBadRequest();
}

여기에 살균을 적용하는 것은 그다지 유용하지 않습니다 (아무것도 깨지지는 않지만).

따라서 권장 사항을 따르되 맹목적으로는 아닙니다.


1

그냥 사용

$ _INPUT_METHOD_NAME [ 'var_name'] 대신 filter_input (INPUT_METHOD_NAME, 'var_name') $ _INPUT_METHOD_NAME 대신 filter_input_array (INPUT_METHOD_NAME)

예 :

    $host= filter_input(INPUT_SERVER, 'HTTP_HOST');
    echo $host;

대신에

    $host= $_SERVER['HTTP_HOST'];
    echo $host;

그리고 사용

    var_dump(filter_input_array(INPUT_SERVER));

대신에

    var_dump($_SERVER);

주의 : 다른 모든 슈퍼 글로벌 변수에 적용


0

다음은 NetBeans에서 경고를 표시 한 코드의 일부입니다.

$page = (!empty($_GET['p'])) 

많은 연구와이 배열을 필터링하는 방법이 얼마나 많은지 확인한 끝에 간단한 방법을 찾았습니다. 내 코드가 작동하고 NetBeans가 행복합니다.

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.