2008-09-05 19 views
7

Dưới đây là một vài khả năng để bắt đầu cuộc trò chuyện:Làm thế nào để bạn ngăn chặn việc tiêm SQL trong các ứng dụng LAMP?

  1. Thoát khỏi mọi đầu vào khi khởi tạo.
  2. Thoát từng giá trị, tốt nhất là khi tạo SQL.

Giải pháp đầu tiên là tối ưu, vì sau đó bạn cần phải hủy cảnh báo từng giá trị nếu bạn muốn sử dụng nó trong bất kỳ thứ gì ngoài SQL, như xuất nó trên trang web.

Giải pháp thứ hai có ý nghĩa hơn nhiều, nhưng thoát theo cách thủ công mỗi giá trị là một cơn đau.

Tôi biết là prepared statements, tuy nhiên tôi thấy MySQLi rườm rà. Ngoài ra, tách truy vấn khỏi các yếu tố đầu vào liên quan đến tôi, bởi vì mặc dù điều quan trọng để có được thứ tự chính xác là rất dễ mắc lỗi và do đó ghi sai dữ liệu vào các trường sai.

Trả lời

7

là trạng thái @Rob Walker, các truy vấn được tham số hóa là đặt cược tốt nhất của bạn. Nếu bạn đang sử dụng PHP mới nhất và tuyệt vời nhất, tôi khuyên bạn nên xem qua số PDO (Các đối tượng dữ liệu PHP). Đây là một thư viện trừu tượng cơ sở dữ liệu gốc có hỗ trợ cho một loạt các cơ sở dữ liệu (bao gồm cả MySQL của khóa học) cũng như các câu lệnh chuẩn bị với các tham số có tên.

10

Báo cáo chuẩn bị là câu trả lời hay nhất. Bạn có thử nghiệm vì bạn có thể phạm sai lầm!

Xem this câu hỏi.

-1

Tôi đã luôn sử dụng giải pháp đầu tiên vì 99% thời gian, các biến số trong $_GET, $_POST$_COOKIE không bao giờ được xuất ra trình duyệt. Bạn cũng sẽ không bao giờ nhầm lẫn khi viết mã bằng SQL injection (trừ khi bạn không sử dụng dấu ngoặc kép trong truy vấn), trong khi với giải pháp thứ hai, bạn có thể dễ dàng quên thoát một trong các chuỗi của bạn.

Thực ra, lý do tôi luôn làm theo cách đó là vì tất cả các trang web của tôi đều có cài đặt magic_quotes theo mặc định và khi bạn đã viết rất nhiều mã bằng một trong hai giải pháp đó, phải mất rất nhiều của công việc để thay đổi sang một công việc khác.

1

Tôi sẽ sử dụng báo cáo đã chuẩn bị. Nếu bạn muốn sử dụng các câu lệnh chuẩn bị sẵn sàng, bạn có thể muốn kiểm tra các hàm PDO cho PHP. Điều này không chỉ cho phép bạn dễ dàng chạy các câu lệnh đã chuẩn bị, nó cũng cho phép bạn có nhiều cơ sở dữ liệu hơn bất khả tri bằng cách không gọi các hàm bắt đầu với mysql_, mysqli_, hoặc pgsql_.

0

PDO có thể đáng giá trong một ngày, nhưng nó không chỉ ở đó. Đó là một DBAL và nó là strengh (được cho là) ​​để chuyển đổi giữa các nhà cung cấp dễ dàng hơn. Nó không thực sự xây dựng để bắt tiêm SQL.

Dù sao đi nữa, bạn muốn thoát và khử trùng đầu vào của bạn, sử dụng các câu lệnh chuẩn bị có thể là một biện pháp tốt (tôi thứ hai). Mặc dù tôi tin rằng nó dễ dàng hơn nhiều, ví dụ: bằng cách sử dụng filter.