Tại sao không bảo vệ chống lại SQL tiêm ưu tiên cao?


39

Trên Stack Overflow, tôi thấy rất nhiều mã PHP trong các câu hỏi và câu trả lời có các truy vấn MySQL rất dễ bị tấn công SQL, mặc dù các cách giải quyết cơ bản đã có sẵn rộng rãi trong hơn một thập kỷ.

Có một lý do tại sao các loại đoạn mã này vẫn còn được sử dụng ngày nay?


37
đổ lỗi cho các hướng dẫn trực tuyến bằng văn bản xấu. thường xuyên hơn không, mọi người chỉ cần sao chép và dán bất kỳ mã nào họ tìm thấy trên mạng. JavaScript cũng là một nạn nhân khác của thực tiễn đó.
KJYe. Đến

34
Đổ lỗi cho các blog. Ồ, và W3Schools ...
Brian Driscoll

13
Có, hoàn toàn là W3Schools - xem w3fools.com
DisgruntledGoat

2
Tôi liên tục thấy mọi người cảnh báo về việc tiêm sql - vì vậy tôi thậm chí không nghĩ tiền đề của câu hỏi này là hợp lệ. Đó một ưu tiên cao.
GrandmasterB

3
Điều tôi đang thấy trong rất nhiều câu trả lời là việc dạy PHP dễ bị hỏng nghiêm trọng hơn là dạy, PHP không bị phá vỡ nghiêm trọng. Bạn không thể chấp nhận lập luận đó và vẫn cho rằng PHP không phải là ngôn ngữ xấu
user16764

Câu trả lời:


34

Tôi nghĩ rằng điều đó chủ yếu là do a) thiếu hiểu biết b) lười biếng. Người mới bắt đầu thường không biết nhiều về tiêm sql và ngay cả khi họ nghe về nó, họ cũng bỏ qua vì đơn giản và dễ dàng hơn để viết mã theo cách đó.


8
Tôi đã cố gắng sửa những thứ như vậy ở nơi khác, chỉ để nói rằng nó không liên quan đến vấn đề trong tay. Vì vậy, vì rất nhiều người thích một bản hack đơn giản cho một giải pháp tốt phức tạp hơn một chút, các ví dụ xấu chỉ còn lại một mình.
l0b0

6
Hầu hết mọi người không thực sự quan tâm đến việc tiêm SQL cho đến khi họ gặp phải vấn đề này. Rồi đột nhiên họ tự hỏi bàn của họ đi đâu.
Joel Etherton

1
Lý do khác là SQL tiêm không phải lúc nào cũng được xem là mối quan tâm có liên quan cho các ứng dụng nội bộ. (Không phải họ đúng.)
John Fisher

1
Đừng quên rằng Câu trả lời là có để trả lời câu hỏi. Thông thường, đó là mã giả (hoặc SQL) nhằm trả lời câu hỏi, không nhất thiết phải cung cấp giải pháp sao chép và dán an toàn và bảo mật (mặc dù câu trả lời có thể được sử dụng như thế nào trong thực tế).
Dalin Seivewright

1
@ l0b0 Tôi biết một người nghiêm túc đã sửa lỗi tiêm SQL bằng cách thực sự chứng minh một cuộc tấn công SQL SQL chống lại mã sản xuất hiện tại.
dùng16764

26

PHP cố tình làm cho nó thực sự, thực sự dễ dàng cho những người biết rất ít để tạo các trang web động hữu ích. Điều này có nghĩa là PHP sẽ thu hút rất nhiều người mới bắt đầu, những người tạo ra thứ gì đó hữu ích, học hỏi từ các ví dụ tìm kiếm hữu ích khác và quay lại để dạy người khác cách làm điều tuyệt vời, hữu ích này. Kết quả là có rất nhiều mã xấu và nguồn cung cấp cho các lập trình viên không biết gì hơn.

Nó chỉ làm cho mọi thứ tồi tệ hơn khi một phần lớn các lập trình viên có năng lực không muốn làm gì với PHP. Điều này làm giảm cơ sở của những người có kinh nghiệm, những người sẵn sàng dạy người khác tốt hơn. Nhưng tại sao họ tránh PHP? Vâng cho sự kết hợp của các yếu tố. Một phần họ không thích đối phó với mụn cóc ngôn ngữ. Và một phần là vì họ thích làm việc với mã tốt và không có nhiều PHP tốt ngoài kia.

Chòm sao chính xác này của các vấn đề được sử dụng để gây ra Perl. Như một ví dụ sáng chói, hãy xem xét trường hợp của Matt Wright, một thiếu niên nhiệt tình, người đã đặt ra để cung cấp nhiều kịch bản CGI hữu ích, được ghi chép tốt và dễ cài đặt vào những năm 1990. Thật không may, anh ta không hiểu gì về an ninh, và những người muốn sử dụng công cụ của anh ta cũng không biết. Kết quả là Kho lưu trữ kịch bản Matt Wright, đây là một vấn đề bảo mật vô tận cho các kịch bản CGI ban đầu. Bất chấp những nỗ lực như http://www.scriptarchive.com/nms.html , vấn đề không được cải thiện đối với Perl cho đến khi các nhà cung cấp dịch vụ lưu trữ chia sẻ làm cho PHP thuận tiện hơn bất kỳ điều gì khác. Điều đó dẫn đến vấn đề chuyển từ Perl sang PHP.


Như bạn đã nói, vấn đề không phải là perl hay PHP, mà là những ngôn ngữ này cho phép người mới bắt đầu làm rất nhiều thứ, điều đó tốt, nhưng đừng luôn cung cấp những cách để làm tốt chúng là điều hiển nhiên.
Zachary K

2
@ZacharyK: Không phải đó là lỗi của ngôn ngữ theo mặc định?
Cuộc đua nhẹ nhàng với Monica

6
@ tomalak-geretkal: Bạn sử dụng từ "lỗi" như thể làm cho nó có thể hoàn thành công việc là một điều xấu. Các đặc điểm tương tự dẫn đến nhiều mã xấu cũng dẫn đến rất nhiều vấn đề thực sự được giải quyết. Không rõ ràng rằng đây là một điều xấu trên toàn bộ.
btilly

'Lỗi': nếu HTML (hay đúng hơn là các trình duyệt diễn giải nó) có khả năng chịu lỗi như XSL, thì sẽ không bao giờ có một trang web trên toàn thế giới ...
Stewol 19/12/11

8

Tiếc là có tấn nhiều hơn xấu PHP hướng dẫn lên đó, và một số sách PHP cũ cũng bị hút vào nói với mọi người để viết mã đúng (không sử dụng register_globals vv).

Ngoài ra, với magic_quotes_gpcviệc được kích hoạt trong quá khứ, mọi người không quan tâm đến việc trốn thoát vì "đơn giản là nó đã hoạt động".


4

Cá nhân, tôi tin rằng PHP rất dễ sử dụng, do đó, tự nhiên nó dễ sử dụng sai.


2

Là một con người, và là một lập trình viên, tôi thấy rất dễ mắc lỗi và bỏ qua những điều nhất định, đặc biệt là khi bị ép thời gian.

Thật dễ dàng, và có lẽ tất cả đều quá hấp dẫn, để đổ lỗi cho một ngôn ngữ nhất định, vì quá dễ tiếp cận vì lợi ích của chính nó. Nhưng điều đó sẽ che đậy vấn đề lớn hơn về khả năng cảm nhận của con người, bất kể ngôn ngữ được chọn để lập trình.

Cấp, chúng tôi đã đi một chặng đường dài kể từ ngôn ngữ lắp ráp và tôi nghĩ rằng tôi sẽ lập trình hiệu quả hơn nhiều trong một ngôn ngữ hiện đại hơn, như PHP, Python, Ruby hoặc Java.

PHP (và các ngôn ngữ kịch bản lệnh khác) trên thực tế đã hạ thấp rào cản gia nhập. Điều đó có thể có nghĩa là nhiều người mới đến lập trình thử PHP trước. Nhưng điều đó chắc chắn không có nghĩa là tất cả các lập trình viên PHP bằng cách nào đó có trình độ kém hơn hoặc không có khả năng học hỏi từ những sai lầm của họ so với các lập trình viên của các ngôn ngữ khác.

Rasmus Lerdorf đã tạo ra PHP ở dạng ban đầu vào năm 1994, nó đã phát triển đáng kể kể từ đó. Trong phiên bản hiện đại nhất của nó, nó hỗ trợ lập trình hướng đối tượng, cũng như các khung công tác tuyệt vời, như Symfony. PHP là một ngôn ngữ đã thoát ra khỏi các ràng buộc ban đầu của nó và đã phát triển để mang đến sự linh hoạt tuyệt vời trong cách các lập trình viên có thể chọn sử dụng nó. Bạn có thể sử dụng nó để tạo tập lệnh 9.000 dòng mã spaghetti hoặc bạn có thể sử dụng nó trong bối cảnh của khung công tác MVC hiện đại, như Symfony: đó là lựa chọn của bạn!

Tôi nghi ngờ rằng các lỗ hổng bảo mật không bị hạn chế trong một ngôn ngữ. Thật là hấp dẫn khi viết ra tất cả các lập trình viên PHP vì bằng cách nào đó ít có khả năng hơn hoặc dễ viết mã không an toàn hơn. Nhưng tôi tự hỏi bao nhiêu trong số đó là thiên vị ngôn ngữ, và bao nhiêu trong số đó là sự thật?


Tôi đã không nói bất cứ điều gì về "tất cả các lập trình viên PHP".
Cuộc đua nhẹ nhàng với Monica

2

Tôi nghĩ một phần của vấn đề là những người chỉ cần sao chép mã mà không bận tâm tìm hiểu những gì họ đang làm, nhưng thực sự theo cách của tôi, cách chúng tôi dạy porgamnming bị hỏng và đó là một trong những lý do tại sao có quá nhiều mã xấu. Chúng tôi dạy cú pháp ngoài ngữ cảnh và vì vậy những người mới bắt đầu không biết khi nào nên sử dụng một cái gì đó và khi nào không hoặc vấn đề nào cú pháp nhằm giải quyết và vấn đề nào không nhằm giải quyết. Vì họ sử dụng búa khi cờ lê sẽ là công cụ tốt hơn.

Vì vậy, ví dụ thay vì chỉ dạy cú pháp, bạn tổ chức khóa học như (Rõ ràng sẽ có nhiều bước hơn, đây chỉ là một ví dụ cơ bản về xây dựng từ các vấn đề cơ bản đến phức tạp hơn thay vì chỉ dạy cú pháp):

  1. Đây là cách bạn thiết lập một trang web cơ bản
  2. Đây là cách bạn tạo trang web lấy dữ liệu từ cơ sở dữ liệu
  3. Đây là cách bạn gửi dữ liệu từ một trang web đến cơ sở dữ liệu
  4. Đây là cách bạn đảm bảo dữ liệu đúng được gửi.
  5. Đây là cách bạn bảo vệ cơ sở dữ liệu của mình khỏi việc nhập dữ liệu độc hại

đó ít nhiều là cách tôi được dạy php +1
Rémi

1

Tôi nghĩ rằng bạn sẽ tìm thấy một số lượng tương tự các ví dụ MS SQL + ASP / ASP.NET cũng dễ bị tổn thương.

Tôi cảm thấy vấn đề một phần xuất phát từ thực tế là khi bạn đang cố dạy một điều gì đó, hãy nói rằng lọc dữ liệu bằng mệnh đề WHERE, sau đó bạn thực sự không muốn làm lộn xộn ví dụ của mình bằng cách thoát đúng chuỗi truy vấn của bạn hoặc sử dụng lệnh tham số.

Tôi đã đào tạo các nhà phát triển trong nhiều năm và tôi có thể đồng cảm với những người viết mã khủng khiếp trong hướng dẫn. Đôi khi đó là điều dễ hiểu nhất. Tuy nhiên, ở một bên, tôi luôn chỉ ra mã dễ bị tổn thương và biến nó thành một chủ đề phụ thú vị.


6
Đó không nên là một bên. Đó nên là một phần của bài học cơ bản. Có thể với một cảnh báo lớn, béo, về cách làm sai. Mọi người có xu hướng cắt và dán những gì họ nhìn thấy đầu tiên, và bạn thực sự muốn đó là cách đúng đắn để làm mọi việc.
btilly

Chắc chắn trong thế giới .NET việc tham số hóa ngày nay khá đơn giản và thực sự nên là thứ 'trang một'.
Alan B

1

Tác giả ban đầu của PHP, Rasmus Lerdorf , trong mục blog khét tiếng của mình ủng hộ sự phát triển "không khuôn khổ" . Mặc dù đối với các truy vấn SQL, anh ta sử dụng PDO, do đó không có rủi ro về việc tiêm SQL. Vẫn còn khá xấu xí và lỗi thời so với các khung MVC hiện đại với các lớp ORM.


5
Chắc chắn có thể các kỹ sư trang web quá mức với các khung phức tạp mà bạn không cần. Tôi muốn nói rằng những lời đề nghị của Rasmus đang gây nguy hiểm cho tội phạm, nhưng chắc chắn có một nền tảng trung thực lành mạnh.
Cuộc đua nhẹ nhàng với Monica

ngày nay sử dụng ORM không phải là kỹ thuật quá mức; đó là tiêu chuẩn. Vậy là sử dụng mô hình MVC.
vartec

3
@vartec: Nó hầu như không "chuẩn" chỉ vì tất cả những con cừu đang sử dụng nó (và, với giá trị của nó, thậm chí không phải tất cả những con cừu đang sử dụng nó). Đối với các kịch bản nhỏ, nó có thể dễ dàng là quá kỹ thuật.
Cuộc đua nhẹ nhàng với Monica

1
@Tomalak: nó là tiêu chuẩn, bởi vì đó là cách để thực hiện các dự án sạch và bền vững. "Các kịch bản nhỏ" có xu hướng phát triển theo thời gian và biến thành những điều quái dị không thể nhầm lẫn.
vartec

2
@vartec: Tôi nghĩ bạn đã hiểu nhầm ý nghĩa của "tiêu chuẩn".
Cuộc đua nhẹ nhàng với Monica

1

Bạn có thể đổ lỗi cho thực tiễn kém này trên chính PHP. Các phiên bản kế thừa của PHP (cho đến khoảng năm 2006) sẽ thoát khỏi tất cả các biến đầu vào GET và POST để chúng phù hợp với phép nội suy truy vấn cơ sở dữ liệu BY DEFAULT. Xem http://php.net/manual/en/security.magicquotes.php


2
Đã có lúc nó sẽ thoát TẤT CẢ các biến như thể chúng sẽ xâm nhập vào MySQL một cách cụ thể, cho dù chúng có tồn tại hay không . Lưu ý cho các nhà thiết kế ngôn ngữ: khi bạn thấy mình phải thực hiện stripslashes(), bạn đã làm sai.
Dan Ray

0

Đừng nhầm lẫn mục đích của một hướng dẫn, đó là thể hiện một cái gì đó đơn giản, với những gì nên được thực hiện trong môi trường sản xuất. Ví dụ, hầu hết mã hướng dẫn tôi đã viết có ít hoặc không có lỗi / kiểm tra ngoại lệ. Tôi cố gắng nhắc nhở người đọc rằng mã chỉ trình bày cách thực hiện một nhiệm vụ cụ thể, chứ không phải làm thế nào để bao quát tất cả các kết quả có thể.


3
Xin lỗi, nhưng hoàn toàn không có mã ví dụ nào có thể trộn lẫn các truy vấn myQuery với PHP. Điều đó chỉ đơn giản là làm sai.
Raynos

1
Và vô trách nhiệm.
Cuộc đua nhẹ nhàng với Monica

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

Tôi có thể thấy quan điểm của OP. Vô trách nhiệm là, khi một nhà tuyển dụng thuê một anh chàng thiếu kiến ​​thức về tiêm SQL và những thứ tương tự.
Raffael

Tôi nghĩ cách tiếp cận này có thể phòng thủ được nếu bạn đưa ý kiến trực tiếp vào mã nói rằng "Không sử dụng điều này trong sản xuất!". Bằng cách đó, bản sao / pasters không có lý do.
Stewol

-1

Khi tôi học PHP tôi đã xem một số sách PHP + MySQL này và vâng tôi cảm thấy rằng nó góp phần vào thực tiễn tồi tệ đó. Nhưng tôi có cảm tình, vì họ đang dạy ngôn ngữ chứ không phải thực hành lập trình tốt. Nếu không thì nó sẽ kết thúc ở đâu?


2
Nhưng khi bạn đang dạy ngôn ngữ, bạn vẫn nên sử dụng các API ưa thích trong các ví dụ của mình. Giống như luôn luôn sử dụng hình thức tham số SQL, có thể với chú thích như "Đừng bao giờ nghĩ đến việc sử dụng phép nội suy để xây dựng SQL. Nó có vẻ dễ hơn một chút, nhưng nó rất dễ bị lỗ hổng bảo mật."
Jan Hudec

Đúng, điểm tốt. Chú thích sẽ là một lời nhắc tốt, và điều đó cũng đúng cho các hướng dẫn trực tuyến. Mặc dù nghiêm trọng, sẽ thật tuyệt nếu các tác giả sách của tất cả các ngôn ngữ có thể kết hợp lời khuyên từ OWASP vào các văn bản mới bắt đầu. Thậm chí chỉ là một tài liệu tham khảo. Quỹ OWASP làm tốt công việc.
Steve Rathbone

@indifferentDrum: Bạn cũng có thể dạy mọi người lái xe bằng chân - không có nghĩa đó là một ý tưởng hay.
Cuộc đua nhẹ nhàng với Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.