ทำความสะอาดตัวแปร $_POST [ซ้ำกัน]

ฉันกำลังพยายามหาวิธีล้างตัวแปร POST และ GET ทั้งหมดอย่างมีประสิทธิภาพด้วยฟังก์ชันเดียว นี่คือฟังก์ชันของตัวเอง:

//clean the user's input
function cleanInput($value, $link = '')
{
    //if the variable is an array, recurse into it
    if(is_array($value))
    {
        //for each element in the array...
        foreach($value as $key => $val)
        {
            //...clean the content of each variable in the array
            $value[$key] = cleanInput($val);
        }

        //return clean array
        return $value;
    }
    else
    {
        return mysql_real_escape_string(strip_tags(trim($value)), $link);
    }
}

และนี่คือรหัสที่จะเรียกมันว่า:

//This stops SQL Injection in POST vars
foreach ($_POST as $key => $value)
{
    $_POST[$key] = cleanInput($value, $link);
}

//This stops SQL Injection in GET vars
foreach ($_GET as $key => $value)
{
    $_GET[$key] = cleanInput($value, $link);
}

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

ฉันได้ทดสอบโค้ดของฉันโดยไม่มีฟังก์ชันข้างต้นและใช้งานได้ดี ฉันแค่ต้องการความปลอดภัยเพิ่มเติมเล็กน้อยในนั้น

ขอบคุณ!


person tscully    schedule 22.10.2009    source แหล่งที่มา
comment
คุณควรหลีกเลี่ยงการพยายามฆ่าเชื้อทุกสิ่งในทุกบริบท นั่นเป็นเพียงอุปสรรคต่อแอปพลิเคชันของคุณและทำให้การรักษาความปลอดภัยยากขึ้นเมื่อคุณต้องการสร้างฟังก์ชันการทำงานที่หายไปอีกครั้ง นี่เป็นเหตุผลที่ถูกต้องว่าทำไม magic_quotes จึงถูกปิดใช้งาน php.net/manual/en/security.magicquotes.php สิ่งที่คุณ' สร้างขึ้นใหม่ในความรู้สึกที่นี่ อินพุตจะต้องได้รับการฆ่าเชื้อสำหรับแอปพลิเคชันที่คุณจะส่งไป หากคุณกำลังส่งไปยังเบราว์เซอร์ผ่าน HTTP ให้ฆ่าเชื้อสำหรับ HTTP และ HTML หากคุณกำลังส่งไปยัง SQL DB ให้ฆ่าเชื้อสำหรับ SQL   -  person bucabay    schedule 23.10.2009
comment
ขออภัย ฉันหมายถึงเลิกใช้แล้ว: php.net/manual/en/security.magicquotes.php< /ก>   -  person bucabay    schedule 23.10.2009
comment
ขอบคุณสำหรับความช่วยเหลือ / คำแนะนำทั้งหมด! ดูเหมือนว่าฉันต้องคิดใหม่เกี่ยวกับกระบวนการของฉัน :-)   -  person tscully    schedule 23.10.2009


คำตอบ (5)


สิ่งที่คุณทำอยู่นั้นไม่เพียงพอ ดูที่นี่ .

person ryeguy    schedule 22.10.2009

ใช้ filter_input ถ้าเป็นไปได้ (php5 +) มันทำให้สะอาดขึ้นมากและเท่าที่ฉัน ตระหนักดีว่าคุณสามารถฆ่าเชื้อและตรวจสอบทุกสิ่งที่คุณต้องการใช้งานได้

คุณสามารถใช้ filter var array และตัวอย่าง FILTER_SANITIZE_STRING ตั้งค่าสถานะเพื่อกรองอาร์เรย์ของโพสต์ทั้งหมด

filter_var_array($_POST, FILTER_SANITIZE_STRING) //just an example filter

มีตัวเลือกตัวกรองต่างๆ มากมายใน การอ้างอิงตัวกรอง ของ w3schools

person Andrew    schedule 22.10.2009
comment
โอ้ มันสุดยอดมาก! ฉันไม่เคยเห็นสิ่งนี้มาก่อน :) - person Mickey; 23.10.2009
comment
นี่เป็นวิธีที่ดีที่สุดหากคุณมี php5 - person robjmills; 23.10.2009

เพื่อให้การเรียกซ้ำสวยงามยิ่งขึ้น คุณสามารถใช้ array_map ได้ เช่น:

$_POST = array_map('mysql_real_escape_string',$_POST);

ใช้ตัวกรอง var หากคุณสามารถทำได้เนื่องจากโดยทั่วไปแล้ววิธีการประเภทนี้ไม่ดี เป็นเพียงตัวอย่าง ;)

person robjmills    schedule 22.10.2009

ช่องทำเครื่องหมายที่ไม่ได้เลือกจะไม่ถูกส่งไปยังเซิร์ฟเวอร์

คุณสามารถใช้ array_walk_recursive เพื่อทำสิ่งที่คุณต้องการ

person w35l3y    schedule 22.10.2009

นี่เป็นวิธีที่ผิดในการทำความสะอาดอินพุต

การใช้การ Escape mysql แบบครอบคลุมกับทุกสิ่งใน $_POST และ $_GET กำลังจะกลับมากัดคุณ หากคุณยังคงต้องการใช้ข้อมูลหลังจากที่คุณทำการสืบค้นฐานข้อมูล แต่คุณไม่ต้องการให้มีอักขระ Escape ในนั้น

ใช้การสืบค้นแบบมีพารามิเตอร์กับ mysqli หรือ PDO และคุณไม่จำเป็นต้องใช้ mysql_real_escape_string()

person Ben James    schedule 22.10.2009
comment
ที่แย่ไปกว่านั้นคือถ้าคุณไม่มีการเชื่อมต่อกับฐานข้อมูลที่เริ่มต้นไว้แล้ว - person alex; 23.10.2009
comment
ฉันได้ตั้งค่าการเชื่อมต่อไว้เหนือการเรียกใช้ฟังก์ชันแล้ว แต่พวกคุณไม่จำเป็นต้องดูว่าฉันมีอะไรบ้าง ;-) - person tscully; 23.10.2009
comment
ดู: php.net/manual/en/security.magicquotes.php - person bucabay; 23.10.2009