ใน Stack Overflow ฉันเห็นโค้ด PHP จำนวนมากในคำถามและคำตอบที่มีคำสั่ง MySQL ที่มีความเสี่ยงสูงต่อการถูกโจมตีจากการฉีด SQL แม้ว่าจะมีวิธีการพื้นฐานที่ใช้กันอย่างแพร่หลายมานานกว่าทศวรรษ
มีเหตุผลหรือไม่ที่ข้อมูลโค้ดประเภทนี้ยังใช้อยู่ในปัจจุบัน?
ใน Stack Overflow ฉันเห็นโค้ด PHP จำนวนมากในคำถามและคำตอบที่มีคำสั่ง MySQL ที่มีความเสี่ยงสูงต่อการถูกโจมตีจากการฉีด SQL แม้ว่าจะมีวิธีการพื้นฐานที่ใช้กันอย่างแพร่หลายมานานกว่าทศวรรษ
มีเหตุผลหรือไม่ที่ข้อมูลโค้ดประเภทนี้ยังใช้อยู่ในปัจจุบัน?
คำตอบ:
ฉันคิดว่าส่วนใหญ่มาจาก a) ความไม่รู้ข) ความเกียจคร้าน ผู้เริ่มต้นมักไม่ค่อยรู้เรื่องการฉีด sql และแม้ว่าพวกเขาจะได้ยินเรื่องนี้พวกเขาก็ไม่สนใจเพราะมันง่ายและง่ายกว่าในการเขียนโค้ดด้วยวิธีนี้
PHP จงใจทำให้เป็นเรื่องง่ายสำหรับผู้ที่รู้น้อยมากในการสร้างเว็บเพจแบบไดนามิกที่มีประโยชน์ ซึ่งหมายความว่า PHP จะดึงดูดผู้เริ่มต้นจำนวนมากผู้สร้างสิ่งที่มีประโยชน์เรียนรู้จากตัวอย่างการค้นหาที่มีประโยชน์อื่น ๆ ผลที่ได้คือรหัสไม่ดีจำนวนมากและผู้เขียนโปรแกรมที่ไม่รู้จักดีกว่านี้
มันทำให้สิ่งที่แย่กว่านั้นคือโปรแกรมเมอร์ที่มีความสามารถจำนวนมากไม่ต้องการอะไรเกี่ยวกับ PHP สิ่งนี้จะช่วยลดฐานของผู้ที่มีประสบการณ์ซึ่งยินดีสอนผู้อื่นให้ดีขึ้น แต่ทำไมพวกเขาจึงหลีกเลี่ยง PHP ดีสำหรับการรวมกันของปัจจัย ส่วนหนึ่งไม่ชอบพูดกับหูดภาษา และส่วนหนึ่งเป็นเพราะพวกเขาต้องการทำงานกับโค้ดที่ดีและมี PHP ที่ดีไม่มากนัก
กลุ่มดาวที่แน่นอนของปัญหาที่ใช้ในการก่อกวน Perl ตัวอย่างที่น่าสนใจลองพิจารณากรณีของ Matt Wright วัยรุ่นที่กระตือรือร้นซึ่งตั้งค่าไว้เพื่อให้สคริปต์ CGI ที่มีประโยชน์มากมายมีเอกสารที่ดีและง่ายต่อการติดตั้งในปี 1990 น่าเสียดายที่เขาไม่เข้าใจเรื่องความปลอดภัยและคนที่ต้องการใช้สิ่งของของเขาก็ไม่ได้ ผลที่ได้คือจดหมายเหตุของ Matt Wright ซึ่งเป็นปัญหาด้านความปลอดภัยที่ไม่มีที่สิ้นสุดสำหรับสคริปต์ CGI ยุคแรก แม้จะมีความพยายามเช่นhttp://www.scriptarchive.com/nms.htmlปัญหาไม่ได้ปรับปรุงสำหรับ Perl จนกว่าผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันจะทำให้ PHP สะดวกกว่าสิ่งอื่นใด ทำให้เกิดปัญหาในการย้ายจาก Perl เป็น PHP
แต่น่าเสียดายที่มีตันมากขึ้นกว่าที่เลวร้ายบทเรียน PHP ออกมีและหนังสือ PHP เก่ายังดูดที่บอกคนที่จะเขียนโค้ดที่เหมาะสม (ไม่ได้ใช้ register_globals ฯลฯ )
นอกจากนี้เมื่อmagic_quotes_gpc
เปิดใช้งานในอดีตผู้คนไม่สนใจที่จะหลบหนีเพราะ "มันใช้งานได้"
ส่วนตัวผมเชื่อว่า PHP นั้นใช้งานง่ายดังนั้นโดยธรรมชาติแล้วมันง่ายต่อการใช้งานในทางที่ผิด
ในฐานะมนุษย์และโปรแกรมเมอร์ฉันพบว่ามันง่ายที่จะทำผิดพลาดและมองข้ามสิ่งต่าง ๆ โดยเฉพาะอย่างยิ่งเมื่อถูกกดลงเวลา
มันง่ายและอาจเป็นเรื่องล่อลวงเกินไปที่จะตำหนิภาษาบางภาษาเพราะสามารถเข้าถึงได้ด้วยตัวของมันเอง แต่นั่นจะทำให้เกิดปัญหาใหญ่ในการเข้าใจผิดของมนุษย์โดยไม่คำนึงถึงภาษาที่เลือกในการเขียนโปรแกรม
ได้รับเรามาไกลตั้งแต่ภาษาแอสเซมบลีและฉันคิดว่าฉันจะเขียนโปรแกรมที่มีประสิทธิผลมากขึ้นในภาษาที่ทันสมัยกว่าเช่น PHP, Python, Ruby หรือ Java
ในความเป็นจริง PHP (และภาษาสคริปต์อื่น ๆ ) ได้ลดอุปสรรคในการเข้า นั่นอาจหมายความว่าผู้มาใหม่ในการเขียนโปรแกรมลองใช้ PHP ก่อน แต่นั่นก็ไม่ได้หมายความว่าโปรแกรมเมอร์ PHP ทุกคนนั้นมีคุณสมบัติน้อยกว่าหรือไม่สามารถเรียนรู้จากความผิดพลาดได้ดีกว่าโปรแกรมเมอร์ของภาษาอื่น ๆ
Rasmus Lerdorf สร้าง PHP ในรูปแบบดั้งเดิมในปี 1994 มันมีการพัฒนาอย่างมากตั้งแต่นั้นมา ในรูปแบบที่ทันสมัยที่สุดรองรับการเขียนโปรแกรมเชิงวัตถุรวมถึงเฟรมเวิร์กที่ยอดเยี่ยมเช่น Symfony PHP เป็นภาษาที่ปราศจากข้อ จำกัด ดั้งเดิมและเติบโตขึ้นเพื่อให้ความยืดหยุ่นอย่างมากในการที่โปรแกรมเมอร์สามารถเลือกใช้มันได้ คุณสามารถใช้มันเพื่อสร้างสคริปต์บรรทัด 9,000 บรรทัดของสปาเก็ตตี้หรือคุณสามารถใช้มันในบริบทของกรอบ MVC ที่ทันสมัยเช่น Symfony: เป็นทางเลือกของคุณ!
ฉันสงสัยอย่างยิ่งว่าช่องโหว่ด้านความปลอดภัยไม่ได้ จำกัด อยู่เพียงภาษาเดียว การเขียนโปรแกรมเมอร์ PHP ทุกตัวนั้นมีความสามารถน้อยกว่าหรือมีแนวโน้มที่จะเขียนโค้ดที่ไม่ปลอดภัย แต่ฉันสงสัยว่ามันมีอคติด้านภาษามากแค่ไหน
ฉันคิดว่าส่วนหนึ่งของปัญหาคือคนที่คัดลอกโค้ดโดยไม่ต้องสนใจที่จะเรียนรู้สิ่งที่พวกเขากำลังทำอยู่ แต่ในใจของฉันจริง ๆ แล้ววิธีที่เราสอน porgamnming นั้นใช้งานไม่ได้และเป็นหนึ่งในสาเหตุว่าทำไมรหัสที่แย่มาก เราสอนไวยากรณ์นอกบริบทและเพื่อให้ผู้เริ่มต้นไม่ทราบว่าจะใช้อะไรเมื่อไรและเมื่อใดหรือปัญหาอะไรที่ไวยากรณ์มีจุดประสงค์เพื่อแก้ปัญหาและปัญหาที่ไม่ได้ตั้งใจจะแก้ไข ดังนั้นพวกเขาจึงใช้ค้อนเมื่อประแจเป็นเครื่องมือที่ดีกว่า
ตัวอย่างเช่นแทนที่จะเป็นการสอนไวยากรณ์เพียงอย่างเดียวคุณจัดหลักสูตรเช่น (ชัดเจนว่าจะมีขั้นตอนมากขึ้นนี่เป็นเพียงตัวอย่างพื้นฐานของการสร้างจากปัญหาพื้นฐานไปจนถึงปัญหาที่ซับซ้อนมากกว่าการสอนไวยากรณ์):
ฉันคิดว่าคุณจะพบตัวอย่าง MS SQL + ASP / ASP.NET จำนวนใกล้เคียงที่มีความเสี่ยง
ฉันรู้สึกว่าปัญหาบางส่วนเกิดจากข้อเท็จจริงที่ว่าเมื่อคุณพยายามสอนบางอย่างให้พูดการกรองข้อมูลโดยใช้คำสั่งย่อย WHERE แล้วคุณไม่ต้องการให้ตัวอย่างของคุณยุ่งเหยิงโดยการหลีกเลี่ยงสตริงข้อความค้นหาของคุณอย่างถูกต้องหรือใช้คำสั่งพารามิเตอร์
ฉันฝึกฝนนักพัฒนามาหลายปีแล้วและฉันสามารถเอาใจใส่ผู้ที่เขียนโค้ดที่น่ากลัวในแบบฝึกหัดได้ บางครั้งก็เข้าใจง่ายที่สุด อย่างไรก็ตามในบางครั้งฉันชี้ไปที่โค้ดที่มีช่องโหว่และทำให้เป็นหัวข้อด้านที่น่าสนใจ
ผู้เขียนต้นฉบับของ PHP, Rasmus Lerdorfในรายการบล็อกที่น่าอับอายของเขาสนับสนุน "ไม่มีกรอบ"การพัฒนา แม้ว่าแบบสอบถาม SQL จะใช้ PDO ดังนั้นจึงไม่มีความเสี่ยงในการฉีด SQL ยังค่อนข้างน่าเกลียดและล้าสมัยเมื่อเทียบกับกรอบ MVC สมัยใหม่ที่มีเลเยอร์ ORMs
คุณสามารถตำหนิการปฏิบัติที่ไม่ดีนี้ใน PHP เอง PHP รุ่นเก่า (จนถึงประมาณปี 2549) จะหลีกเลี่ยงตัวแปรอินพุต GET และ POST ทั้งหมดเพื่อให้เหมาะสมสำหรับการแก้ไขแบบสอบถามฐานข้อมูลตามค่าเริ่มต้น ดูhttp://php.net/manual/th/security.magicquotes.php
stripslashes()
คุณได้ทำผิดไปแล้ว
อย่าสับสนวัตถุประสงค์ของการสอนซึ่งแสดงให้เห็นถึงสิ่งต่าง ๆ อย่างง่ายๆพร้อมกับสิ่งที่ควรทำในสภาพแวดล้อมการผลิต ตัวอย่างเช่นโค้ดการสอนส่วนใหญ่ที่ฉันเขียนมีการตรวจสอบข้อผิดพลาด / ข้อยกเว้นเพียงเล็กน้อยหรือไม่มีเลย ฉันพยายามเตือนผู้อ่านว่ารหัสแสดงให้เห็นถึงวิธีการทำงานเฉพาะอย่างเท่านั้นไม่ใช่วิธีครอบคลุมผลลัพธ์ที่เป็นไปได้ทั้งหมด
most tutorial code I have written has little or no error/exception checking.
-1
เมื่อฉันเรียนรู้ PHP ฉันดูหนังสือ PHP + MySQL เหล่านี้และใช่ฉันรู้สึกว่ามันมีส่วนช่วยในการปฏิบัติที่ไม่ดี แต่ฉันมีความเห็นอกเห็นใจเพราะพวกเขากำลังสอนภาษาไม่ใช่วิธีการเขียนโปรแกรมที่ดี ไม่งั้นมันจะจบที่ไหน?