รหัส PHP eval () ส่งคืนจากการสืบค้น mysql * ไม่ทำงาน *

ถ้าฉันทำสิ่งนี้:


    $p = 10;
    $n = 3;
    $evalstr = "\$f = 0.99 + ((.025 * \$p) * \$n);";
    eval($evalstr);
    echo $f;

ฉันได้รับการแสดง 1.74 ไม่มีข้อผิดพลาดทุกอย่างเรียบร้อยดี แต่เมื่อฉันมีตาราง mysql ที่เก็บสมการเหล่านี้ (สำหรับจุดประสงค์ของตัวอย่างนี้ มันเป็นสมการเดียวกันทุกประการ)...เช่นนั้น:


    $p = 10;
    $n = 3;
    while ($result = mysql_fetch_assoc($results)) {
        $math = $result['math'];
        //at this point $math = "\$f = 0.99 + ((.025 * \$p) * \$n);"
        eval($math);
    }

ฉันได้รับข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์ T_VARIABLE ที่ไม่คาดคิด คาดหวัง T_STRING ใน ajax\getprices.php(30) : รหัส eval()'d ในบรรทัด 1

ไม่แน่ใจว่าทำไมถ้าฉันพิมพ์ echo $math มันเหมือนกับสิ่งที่ฉันมีเป็น $evalstr ในตัวอย่างแรกหรือไม่ จริงๆ แล้ว $p และ $n ถูกตั้งค่าจากตัวแปร GET แต่แม้ว่าฉันจะตั้งค่าด้วยตนเองเหมือนในตัวอย่าง มันก็ไม่ทำงาน


person Mike L.    schedule 18.10.2011    source แหล่งที่มา
comment
คำแนะนำ. พยายามอย่าเก็บ PHP ของคุณในฐานข้อมูล หากคุณมีช่องโหว่ในการแทรก sql อาจมีบางคนสามารถโจมตีฐานโค้ดทั้งหมดของคุณได้ ไม่ใช่แค่ฐานข้อมูลของคุณ   -  person Cyclone    schedule 19.10.2011
comment
ideone.com/T20A4 คุณแน่ใจหรือไม่ว่า $math เป็นอย่างที่คุณพูดจริงๆ   -  person Dejan Marjanović    schedule 19.10.2011
comment
ลองแทนที่ eval() ด้วย var_dump($math) และแจ้งให้เราทราบให้ชัดเจนว่ามันพิมพ์อะไรออกมา   -  person Ilmari Karonen    schedule 19.10.2011


คำตอบ (2)


สำหรับฉันแล้วดูเหมือนว่าคุณได้เก็บนิพจน์ซึ่งรวมถึง $ ที่เป็น Escape ไว้ในฐานข้อมูล คุณอาจลองถ้ามันได้ผล หากคุณลบเครื่องหมายทับออกก่อน:

eval(stripslashes($math));

ฉันอยากจะแนะนำให้ระมัดระวังอย่างมากในการจัดเก็บโค้ดดังกล่าวในฐานข้อมูลและใช้ eval เพื่อดำเนินการ อาจมีช่องโหว่ด้านความปลอดภัยที่นี่ แต่ฉันถือว่าคุณรู้เรื่องนี้

person aurora    schedule 18.10.2011
comment
มันใช้งานได้ คำตอบเดียวกับที่ฉันคิดขึ้นมา ฉันกำลังลบเครื่องหมายทับด้วยตนเอง (เพียง 18 สมการ) และความปลอดภัยก็ไม่มีปัญหาที่นี่ ขอบคุณ - person Mike L.; 19.10.2011

ฉันเข้าใจแล้ว ดูเหมือนว่าเมื่อกำหนดโค้ด eval เป็นตัวแปร ฉันต้องหลีกเลี่ยง $ แต่เมื่อดึงมันจาก mysql เป็นตัวแปร มันจะใช้งานได้ถ้าฉันไม่หลีกหนี $

person Mike L.    schedule 18.10.2011