ว่างเปล่า $ _POST อาร์เรย์ที่ลึกลับ


21

ฉันมีหน้า HTML / PHP ต่อไปนี้:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

ดังที่คุณเห็นฟอร์มจะส่งและเอาต์พุตที่คาดหวังคือ POST array ที่มีหนึ่งอาร์เรย์ในนั้นซึ่งมีค่าที่กรอกและหนึ่งรายการ "action" พร้อมค่า "Go" (ปุ่ม) อย่างไรก็ตามไม่ว่าฉันจะป้อนค่าใดในฟิลด์ ผลลัพธ์มักจะ:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

ยังไงก็ตาม, อาร์เรย์ชื่อการทดสอบจะถูกลบ, ตัวแปร "การกระทำ" จะทำให้มันผ่าน

ฉันใช้ส่วนขยาย Live HTTP Headers สำหรับ Firefox เพื่อตรวจสอบว่ามีการส่งฟิลด์ POST หรือไม่และทำได้ ข้อมูลที่เกี่ยวข้องจาก Live HTTP Headers (ด้วย a, b และ c เป็นค่าในกล่องข้อความ):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

ใครบ้างมีความคิดว่าทำไมสิ่งนี้เกิดขึ้น? ฉันประหลาดกับสิ่งนี้มันมีค่าฉันเสียเวลามากแล้ว ...

ปรับปรุง:

เราได้ลองทำสิ่งนี้กับเซิร์ฟเวอร์ที่แตกต่างกันในกล่อง Windows ที่ใช้งานได้บนเซิร์ฟเวอร์ Ubuntu ที่มี PHP เวอร์ชัน 5.2.4 (พร้อม Suhosin) แต่ก็ไม่ได้ มันทำงานได้บนเซิร์ฟเวอร์ที่แตกต่างกันเช่นเดียวกับ Ubuntu และรุ่น PHP เดียวกันพร้อมติดตั้ง Suhosin

ฉันได้แบ่งไฟล์สองไฟล์นี่คือผลลัพธ์ ( diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

ใน phps.ini นี้มาจากเซิร์ฟเวอร์ที่ใช้งานได้และ php.ini เป็นเซิร์ฟเวอร์ปัจจุบัน ดูราวกับว่าไม่มีปัญหาที่นี่ใช่ไหม?


4
ซูโฮซินอาจจะเป็น
พ.ต.อ. กระสุน

Ya, suhosin ดูเหมือนผู้สมัครที่มีแนวโน้ม
SeanJA

คุณให้ข้อมูลเพิ่มเติมได้ไหม มีการติดตั้ง Suhosin บนเซิร์ฟเวอร์ฉันควรปิดหรือไม่ ฉันควรเปลี่ยนการตั้งค่าหรือไม่
rael_kid

3
ลองสิ่งนี้มันจะบันทึกถ้ามันเป็นปัญหาสีหนุ hardened-php.net/suhosin/configuration.html#suhosin.simulation

ฉันลองเปิดโหมดการจำลอง อาร์เรย์ยังคงว่างเปล่า ฉันไม่สามารถดูเหมือนจะหาแฟ้มบันทึก แต่ ...
rael_kid

คำตอบ:


2

มันทำงานโดยไม่มีดัชนีชัดเจนหรือไม่ ลอง:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

ไม่ไม่ทำงานเช่นกัน
rael_kid

อย่าตั้งค่าดัชนีสำหรับชุดทดสอบ - มันจะทำให้การตรวจจับตัวแปร POST ผิดพลาด
อาดัม

2
โอเคฉันสามารถปล่อยพวกเขาออกไป แต่มันไม่ได้แก้ปัญหาของฉัน
rael_kid

2

มีสาเหตุหลายประการที่ทำให้โพสต์อาร์เรย์ว่างเปล่า - โอกาสที่จะเกิดข้อผิดพลาดของมนุษย์ / นักพัฒนาซอฟต์แวร์ ฉันประสบปัญหานี้เมื่ออัพเกรดจาก PHP 5.2 เป็น 5.4 มันง่าย แต่ใช้เวลาหลายชั่วโมงในการแก้ไขปัญหาเพื่อค้นหาจุดบกพร่อง ในไฟล์ config.php ของเราเรามีคำสั่งด้านล่างเพื่อประมวลผล $ _POST อาร์เรย์:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

อัญประกาศ Magic เปิดขึ้นอีกครั้งและในเวอร์ชัน PHP สูงถึง 5.2 ทำงานได้ดี แต่ไม่มีอะไรเหนือกว่าเวอร์ชัน 5.2 จะไม่ดำเนินการและจะส่งคืนอาร์เรย์ว่างเปล่า

หากคุณยังไม่ได้error_reporting()เปิดฉันขอแนะนำให้คุณทำและฉันแน่ใจว่าคุณจะสามารถแก้ไขปัญหาได้

คุณควรตรวจสอบคุณสมบัติของระบบที่เลิกใช้แล้วเช่น " magic_quotes" เนื่องจากการใช้งานนั้นไม่สามารถส่งคืนผลลัพธ์ได้ ฉันหวังว่านี่จะช่วยได้. ขอให้โชคดี JCS :)


1

มีรายงานข้อผิดพลาดเกี่ยวกับปัญหานี้หรือคล้ายกันในตัวแก้ไขข้อบกพร่องของ PHP:

น่าเสียดายที่มันไม่ได้พูดถึงวิธีแก้ปัญหา แต่คุณสามารถลองตั้งค่าอีก CONTENT_TYPE หรือไม่มีประเภทเนื้อหาเลย


ข้อผิดพลาดเหล่านี้คล้ายกัน แต่ไม่เหมือนกับของฉัน ฉันลองตั้งค่าประเภทเนื้อหา (อย่างที่คุณเห็นในโค้ดขนาดเล็กในคำตอบดั้งเดิมของฉัน) หากฉันไม่ได้ตั้งค่าประเภทเนื้อหาเลยมันก็ไม่ทำงาน ...
rael_kid

1

มีปัญหาคล้ายกันมาก ก่อนอื่นต้องใช้เวลาพอสมควรกว่าจะได้โพสต์นี้ เมื่อต้องการทราบชื่อของปัญหาของฉันฉันต้องติดตั้งคอนโซล PHP เพื่อหาวิธีใช้งาน แก้จุดบกพร่องรหัสที่ฉันไม่รู้อะไรเลย ไปที่รากของปัญหาและยังคงงงงวย

การแก้ปัญหานั้นง่ายจริง ๆ ใน Chrome กด F12 เพื่อไปที่เครื่องมือสำหรับนักพัฒนาเลือกเครือข่ายลองโพสต์แบบฟอร์มของคุณ ติดตามคำขอโพสต์ดูสถานะ ถ้าเป็น 301 (หรืออย่างอื่นนอกเหนือจาก 200) - คุณกำลังมีปัญหาตรงกับที่ฉันมีจนกระทั่งเมื่อไม่นานมานี้!

ผู้ให้บริการโฮสต์รายใหม่ของฉันเปลี่ยนเส้นทางhttp://my_site.comไปยังhttp://www.my_site.comสิ่งที่ฉันต้องทำคือเปลี่ยนการตั้งค่าบางอย่างซึ่งเป็นส่วนหนึ่งของ CMS ของฉัน (คุณอาจแตกต่างกัน แต่คล้ายกัน)

$Configuration['BASE_URL'] = 'http://my_site.com'

ไปยัง

$Configuration['BASE_URL'] = 'http://www.my_site.com'

และ voila ความมหัศจรรย์และสายรุ้งและยูนิคอร์นและไซต์ของฉันก็ใช้งานได้ในที่สุด!

PS Messing กับการตั้งค่าโฮสติ้งของคุณอาจแก้ปัญหาของคุณ ... หากปัญหาของคุณคล้ายกับของฉันแน่นอน ...


ประณามมัน การเปลี่ยนเส้นทางก็เป็นปัญหาของฉันเช่นกัน!
Aman Alam

0

ฉันไม่แน่ใจ แต่มี

name="test[1]"

ฯลฯ อาจทำให้ PHP สับสน ฉันจะเปลี่ยนชื่ออินพุตเป็น test_1, test_2 และดูว่าเกิดอะไรขึ้น


7
@haavee: ไม่ PHP ประกาศการใช้งานนี้: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn

ฉันได้ลองวิธีนี้แล้วตัวแปรใช้งานได้ แต่พวกมันไม่ได้อยู่ในอาเรย์
rael_kid

@haavee: Nah, สัญกรณ์ไม่ได้สับสน PHP, มันเป็นมาตรฐานการใช้งานของ PHP + รูปแบบ เห็นลิงค์ของ Boldewyn :)

ตกลงขอบคุณ! เรียนรู้สิ่งใหม่วันนี้

1
@adam: "สามารถกำหนดคีย์เฉพาะให้กับอาร์เรย์ของคุณได้"

0

ใน PHP พื้นฐานฉันคิดว่ามีเพียงหนึ่งตัวเลือกการกำหนดค่าที่สามารถทำลายสิ่งนี้ได้post_max_sizeดังนั้นตรวจสอบ php.ini และไฟล์ที่เกี่ยวข้องเพื่อให้แน่ใจว่าค่านี้มีเหตุผลและไม่ได้ตั้งค่าเป็นศูนย์หรือค่าไม่ถูกต้องเช่นตัวอักษร .

Suhosin ทำให้สามารถป้องกันการโพสต์ตัวแปรในเงื่อนไขต่าง ๆ รวมถึงสิ่งต่าง ๆ เช่นความยาวของอาเรย์และความยาวของชื่อตัวแปร วางไฟล์ php.ini ของคุณเป็น 'suhosin' เพื่อดูว่ามีการตั้งค่าใด ๆ อยู่หรือไม่โดยเฉพาะอย่างยิ่งสิ่งที่เริ่มต้นด้วย 'suhosin.post' (ดูhttp://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depthสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับพารามิเตอร์ที่ฉันกำลังคิด)

โชคไม่ดีที่มีข้อ จำกัด สำคัญในการกำหนดค่าบางค่าให้เป็นหนึ่งหรือศูนย์รหัสของคุณ (และตัวแปร) นั้นสั้นพอที่จะทำให้เกิดความยาว หากสิ่งนั้นว่างเปล่าข้อเสนอแนะต่อไปของฉันคือการสำรองข้อมูล Apache และ PHP ของคุณกำหนดค่าทำเนียบไดเรกทอรีกำจัดแพคเกจติดตั้งใหม่และเริ่มนำชิ้นส่วนกำหนดค่ากลับมาใช้งานอีกครั้งจนกว่ารหัสจะหยุดทำงานอีกครั้ง ที่ทำงานกับการกำหนดค่าจากเซิร์ฟเวอร์ที่ไม่ได้ทำงานจนกว่าทั้งคู่จะเสีย) เนื่องจากคุณมีเซิร์ฟเวอร์ที่ใช้ระบบปฏิบัติการ PHP เดียวกันทำงานอย่างถูกต้องนี่เป็นข้อผิดพลาดในการกำหนดค่าบนเซิร์ฟเวอร์ที่ทำงานผิดพลาดอยู่ที่ไหนสักแห่ง แต่นั่นเป็นปัญหาที่ยุ่งยากมากในการค้นหา

ขอแนะนำให้ใช้การควบคุมเวอร์ชันของ / etc ก่อนที่คุณจะเริ่ม - ดูที่แพ็คเกจ etckeeper (อันที่จริงฉันแนะนำให้ใช้ช่วงเวลาตัวช่วยรักษาหลักที่สำคัญโดยเฉพาะในเครื่องที่มีบุคคลมากกว่าหนึ่งคนสามารถเข้าถึงรูทได้)


post_max_size ของฉันคือ 8M ฉันคิดว่าคงเพียงพอแล้ว php.ini ของฉันไม่มีรายการที่มี suhosin อยู่ในนั้นดังนั้นอาจเป็นปัญหา ... suhosin มีไฟล์ conf ของตัวเองหรือไม่?
rael_kid

ไม่ใช่โดยค่าเริ่มต้น แต่การตั้งค่าสำหรับโมดูล PHP ใด ๆ สามารถตั้งค่าโดยไฟล์ใด ๆ ใน /etc/php5/conf.d บนระบบ Debian และทำให้ฉันเข้าใจว่าเป็นระบบ Ubuntu อย่างที่ฉันบอกไปนี่เป็นอะไรบางอย่างที่ยาวนาน ยังฉันจะเริ่มต้นด้วยการแตกต่างกันแต่ละไฟล์ config กับระบบการทำงาน
Zed

0

ฉันมีความล้มเหลวในการส่งแบบฟอร์มไปทั่วสถานที่ตั้งแต่ฉันอัปเกรดเป็น Debian "การทดสอบ" จาก "เสถียร" ปรากฏว่า apache2 หรือ php5 ไม่ได้จัดการหลายรายการในการส่งด้วยชื่อเดียวกัน ตัวอย่างเช่น; แบบฟอร์มของคุณมีชื่ออินพุตสองชื่อ "mo" ในอดีตค่าเพียงหนึ่งเดียวสำหรับ "mo" จะทำให้ผ่านไปได้ ตอนนี้ดูเหมือนว่ารูปแบบจะลดลงข้อมูลทั้งหมดหลังจากที่เกิดขึ้นครั้งแรกของคีย์ที่ซ้ำกัน ยังไม่แน่ใจ. ยังคงพยายามที่จะคิดออก


0

ลองคัดลอก php.ini จากเซิร์ฟเวอร์ที่ทำงานกับเซิร์ฟเวอร์นี้ (สำรอง php.ini ของเซิร์ฟเวอร์ที่ไม่ทำงานก่อน) ถ้าเป็นเช่นนั้นมันมีบางอย่างในนั้น (อาจเป็นตัวแปร_orderหรืออาจเป็นหน่วยความจำ


0

ลองเปลี่ยนชื่อปุ่มส่งของคุณเป็นอย่างอื่นนอกเหนือจากการทำงาน ฉันเคยมีปัญหากับเรื่องนี้ในอดีต การป้อนชื่อ 'การกระทำ' ดูเหมือนจะเป็นปัญหา


0

ต่อไปนี้ไม่ควรช่วยคุณ มันเปรียบเทียบกับทุกสิ่งที่ฉันรู้เกี่ยวกับการกำหนดค่า PHP:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

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

แต่คุณควรจะลองและเปลี่ยนลำดับของตัวแปร


0

แม้ OP นั้นจะค่อนข้างเก่า แต่วันนี้ฉันพบปัญหาที่คล้ายกัน

หลังจากใช้เวลาไม่กี่ชั่วโมงในการตรวจสอบสิ่งที่แตกต่างกันนับล้านครั้งในที่สุดก็พบว่าหลังจากอัปเดตเป็นPHP 5.6.17รุ่นล่าสุดใน cPanel ของเราที่การตั้งค่าเริ่มต้น PHP httpไม่ได้ถูกเลือกป้อนคำอธิบายรูปภาพที่นี่

และหลังจากตั้งค่าเป็นที่เลือกแล้วทุกอย่างจะกลับสู่ปกติ :-)

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่ามันจะช่วยให้ผู้อ่านในอนาคต


0

หากสิ่งนี้สามารถช่วยคนอื่นได้ ... ฉันใช้เวลาหลายชั่วโมงเพื่อแก้ไขปัญหาที่คล้ายกันและปัญหาคือ max_input_vars = "1000" ขีด จำกัด ของ php.ini อย่าลืมตรวจสอบค่า php.ini ของ upload_max_filesize, post_max_size และ max_input_vars เกินหนึ่งจะส่งผลให้มีอาร์เรย์ $ _POST ที่ว่างเปล่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.