ป้องกันข้อความแสดงข้อผิดพลาดจากการแสดง SQL


10

ในตารางของฉันฉันได้สร้างดัชนีใน 'col1' เพื่อป้องกันรายการที่ซ้ำกันซึ่งทำงานได้ดี แต่ข้อความแสดงข้อผิดพลาดที่เกิดขึ้นแสดงให้ผู้ใช้เมื่อพวกเขาพยายามที่จะเพิ่มรายการที่ซ้ำกันน่าจะเป็นปัญหาด้านความปลอดภัยเช่นกัน คำนำหน้าตาราง

มีวิธีหยุด Joomla ไม่ให้แสดง SQL ในข้อความข้อผิดพลาดหรือไม่

ฉันได้ลองเปลี่ยนการตั้งค่าการรายงานข้อผิดพลาดในการกำหนดค่าทั่วโลก แต่ไม่มีผลเท่าที่ฉันสามารถบอกได้ ...

ข้อความตัวอย่าง:

ความผิดพลาด

การบันทึกล้มเหลวด้วยข้อผิดพลาดต่อไปนี้: รายการซ้ำ 'ทดสอบ' สำหรับคีย์ 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id ', `col1`,` ลำดับ', `state ',` created_by`) ค่า (0') 'ทดสอบ', '2', '1', '730')


1
ฉันใหม่สำหรับ Joomla แต่คุณเข้าใจถูกต้องข้อผิดพลาดใด ๆ ของ userland ในสภาพแวดล้อมการผลิตไม่ควรมี SQL ใด ๆ ไม่เพียงเพื่อความปลอดภัย แต่เป็นเพราะผู้ใช้ไม่มีความหมายและมอบประสบการณ์ผู้ใช้ที่ไม่ดี ในสภาพแวดล้อมการผลิตdisplay_errors(การตั้งค่า PHP) ควรปิดและข้อผิดพลาดดังกล่าวควรถูกบันทึกลงในบันทึกข้อผิดพลาดฝั่งเซิร์ฟเวอร์ของคุณเท่านั้น
MrWhite

แค่อยากรู้อยากเห็นคุณอาจตรวจสอบแล้ว แต่คุณไม่ได้เปิดใช้งานการตั้งค่าการดีบักใด ๆ ? ตรวจสอบ: การกำหนดค่าโกลบอล> การดีบักระบบ ตรวจสอบ: Global Config> ระดับการรายงานข้อผิดพลาด ตรวจสอบ: ปลั๊กอิน> ตรวจแก้จุดบกพร่องปลั๊กอินอยากรู้อยากเห็นถ้าคุณมีอะไรแปลก ๆ เกิดขึ้น ฉันถามเพราะฉันกำลังอ่านสิ่งนี้เรียนรู้. heartofjoomla.com/developing-extensions/ …
Chad Windnagle

@ChadWindnagle Hi ชาดใช่ฉันพยายามเปลี่ยนว่าในวันที่ปิด แต่ไม่มีผล ...
doovers

ขออภัยเพิ่งแก้ไขคุณสามารถแจ้งให้เราทราบว่าคุณเห็นเนื้อหาที่อัปเดตหรือไม่ ขอบคุณ!
Chad Windnagle

@ChadWindnagle ไม่ฉันไม่เห็นการแก้ไขของคุณ! ฉันลองรายงานข้อผิดพลาด แต่ฉันลืมเกี่ยวกับการปิดใช้งานปลั๊กอิน (ขอบคุณสำหรับเคล็ดลับ) ที่ฉันเพิ่งลองตอนนี้ แต่ก็ยังไม่มีผล!
doovers

คำตอบ:


6

บางทีคุณสามารถใช้คำสั่ง try catch:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}

ขอบคุณสำหรับคำแนะนำ แต่เนื่องจากฉันใช้วิธีJTableที่ดีที่สุดก็คือแทนที่checkวิธีดังกล่าวในคำตอบของฉัน
doovers

นี่เป็นคำตอบที่ดี
David Addoteye

3

เนื่องจากไม่สามารถป้องกันพฤติกรรมนี้ได้ฉันจึงใช้วิธีแก้ไขปัญหาต่อไปนี้ เพิ่มการตรวจสอบซ้ำเพื่อJTable checkแทนที่วิธีการ:

// Check for duplicate entry
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('COUNT(*)');
$query->from($this->get('_tbl'));
$query->where($db->quoteName('col1') . ' = ' . $db->quote($this->col1));

$db->setQuery($query);
$result = $db->loadResult();

if ($result) 
{
    $this->setError(" Duplicate entry for col1 = '" . $this->col1 . "'");
    return false;            
}

1

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


ใช่ฉันคิดว่าฉันอาจต้องทำอย่างนั้น แต่ฉันก็ยังกังวลว่า Joomla ยินดีที่จะแสดง SQL ในข้อความแสดงข้อผิดพลาดที่ปรากฏแก่ผู้ใช้ แน่นอนว่านี่เป็นปัญหาด้านความปลอดภัย? ฉันคิดว่าจุดรวมของคำนำหน้าตารางแบบสุ่มนั้นเป็นมาตรการรักษาความปลอดภัยใช่ไหม บางทีวิธีปฏิบัติที่ดีที่สุดคือจัดการข้อผิดพลาดของคุณเอง แต่อาจมีสถานการณ์ที่คุณไม่สามารถคาดการณ์ได้ ... ดูเหมือนจะแปลกสำหรับฉัน!
doovers

เอาล่ะ Joomla! ไม่แสดงข้อความข้อผิดพลาด SQL แก่ผู้ใช้รหัสของคุณทำ
Ivo

ฉันไม่เห็นด้วยรหัสของฉันไม่แสดงข้อความแสดงข้อผิดพลาด แต่อนุญาตให้ Joomla core code แสดง ในความคิดของฉันรหัสหลักไม่ควรแสดงคำนำหน้าตารางในกรณีใด ๆ เพราะมันเป็นเรื่องความปลอดภัย ...
doovers

ทำไมคุณไม่ใช้ INSERT IGNORE แทนที่จะเป็น INSERT?
Ivo

คำแนะนำที่ดีและฉันสามารถทำได้ แต่เนื่องจากฉันใช้JTableฉันจะมีแนวโน้มที่จะแทนที่checkวิธีการและทดสอบซ้ำที่นั่น ฉันต้องการแสดงข้อความแสดงข้อผิดพลาดแก่ผู้ใช้ไม่ใช่แค่ใช้ SQL ในนั้น!
doovers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.