ทำไมการป้องกัน SQL injection ไม่ให้ความสำคัญสูง?


39

ใน Stack Overflow ฉันเห็นโค้ด PHP จำนวนมากในคำถามและคำตอบที่มีคำสั่ง MySQL ที่มีความเสี่ยงสูงต่อการถูกโจมตีจากการฉีด SQL แม้ว่าจะมีวิธีการพื้นฐานที่ใช้กันอย่างแพร่หลายมานานกว่าทศวรรษ

มีเหตุผลหรือไม่ที่ข้อมูลโค้ดประเภทนี้ยังใช้อยู่ในปัจจุบัน?


37
ตำหนิมันในบทเรียนออนไลน์ที่เขียนไม่ดี บ่อยครั้งที่ผู้คนเพียงแค่คัดลอกและวางรหัสที่พวกเขาพบบนอินเทอร์เน็ต จาวาสคริปต์ยังเป็นเหยื่อของการปฏิบัติเช่นนี้อีก
KJYe.Name

34
ตำหนิบล็อก โอ้และ W3Schools ...
Brian Driscoll

13
ใช่ W3Schools อย่างแน่นอน - ดูw3fools.com
DisgruntledGoat

2
ฉันเห็นคนเตือนเกี่ยวกับการฉีด sql อย่างต่อเนื่อง - ดังนั้นฉันไม่คิดว่าหลักฐานของคำถามนี้จะถูกต้อง มันเป็นลำดับความสำคัญสูง
GrandmasterB

3
สิ่งที่ฉันเห็นในคำตอบมากมายก็คือมันง่ายกว่าที่จะสอน PHP ที่มีค่ามากกว่าการสอน, PHP ที่ไม่ได้เป็นช่วงที่สำคัญ คุณไม่สามารถยอมรับข้อโต้แย้งนั้นและยังคงอ้างว่า PHP ไม่ใช่ภาษาที่ไม่ดี
user16764

คำตอบ:


34

ฉันคิดว่าส่วนใหญ่มาจาก a) ความไม่รู้ข) ความเกียจคร้าน ผู้เริ่มต้นมักไม่ค่อยรู้เรื่องการฉีด sql และแม้ว่าพวกเขาจะได้ยินเรื่องนี้พวกเขาก็ไม่สนใจเพราะมันง่ายและง่ายกว่าในการเขียนโค้ดด้วยวิธีนี้


8
ฉันพยายามแก้ไขสิ่งต่าง ๆ ที่อื่นเพื่อบอกว่ามันไม่เกี่ยวข้องกับปัญหาที่เกิดขึ้น ดังนั้นเนื่องจากผู้คนจำนวนมากต้องการแฮ็คธรรมดาเพื่อแก้ปัญหาที่ดีกว่าที่ซับซ้อนกว่าเล็กน้อยตัวอย่างที่ไม่ดีจึงถูกทิ้งให้อยู่คนเดียว
l0b0

6
คนส่วนใหญ่ไม่สนใจการฉีด SQL จนกว่าพวกเขาจะได้รับผลกระทบ ทันใดนั้นพวกเขาก็สงสัยว่าโต๊ะของพวกเขาไปไหน
Joel Etherton

1
เหตุผลอื่นคือการฉีด SQL ไม่ได้ถูกมองว่าเป็นเรื่องที่เกี่ยวข้องสำหรับแอพภายในเสมอไป (ไม่ใช่ว่ามันถูกต้อง)
John Fisher

1
อย่าลืมว่าคำตอบอยู่ที่นั่นเพื่อตอบคำถาม บ่อยครั้งที่มันเป็นรหัสหลอก (หรือ SQL) ที่มีวัตถุประสงค์เพื่อตอบคำถามไม่จำเป็นต้องให้โซลูชันการคัดลอกและวางที่ปลอดภัย
Dalin Seivewright

1
@ l0b0 ฉันรู้ว่ามีคนที่ทำให้คนใช้การแก้ไขการฉีด SQL อย่างจริงจังโดยแสดงให้เห็นถึงการโจมตีแบบฉีด SQL กับรหัสการผลิตปัจจุบัน
user16764

26

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

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

กลุ่มดาวที่แน่นอนของปัญหาที่ใช้ในการก่อกวน Perl ตัวอย่างที่น่าสนใจลองพิจารณากรณีของ Matt Wright วัยรุ่นที่กระตือรือร้นซึ่งตั้งค่าไว้เพื่อให้สคริปต์ CGI ที่มีประโยชน์มากมายมีเอกสารที่ดีและง่ายต่อการติดตั้งในปี 1990 น่าเสียดายที่เขาไม่เข้าใจเรื่องความปลอดภัยและคนที่ต้องการใช้สิ่งของของเขาก็ไม่ได้ ผลที่ได้คือจดหมายเหตุของ Matt Wright ซึ่งเป็นปัญหาด้านความปลอดภัยที่ไม่มีที่สิ้นสุดสำหรับสคริปต์ CGI ยุคแรก แม้จะมีความพยายามเช่นhttp://www.scriptarchive.com/nms.htmlปัญหาไม่ได้ปรับปรุงสำหรับ Perl จนกว่าผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันจะทำให้ PHP สะดวกกว่าสิ่งอื่นใด ทำให้เกิดปัญหาในการย้ายจาก Perl เป็น PHP


ดังที่คุณกล่าวว่าปัญหาไม่ได้เป็น Perl หรือ PHP ซึ่งภาษาเหล่านี้ให้ผู้เริ่มต้นทำสิ่งต่างๆมากมายซึ่งเป็นสิ่งที่ดี แต่ไม่ได้ให้วิธีการที่จะทำให้พวกเขาเป็นอย่างดี
Zachary K

2
@ ZacharyK: นั่นไม่ใช่ความผิดของภาษาหรือเปล่า
การแข่งขัน Lightness กับ Monica

6
@ tomalak-geretkal: คุณใช้คำว่า "ความผิดพลาด" ราวกับว่าทำให้มันเป็นไปได้ที่จะทำสิ่งต่าง ๆ เป็นสิ่งที่ไม่ดี ลักษณะเดียวกันกับที่นำไปสู่รหัสที่ไม่ดีจำนวนมากยังนำไปสู่การแก้ไขปัญหาจริงมากมาย ไม่ชัดเจนว่านี่เป็นสิ่งที่ไม่ดีในภาพรวม
btilly

เรื่องความผิด ': ถ้า HTML (หรือมากกว่าเบราว์เซอร์ตีความมัน) ได้รับเป็นใจกว้างผิดเป็น XSL ก็ไม่เคยได้รับเว็บทั่วโลก ...
Benjol

8

แต่น่าเสียดายที่มีตันมากขึ้นกว่าที่เลวร้ายบทเรียน PHP ออกมีและหนังสือ PHP เก่ายังดูดที่บอกคนที่จะเขียนโค้ดที่เหมาะสม (ไม่ได้ใช้ register_globals ฯลฯ )

นอกจากนี้เมื่อmagic_quotes_gpcเปิดใช้งานในอดีตผู้คนไม่สนใจที่จะหลบหนีเพราะ "มันใช้งานได้"


4

ส่วนตัวผมเชื่อว่า PHP นั้นใช้งานง่ายดังนั้นโดยธรรมชาติแล้วมันง่ายต่อการใช้งานในทางที่ผิด


2

ในฐานะมนุษย์และโปรแกรมเมอร์ฉันพบว่ามันง่ายที่จะทำผิดพลาดและมองข้ามสิ่งต่าง ๆ โดยเฉพาะอย่างยิ่งเมื่อถูกกดลงเวลา

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

ได้รับเรามาไกลตั้งแต่ภาษาแอสเซมบลีและฉันคิดว่าฉันจะเขียนโปรแกรมที่มีประสิทธิผลมากขึ้นในภาษาที่ทันสมัยกว่าเช่น PHP, Python, Ruby หรือ Java

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

Rasmus Lerdorf สร้าง PHP ในรูปแบบดั้งเดิมในปี 1994 มันมีการพัฒนาอย่างมากตั้งแต่นั้นมา ในรูปแบบที่ทันสมัยที่สุดรองรับการเขียนโปรแกรมเชิงวัตถุรวมถึงเฟรมเวิร์กที่ยอดเยี่ยมเช่น Symfony PHP เป็นภาษาที่ปราศจากข้อ จำกัด ดั้งเดิมและเติบโตขึ้นเพื่อให้ความยืดหยุ่นอย่างมากในการที่โปรแกรมเมอร์สามารถเลือกใช้มันได้ คุณสามารถใช้มันเพื่อสร้างสคริปต์บรรทัด 9,000 บรรทัดของสปาเก็ตตี้หรือคุณสามารถใช้มันในบริบทของกรอบ MVC ที่ทันสมัยเช่น Symfony: เป็นทางเลือกของคุณ!

ฉันสงสัยอย่างยิ่งว่าช่องโหว่ด้านความปลอดภัยไม่ได้ จำกัด อยู่เพียงภาษาเดียว การเขียนโปรแกรมเมอร์ PHP ทุกตัวนั้นมีความสามารถน้อยกว่าหรือมีแนวโน้มที่จะเขียนโค้ดที่ไม่ปลอดภัย แต่ฉันสงสัยว่ามันมีอคติด้านภาษามากแค่ไหน


ฉันไม่ได้พูดอะไรเกี่ยวกับ "โปรแกรมเมอร์ PHP ทั้งหมด"
การแข่งขัน Lightness กับโมนิก้า

2

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

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

  1. นี่คือวิธีที่คุณตั้งค่าหน้าเว็บพื้นฐาน
  2. นี่คือวิธีที่คุณจัดทำเว็บเพจดึงข้อมูลจากฐานข้อมูล
  3. นี่คือวิธีที่คุณส่งข้อมูลจากเว็บเพจไปยังฐานข้อมูล
  4. นี่คือวิธีที่คุณตรวจสอบให้แน่ใจว่ามีการส่งข้อมูลที่ถูกต้อง
  5. นี่คือวิธีที่คุณปกป้องฐานข้อมูลของคุณจากการป้อนข้อมูลที่เป็นอันตราย

นั่นเป็นวิธีที่ฉันสอน php +1 มากขึ้นหรือน้อยลง
Rémi

1

ฉันคิดว่าคุณจะพบตัวอย่าง MS SQL + ASP / ASP.NET จำนวนใกล้เคียงที่มีความเสี่ยง

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

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


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

แน่นอนในการกำหนดพารามิเตอร์โลกของ. NET นั้นค่อนข้างตรงไปตรงมาทุกวันนี้และแน่นอนควรเป็น 'หน้าแรก'
Alan B

1

ผู้เขียนต้นฉบับของ PHP, Rasmus Lerdorfในรายการบล็อกที่น่าอับอายของเขาสนับสนุน "ไม่มีกรอบ"การพัฒนา แม้ว่าแบบสอบถาม SQL จะใช้ PDO ดังนั้นจึงไม่มีความเสี่ยงในการฉีด SQL ยังค่อนข้างน่าเกลียดและล้าสมัยเมื่อเทียบกับกรอบ MVC สมัยใหม่ที่มีเลเยอร์ ORMs


5
แน่นอนว่าเป็นไปได้ที่ไซต์ที่มีวิศวกรมากเกินไปด้วยเฟรมเวิร์กที่ซับซ้อนที่คุณไม่ต้องการ ฉันขอบอกว่าคำแนะนำของ Rasmus เกือบจะเป็นอันตรายต่ออาชญากร
การแข่งขัน Lightness กับ Monica

ทุกวันนี้การใช้ ORM ไม่ใช่เรื่องของวิศวกรรมมากเกินไป มันเป็นมาตรฐาน ดังนั้นใช้รูปแบบ MVC
vartec

3
@vartec: มันเป็น "มาตรฐาน" แทบจะไม่ได้เพราะแกะทุกตัวใช้มันอยู่ (และสำหรับสิ่งที่มันคุ้มค่าไม่ใช่แกะทุกตัวที่ใช้มัน) สำหรับสคริปต์ขนาดเล็กมันง่ายเกินความเป็นวิศวกรรม
การแข่งขัน Lightness กับ Monica

1
@ Tomalak: มันเป็นมาตรฐานเพราะนั่นคือวิธีการดำเนินโครงการที่สะอาดและยั่งยืน "สคริปต์ตัวเล็ก" มีแนวโน้มที่จะเติบโตขึ้นเมื่อเวลาผ่านไปและกลายเป็นสิ่งที่ไร้ค่า
vartec

2
@vartec: ฉันคิดว่าคุณเข้าใจผิดความหมายของ "มาตรฐาน"
การแข่งขัน Lightness กับ Monica

1

คุณสามารถตำหนิการปฏิบัติที่ไม่ดีนี้ใน PHP เอง PHP รุ่นเก่า (จนถึงประมาณปี 2549) จะหลีกเลี่ยงตัวแปรอินพุต GET และ POST ทั้งหมดเพื่อให้เหมาะสมสำหรับการแก้ไขแบบสอบถามฐานข้อมูลตามค่าเริ่มต้น ดูhttp://php.net/manual/th/security.magicquotes.php


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

0

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


3
ขออภัย แต่ไม่มีตัวอย่างรหัสใด ๆ เลยที่ควรผสมการสืบค้น mySQL เข้ากับ PHP นั่นเป็นเพียงการทำผิด
Raynos

1
และขาดความรับผิดชอบ
การแข่งขัน Lightness กับโมนิก้า

most tutorial code I have written has little or no error/exception checking.-1
yannis

ฉันเห็นจุดของ OP ขาดความรับผิดชอบคือเมื่อนายจ้างว่าจ้างคนที่ขาดความรู้เกี่ยวกับการฉีด SQL และสิ่งที่คล้ายกัน
Raffael

ฉันคิดว่าวิธีการนี้จะป้องกันได้ถ้าคุณใส่ความคิดเห็นลงในรหัสโดยตรงว่า "อย่าใช้วิธีนี้ในการผลิต!" ด้วยวิธีการคัดลอก / paster ไม่มีข้อแก้ตัว
Benjol

-1

เมื่อฉันเรียนรู้ PHP ฉันดูหนังสือ PHP + MySQL เหล่านี้และใช่ฉันรู้สึกว่ามันมีส่วนช่วยในการปฏิบัติที่ไม่ดี แต่ฉันมีความเห็นอกเห็นใจเพราะพวกเขากำลังสอนภาษาไม่ใช่วิธีการเขียนโปรแกรมที่ดี ไม่งั้นมันจะจบที่ไหน?


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

ใช่จุดดี เชิงอรรถจะเป็นตัวเตือนที่ดีและนั่นก็เป็นบทเรียนออนไลน์เช่นกัน ในทุกเรื่องที่ร้ายแรงมันคงจะดีถ้าผู้เขียนหนังสือทุกภาษาสามารถรวมคำแนะนำจาก OWASP ลงในตำราผู้เริ่มต้นได้ แม้เป็นการอ้างอิง มูลนิธิ OWASP ทำงานได้ดี
Steve Rathbone

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