คำเตือน“ ห้ามเข้าถึง Superglobal $ _POST Array โดยตรง” บน Netbeans 7.4 สำหรับ PHP


118

ฉันได้รับคำเตือนข้อความนี้ใน Netbeans 7.4 สำหรับ PHP ในขณะที่ฉันใช้$ _POST , $ _GET , $ _SERVER , ...

อย่าเข้าถึง Superglobal $ _POST Array โดยตรง

หมายความว่าอย่างไร? ฉันจะแก้ไขคำเตือนนี้ได้อย่างไร

แก้ไข:โค้ดตัวอย่างเหตุการณ์ยังคงแสดงคำเตือนนี้


1
รหัสใดที่ยืนยันข้อความนี้ใน Netbeans
TiMESPLiNTER

2
เป็นเพียงคำแนะนำคุณสามารถปิดได้ในตัวเลือก ... และฉันจะบอกว่านี่ไม่ใช่คำถามเกี่ยวกับการเขียนโปรแกรม!
Matteo Tassinari

1
ฉันแค่อยากรู้ว่าคำเตือนนี้ต้องการให้ฉันเปลี่ยนอะไร! เนื่องจาก netbeans เวอร์ชันเก่าไม่แสดง มีวิธีอื่นในการรับพารามิเตอร์เหล่านั้นหรือไม่? (ฉันหมายถึง $ _POST)
กรรณิการ์

@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

สาเหตุที่มีการเพิ่มเนื่องจาก superglobals มักจะเต็มไปด้วยอินพุตของผู้ใช้ซึ่งไม่ควรเชื่อถือแบบสุ่มสี่สุ่มห้า ควรทำการกรองบางประเภทแทนและนั่นคือสิ่งที่คำใบ้แนะนำ กรองค่า superglobal ในกรณีที่มีเนื้อหาที่เป็นพิษ

ตัวอย่างเช่นที่ฉันมี:

$_SERVER['SERVER_NAME']

ฉันใส่แทน:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

คุณมี filter_input และตัวกรอง doc ที่นี่:

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

เพียงแค่ใช้

filter_input (INPUT_METHOD_NAME, 'var_name') แทน $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) แทน $ _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);

หมายเหตุ: ใช้กับตัวแปร Super Global อื่น ๆ ทั้งหมด


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.