Cảnh báo “Không truy cập trực tiếp vào mảng Superglobal $ _POST” trên Netbeans 7.4 cho PHP


118

Tôi đã nhận được cảnh báo thông báo này trên Netbeans 7.4 cho PHP khi đang sử dụng $ _POST , $ _GET , $ _SERVER , ...

Không truy cập trực tiếp vào mảng Superglobal $ _POST

Nó có nghĩa là gì? Tôi có thể làm gì để sửa cảnh báo này?

Chỉnh sửa: Mã mẫu Sự kiện vẫn hiển thị cảnh báo này.


1
Mã bảo vệ thông báo này trong Netbeans là gì?
TiMESPLiNTER

2
Nó chỉ là một đề xuất, bạn có thể tắt nó trong các tùy chọn ... và tôi muốn nói rằng đây không phải là một câu hỏi lập trình!
Matteo Tassinari

1
Tôi chỉ muốn biết cảnh báo này muốn tôi thay đổi điều gì! vì phiên bản netbeans cũ hơn không hiển thị. Có cách nào khác để lấy các tham số đó không? (Ý tôi là $ _POST)
Kannika

@MatteoTassinari Tôi biết đó chỉ là khuyến nghị và tôi biết nơi để tắt nó, nhưng tôi có thể làm gì để sửa mà không có bất kỳ cảnh báo nào? Tôi nghĩ rằng kiến ​​thức của tôi có giới hạn để nhận được cảnh báo, nhưng tôi chỉ muốn sửa chữa nó để làm cho mã của tôi cập nhật những điều mới vì tôi biết chỉ $ _POST mới nhận được các biểu mẫu đăng đó. Dù sao, Cảm ơn vì nhận xét của bạn: D
Kannika

Câu trả lời:


92

filter_input(INPUT_POST, 'var_name')thay vì thay $_POST['var_name']
filter_input_array(INPUT_POST)$_POST


6
Bạn đang trả lời cho câu hỏi "cảnh báo có nghĩa là gì" hoặc ở câu hỏi "làm thế nào để loại bỏ nó"? Bởi vì tôi đồng ý với bạn, đó là ý nghĩa của cảnh báo, nhưng sử dụng chức năng, cảnh báo vẫn ở đó. Tôi có nó ngay bây giờ trên a $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci

6
@stenci bạn đang sử dụng lại $ _POST trong khi bạn nên làm điều gì đó như sau $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk

16
Chà, cảnh báo có thể biến mất, nhưng nếu bạn không chỉ định bộ lọc thì bạn sẽ không thực sự khắc phục được vấn đề bảo mật mà NetBeans đang chỉ ra. Ví dụ: nếu bạn đang mong đợi một số int, hãy sử dụng:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ,

44
-1: Câu trả lời này có vẻ tầm thường. không có lời giải thích, filter_input làm gì, thậm chí không có liên kết đến php.net/filter_input . Tôi sợ rằng mọi người sẽ chỉ nhìn thấy nó, sử dụng nó, nghĩ rằng họ đang viết mã tốt hơn nhưng vẫn không hiểu một điều gì đó.
IARI

5
Ow, đề xuất sử dụng hàm bộ lọc mà không có đối số bộ lọc dẫn đến FILTER_UNSAFE_RAW, tương đương với TRUST_ALL_BAD_INPUT
Kzqai

88

Mặc dù hơi muộn, nhưng tôi đã gặp câu hỏi này khi đang tìm kiếm giải pháp cho cùng một vấn đề, vì vậy tôi hy vọng nó có thể giúp ích được gì ...

Tìm thấy mình trong cùng bóng tối với bạn. Vừa tìm thấy bài viết này, giải thích một số gợi ý mới được giới thiệu trong NetBeans 7.4, bao gồm cả gợi ý này:

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

Lý do tại sao nó được thêm vào là bởi vì superglobals thường chứa đầy thông tin đầu vào của người dùng, điều này không nên được tin tưởng một cách mù quáng. Thay vào đó, một số loại lọc nên được thực hiện và đó là những gì gợi ý. Lọc giá trị superglobal trong trường hợp nó có một số nội dung bị nhiễm độc.

Ví dụ, nơi tôi có:

$_SERVER['SERVER_NAME']

Thay vào đó tôi đã đặt:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Bạn có tài liệu filter_input và bộ lọc ở đây:

http://www.php.net/manual/en/ Chức năng.filter-input.php

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


Nếu bạn làm chính xác những gì bạn nói, Netbeans sẽ vẫn gạch chân phần "$ _POST" hoặc "$ _GET" và hiển thị thông báo như thể nó không được lọc. Sự cố này có thể chỉ là lỗi Netbeans (ít nhất là trong phiên bản 8.1).
user3640967

6

Tôi đồng ý với những người trả lời khác rằng trong hầu hết các trường hợp (hầu như luôn luôn), cần phải làm sạch thông tin đầu vào của Bạn.

Nhưng hãy xem xét mã như vậy (nó dành cho bộ điều khiển 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();
}

Sẽ không hữu ích lắm nếu áp dụng biện pháp vệ sinh ở đây (mặc dù nó cũng không làm hỏng bất cứ thứ gì).

Vì vậy, hãy làm theo các khuyến nghị, nhưng không mù quáng - đúng hơn là hiểu lý do tại sao chúng dành cho :)


1

Chỉ dùng

filter_input (INPUT_METHOD_NAME, 'var_name') thay vì $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) thay vì $ _INPUT_METHOD_NAME

ví dụ

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

thay vì

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

Và sử dụng

    var_dump(filter_input_array(INPUT_SERVER));

thay vì

    var_dump($_SERVER);

NB: Áp dụng cho tất cả các biến Super Global khác


0

Đây là một phần của dòng trong mã của tôi đã đưa cảnh báo lên trong NetBeans:

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

Sau nhiều nghiên cứu và xem có khoảng một tỷ bazi tỷ cách để lọc mảng này, tôi đã tìm thấy một cách đơn giản. Và mã của tôi hoạt động và NetBeans rất vui:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.