ฉันจะทำให้โปรแกรมเมอร์หยุดเขียนโค้ดที่เสี่ยงต่อการฉีด SQL ได้อย่างไร


11

บางครั้งคุณก็ยุ่งและมอบหมายงานเล็ก ๆ ให้โปรแกรมเมอร์อาวุโส แต่ถ้าคุณไม่ใส่ใจอย่างใกล้ชิดคุณจะพบว่าตัวเองใช้โค้ดประเภทนี้ในการผลิต:

class DivtoggleController extends Zend_Controller_Action {

    public function closeAction() {
        /* ... code removed for brevity ... */

        $req = $this->getRequest();
        $formData = $req->getPost();

        $d = $formData['div'];
        $i = $formData['id'];

        $dm = new Model_DivtoggleManager();
        $rs = $dm->setDivToggleById($d, $i);

    }

}


class Model_DivtoggleManager extends Zend_Db_Table {

    public function setDivToggleById($div, $id) {
        $result = $this->getAdapter()->query(
           "update div_toggle set " . $div . "=1 where id=" . $id
        );
    }

}

ดังนั้นเนื่องจากฉันได้ลบตรรกะการจัดการการรับรองความถูกต้อง / เซสชันเพื่อความกะทัดรัดใครจะบอกได้ว่ามีปัญหาอะไรที่เป็นไปได้ในตัวอย่างนี้?


เหตุใดจึงไม่เก็บในคุกกี้อย่างง่าย
Darknight

1
@Darknight คุณกำลังสมมติว่ามีเซสชันที่จะจัดเก็บคุกกี้ ไม่ว่าจะมีหรือไม่เกี่ยวข้องกับปัญหาความปลอดภัยที่ใหญ่กว่า
Roger Halliburton

คำตอบ:


24

คุณสามารถสอนพวกเขา ทุกคนทำสิ่งนี้ตั้งแต่แรกแม้แต่คุณ หากรหัสประเภทนี้ทำให้การผลิตเป็นความผิดปกติของผู้อาวุโส ไม่ใช่รุ่นน้อง

แก้ไข:

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


2
+1 ต้องยอมรับ คุณไม่สามารถตำหนิโปรแกรมเมอร์จูเนียร์ (สมมุติ) เพราะคุณได้สันนิษฐานว่าเป็นระดับความรู้ที่พวกเขาอาจไม่มี (ที่กล่าวว่าคุณจะชอบที่จะคิดว่าปัญหาดังกล่าวเป็นที่รู้จักกันดีในวันนี้และอายุแล้วอีกครั้งฉัน. ชอบที่จะคิดว่าผมเป็นคนที่มีความสามารถและดูดี ฯลฯ ) :-)
จอห์นปาร์กเกอร์

คำสั่งที่ยุติธรรมพอ ฉันเดาว่าฉันควรถามคำถามติดตามถามว่าทำไมผู้บริหารยืนยันที่จะเปิดตัวโค้ดในการผลิตที่ไม่ได้รับการอนุมัติจากโปรแกรมเมอร์อาวุโส ฉันเสี่ยงต่องานของฉันในเรื่องความปลอดภัยเล็กน้อยหรือไม่?
Roger Halliburton

1
@Roger Halliburton: ถ้าปัญหาความปลอดภัยนั้นถูกเอาเปรียบใครจะเกิดอะไรขึ้นที่เลวร้ายที่สุด? และทำไมการชี้ให้เห็นถึงปัญหาด้านความปลอดภัยจึงทำให้คุณต้องเสียเงิน ผู้บริหารไม่ต้องการจัดการกับสิ่งนี้หรือไม่?
FrustratedWithFormsDesigner

1
@Roger - เป็นเพียงเล็กน้อยเท่านั้นจนกว่าคุณจะถูกแฮ็ก :) ฉันคิดว่าการใส่รหัสในการผลิตโดยไม่ต้องมีการตรวจสอบ (ไม่ว่าระดับนักพัฒนาซอฟต์แวร์) จะเป็นอย่างไร น่าเสียดายที่มันเป็นเรื่องธรรมดาในหลาย ๆ บริษัท และก่อนอื่นผู้บริหารมักจะให้ความสำคัญกับโอ้ - $ 4!
John Kraft

1
@Roger: โค้ดทั้งหมดควรได้รับการตรวจสอบไม่ใช่แค่โค้ดที่เขียนโดยโปรแกรมเมอร์ "junior" แม้แต่โปรแกรมเมอร์อาวุโสก็ทำผิดพลาด
Dean Harding

20

แฮ็กรหัสของพวกเขาต่อหน้าต่อตาพวกเขาแล้วแสดงวิธีการแก้ไข ซ้ำไปซ้ำมาจนกว่าพวกเขาจะเข้าใจ


4
ส่งอีเมลถึงพวกเขาทุกเช้า: "อย่างไรก็ตามฉันทิ้งฐานข้อมูลของคุณอีกครั้งเมื่อคืนนี้ผ่านช่องโหว่การฉีด SQL อื่นที่คุณทิ้งไว้ในรหัสของคุณฉันรู้ว่าคุณชอบการคืนค่าการสำรองฐานข้อมูล!: D"
Ant

2
@Ant: เป็นคนดี ทำไม่นานหลังจากการสำรองข้อมูลตามกำหนดเวลาไม่นานก่อน
Donal Fellows

@ Donal: ทำหลังจากการสำรองข้อมูลไม่นานจากนั้นแจ้งให้พวกเขาทราบว่าการสำรองข้อมูลล้มเหลวและปล่อยให้พวกเขาเหนื่อยตลอดทั้งวันก่อนที่จะกู้คืนข้อมูลสำรองในชั่วข้ามคืน
jwenting

8

คุณสามารถสั่งให้พวกเขาเข้าเรียนได้ทันทีที่พวกเขาเข้าร่วม บริษัท ของคุณก่อนที่พวกเขาจะสามารถเข้าถึงแหล่งการควบคุมที่แนะนำให้พวกเขารู้จักกับ SQL injections, การเขียนสคริปต์ข้ามไซต์, การปลอมแปลงคำขอข้ามไซต์และช่องโหว่อื่น ๆ ครอบคลุมตัวอย่างแบบเห็นหน้าทำลายรหัสที่ไม่ดีต่อหน้าให้พวกเขาแบ่งรหัสที่ไม่ดีและนำพวกเขาไปยังไซต์ OWASP เพื่อรับข้อมูลเพิ่มเติมเมื่อพวกเขา "สำเร็จการศึกษา"

นอกจากนี้คุณยังสามารถสั่งการใช้งานไลบรารีแบบกำหนดเองที่จัดการสิ่งนี้ให้กับคุณได้ แต่นี่เป็นเพียงวิธีการแก้ปัญหารองเนื่องจากพวกเขาจะต้องเรียกใช้คิวรีแบบกำหนดเองเมื่อสะดวกยิ่งขึ้น

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

ความรู้คือพลัง!


3
กำจัดพวกเขาออกก่อนที่จะเข้าร่วม บริษัท ของคุณดีกว่า หากคุณกำลังจ้างใครบางคนให้เขียนอะไรก็ตามที่ใช้ SQL อย่าถามคำถามสัมภาษณ์เกี่ยวกับการฉีดเส้นขอบเมื่อไร้ความสามารถ
Wooble

โดยทั่วไปฉันจะเห็นด้วย แต่การจ้างรุ่นน้องที่ฉลาดและมีความทะเยอทะยานนั้นมากราคาถูกกว่า "ผู้พัฒนา PHP ที่มีประสบการณ์ N ปี" ซึ่งไม่ได้รับประกันว่าจะดีกว่านี้มากนัก Smart junior devs สามารถเลือกสิ่งนี้ได้อย่างรวดเร็วและเป็นทรัพย์สิน
yan

3

สมมติว่ามันเป็นความไม่ปลอดภัยที่คนอื่น ๆ ได้อ้างถึงในฐานะนักพัฒนาทุกระดับมันง่ายที่จะลืมว่า getPost () ไม่ได้รักษาความปลอดภัยของข้อมูลก่อน

วิธีหนึ่งในการทำสิ่งนี้คือ:

  1. เขียนคลาสที่รับข้อมูล POST / GET ทั้งหมดและเขียนเป็นคลาสเดียวที่เรียกว่า 'insecure_data' จากนั้นล้างอาร์เรย์ POST / GET
  2. นักพัฒนากว่าต้องดึงข้อมูล POST / GET จากอาร์เรย์ 'insecure_data' ไม่ใช่อาร์เรย์ POST / GET

นักพัฒนาใด ๆ ที่ดึงข้อมูลบางอย่างจากอาเรย์ที่เรียกว่า 'insecure_data' และไม่ต้องกังวลว่ามันจะปลอดภัยหรือไม่ก็ขี้เกียจ หากเป็นอดีตให้ฝึกอบรมหลังจากนั้นจะต้องเป็นหลัง - แล้วคุณมีปัญหาทางวินัยไม่ใช่การเขียนโปรแกรมหนึ่ง


ว้าวนั่นเป็นเรื่องที่ไม่จำเป็นและยังไม่สามารถแก้ปัญหาได้ มันไม่ใช่เรื่องของการขัดข้อมูลให้สนุก แต่การขัดข้อมูลที่คุณใส่ลงในฐานข้อมูลและข้อมูลนั้นในทางทฤษฎีอาจมาจากที่ใดก็ได้จากเว็บฟอร์มหรืออีเมลหรือเอกสาร XML ที่ บางคนอัปโหลด ในทุกกรณีคุณจะต้องทำการขัดเมื่อไปที่ฐานข้อมูล
Roger Halliburton

@RogerHalliburton แน่นอนว่ามันไม่ได้แก้ปัญหาทุกอย่าง แต่มันเป็นแนวคิด (รูปแบบของการออกแบบหากคุณต้องการ) แทนที่จะใช้มาตรการรักษาความปลอดภัยที่มีเนื้อแน่นเพื่อให้ข้อมูลที่ไม่ปลอดภัยดูไม่ปลอดภัย
Dan Blows

อ่าฉันเข้าใจแล้ว แต่คุณเป็นเพียงการต่อสู้กับธรรมชาติของมนุษย์ถ้าคุณบอกใครบางคน "วัตถุนี้ไม่ปลอดภัยเว้นแต่ว่ามันจะถูกตั้งค่าสถานะว่าปลอดภัย" และพวกเขาพยายามที่จะใช้มันเพื่ออะไรบางอย่างส่วนใหญ่เวลาที่พวกเขาจะตั้งค่าสถานะว่าปลอดภัย เพลิดเพลินไปกับการเพิ่มชื่อเสียง
Roger Halliburton

จากมุมมองของนักพัฒนารุ่นเยาว์เพียงแค่เห็น $ insecure_data ทำให้เกิดสถานะในลักษณะที่เพิ่งเห็น $ postdata (หรืออะไรก็ตาม) ไม่ได้ ความคิดที่มาจากโจ Spolsky ของ"Make รหัสผิดพลาดที่ไม่ถูกต้องดู" หากธรรมชาติของนักพัฒนาซอฟต์แวร์ของคุณนั้นไม่สนใจธงสีแดงนั้นคุณต้องฝึกอบรมอย่างมากหรือรับนักพัฒนาใหม่
Dan Blows

ฉันไม่เก็บ Spolsky ไว้บนแท่น นักพัฒนาซอฟต์แวร์เหล่านี้ที่ไม่สนใจการทำแท็บที่ไม่สอดคล้องกันอย่างง่ายดายพวกเขาจะไม่คิดอีกสองครั้งเกี่ยวกับการใช้สิ่งที่มีชื่อว่า "ไม่ปลอดภัย"
Roger Halliburton

1

หนึ่งในคำแนะนำที่ดีที่สุดที่ฉันได้อ่านเกี่ยวกับความปลอดภัยของเว็บคือคู่มือความปลอดภัยRuby on Rails แม้ว่าจะเป็น Ruby on Rails แต่มีแนวคิดมากมายที่นำไปใช้กับการพัฒนาเว็บใด ๆ ฉันอยากจะแนะนำให้ทุกคนใหม่เพื่อให้คำแนะนำการอ่าน


2
ทุกคนรู้ว่าทับทิมไม่ปลอดภัย
Roger Halliburton

5
@ Roger:“ ทุกคนรู้” ทุกสิ่งที่อาจจะจริงหรือไม่จริง ฉันสนับสนุนวิธีการเขียนโปรแกรมตามความเป็นจริงไม่ใช่วิธีบอกเล่า
Donal Fellows

0

รหัสที่คุณเชื่อมโยงข้างต้นนั้นไวต่อการถูกโจมตีจากการฉีด SQL เนื่องจากอินพุต HTTP ที่คุณใช้ในการสืบค้นยังไม่ได้รับการทำความสะอาดด้วยmysql_real_escape_stringวิธีการอื่น ๆ


1
โอ้ฉันคิดว่าเรากำลังตอบคำถามนี้เหมือนคำถามทดสอบ:]
ไรอัน

Downvotes ค่อนข้างง่อยเนื่องจากถ้อยคำของคำถามถูกเปลี่ยนจากการโพสต์อดีต: P
Ryan

0

ในแง่ของคำถามที่ถามว่า "ฉันจะให้โปรแกรมเมอร์หยุดทำสิ่งนี้ได้อย่างไร" ฉันจะบอกว่าให้คำปรึกษาพวกเขาเป็นประจำอธิบายอย่างถี่ถ้วนถึงปัญหา (และความเป็นไปได้ที่จะเกิดปัญหา ฯลฯ ) และเน้นย้ำ ความสำคัญของรหัสช่องโหว่ (ทั้งในแง่ของการฉีด SQL และการเขียนสคริปต์ข้ามไซต์เป็นต้น) อาจเป็นทางออกที่เหมาะสมที่สุด

หากพวกเขายังคงเลอะเทอะแม้จะมีทั้งหมดข้างต้น (คุณอาจต้องการที่จะจับตามองความมุ่งมั่นของพวกเขา ฯลฯ แทนที่จะค้นหา "สด") แล้วปัญหาก็คือว่าคุณล้มเหลวพวกเขาในฐานะที่ปรึกษาหรือ พวกเขาอาจต้องหาสิ่งที่เหมาะสมกว่าสำหรับทำมาหากิน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.