PHP codeigniter SQL Injection (MSSQL) [ซ้ำกัน]
ฉันได้รับรายงานแสดงข้อความค้นหาของฉันมีการแทรก SQL ต้องการความช่วยเหลือจากคุณในการตรวจสอบปัญหา:
- ฉันใช้สิ่งนี้เป็นคำสั่งแทรก
function insert($table_name, $insert_data)
{
$this->db->set($insert_data);
if ($this->db->insert($table_name)) {
return TRUE;
} else {
return FALSE;
}
}
สำหรับ exmaple:
$name = 'iamklll'; $status = 1;
$insert_data = array( 'name' => $name,
'status' => $status, ); $this->model->insert('table', $insert_data);
วิธีการแบบนี้ไม่สามารถป้องกันการฉีด SQL ได้? หากสิ่งนี้ไม่สามารถป้องกันได้ฉันคิดว่าวิธีที่ดีที่สุดคือการเชื่อมโยงแบบสอบถาม?
ฉันจะป้องกันการแทรก SQL ได้อย่างไรหาก $ POST ['column'] เป็นอาร์เรย์
จะเก็บข้อมูลยังไงให้เหมือนคนแทรก
test"><h1>eee</h1>? ฉันควรใช้htmlspecialcharsเพื่อจัดเก็บในฐานข้อมูลหรือไม่?
คำตอบ
ในกรณีของคุณคุณกำลังใช้ตัวสร้างแบบสอบถาม $ this-> db-> insert () สิ่งนี้จะสร้างสตริงแทรกตามข้อมูลที่คุณจัดหาและเรียกใช้แบบสอบถาม คุณสามารถส่งอาร์เรย์หรือวัตถุไปยังฟังก์ชัน ค่าทั้งหมดจะถูกหลีกเลี่ยงโดยอัตโนมัติทำให้เกิดการสืบค้นที่ปลอดภัยขึ้น
นี่เป็นตัวเลือกที่ดีที่สุดในความคิดของฉัน ดีกว่าการใช้การเชื่อมแบบสอบถามโดยเฉพาะอย่างยิ่งเนื่องจากในระยะยาวคุณอาจต้องเปลี่ยนจาก MSSQL เป็น mySQL หรือเอ็นจิ้นอื่น ๆ และคุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในโค้ดของคุณ
เนื่องจากคุณใช้ Codeigniter 3 อย่าลืมตรวจสอบความถูกต้องของข้อมูลก่อนที่จะแทรก
ใช้การตรวจสอบแบบฟอร์มสำหรับสิ่งนั้น: https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation
จากตัวอย่างของคุณฉันคิดว่าคุณกำลังอ้างถึงการโจมตี xxs ในกรณีนี้คุณมีสองตัวเลือกคุณสามารถทำได้ในขณะที่ตรวจสอบความถูกต้องของข้อมูลด้วยการตรวจสอบความถูกต้องของแบบฟอร์มโดยใช้กฎ XSS หรือคุณสามารถเปิดใช้งานได้ทั่วโลกใน application / config / config.php ของคุณ
$config['global_xss_filtering'] = true;
เนื่องจากเรากำลังพูดถึงการปกป้องแอปของคุณคุณอาจต้องการพิจารณาใช้การตั้งค่า csrf ใน codeigniter ซึ่งสามารถทำได้ในไฟล์ config.php ของคุณ
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
*/
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();
ดังนั้นในกรณีของคุณการใช้ตัวสร้างคิวรีจึงเป็นการดีที่จะป้องกันการแทรก SQL นั่นคือสิ่งที่คุณต้องการจริงๆ
คุณกำลังอ้างถึงคลาส Active Record มีตัวสร้างแบบสอบถามของตัวเองและควรปกป้องคุณจากการแทรก SQL จากกล่อง
How to store the data as if the person insert test"><h1>eee</h1>
ฉันคิดว่าคุณกำลังอ้างถึงการโจมตี XSS ผมเชื่อว่าการปฏิบัติที่ดีที่สุดที่จะไปดึงออกจากแท็กทั้งหมดยกเว้นแท็กที่อนุญาต ฉันไม่คิดว่าhtmlspecialcharsจะสมเหตุสมผลมากที่นี่ในขณะที่คุณกำลังจะแปลงผลลัพธ์แบบย้อนกลับ