2014-10-27 35 views
6

Tôi đã làm việc với PHP một thời gian và tôi bắt đầu tự hỏi liệu tôi có đang phát triển những thói quen tốt hay không.Sanitizing Biến PHP, tôi có lạm dụng nó không?

Một trong số đó là những gì tôi luôn tin bao gồm lạm dụng phương pháp khử trùng PHP, ví dụ, một người dùng đăng ký thông qua một hình thức, và tôi nhận được bài biến sau:

$_POST['name'], $_POST['email']$_POST['captcha']. Bây giờ, những gì tôi thường làm rõ ràng là khử trùng các dữ liệu tôi sẽ đặt vào MySQL, nhưng khi so sánh captcha, tôi cũng khử trùng nó.

Vì vậy, tôi tin rằng tôi đã hiểu lầm về việc vệ sinh PHP, tôi tò mò, có trường hợp nào khác không khi bạn cần vệ sinh dữ liệu trừ khi sử dụng nó để đặt một thứ gì đó trong MySQL (lưu ý rằng tôi biết vệ sinh cũng cần thiết để ngăn chặn các cuộc tấn công XSS) . Và hơn thế nữa, thói quen của tôi là khử trùng hầu như mọi biến đến từ đầu vào của người dùng, một biến xấu?

+8

Không bao giờ tin tưởng đầu vào của người dùng là một trong những thói quen tốt nhất để có. Cơ sở dữ liệu tiêm là lý do rõ ràng, nhưng có một vài người khác. Câu lệnh eval(), tạo lớp động $ x = new $ classnamehere(), v.v. – STLMikey

+3

Tất cả đầu vào của người dùng/đầu vào bên ngoài đều nguy hiểm, vì vậy nếu - ví dụ - bạn so sánh giá trị captcha với chuỗi nội bộ, có một số (mặc dù trừ đi) rủi ro mà giá trị truyền vào có thể "gian lận" và bằng cách nào đó vượt qua logic so sánh. Với điều đó, có, một số đầu vào cần vệ sinh nhiều hơn các đầu vào khác, vì một số dữ liệu được sử dụng trong các kịch bản có nguy cơ cao hơn. Tôi sẽ khuyên vệ sinh tất cả đầu vào của người dùng thông qua một số chức năng chung nếu có thể và sử dụng MySQLi hoặc PDO để tự động thoát khỏi bất kỳ dữ liệu nào để chống lại rủi ro tiêm. – Anthony

+2

Tôi tin rằng đó là một thói quen tốt, không hoạt động - Tôi tin rằng ứng dụng của bạn không được chạm vào bất kỳ dữ liệu nào được nhập vào mà không được vệ sinh trước - tôi có một lớp học thông qua các yêu cầu đăng/nhận và tạo ra các phiên bản được khử trùng trước khi tôi có thể truy cập chúng –

Trả lời

3

Bất cứ khi nào bạn lưu trữ dữ liệu của mình ở đâu đó và nếu dữ liệu đó sẽ được đọc/có sẵn cho người dùng (không ngờ) thì bạn phải vệ sinh nó. Vì vậy, một cái gì đó mà có thể có thể thay đổi trải nghiệm người dùng (không nhất thiết chỉ là cơ sở dữ liệu) nên được chăm sóc. Nói chung, tất cả đầu vào của người dùng được coi là không an toàn, nhưng bạn sẽ thấy trong đoạn tiếp theo rằng một số điều có thể vẫn bị bỏ qua, mặc dù tôi không khuyên bạn nên sử dụng nó. Điều này xảy ra trên máy khách chỉ được khử trùng chỉ để có UX tốt hơn (trải nghiệm người dùng, suy nghĩ về xác thực JS của biểu mẫu) - từ quan điểm bảo mật, nó vô dụng vì nó dễ dàng tránh được, nhưng nó giúp người dùng không độc hại có tương tác tốt hơn với trang web) nhưng về cơ bản, nó không thể gây hại gì bởi vì dữ liệu đó (tốt hay xấu) bị mất ngay sau khi phiên bị đóng. Bạn luôn có thể phá hủy một trang web cho chính mình (trên máy của bạn), nhưng vấn đề là khi ai đó có thể làm điều đó cho người khác.

Để trả lời câu hỏi của bạn trực tiếp hơn - đừng bao giờ lo lắng về việc lạm dụng nó. Luôn an toàn hơn là xin lỗi, và chi phí thường không quá một vài phần nghìn giây.

3

Cụm từ bạn cần tìm kiếm là FIEO. Đầu vào bộ lọc, đầu ra thoát.

Bạn có thể dễ dàng gây nhầm lẫn cho bản thân nếu bạn không hiểu nguyên tắc cơ bản này.

Hãy tưởng tượng PHP là người đàn ông ở giữa, nó nhận được bằng tay trái và các nốt ruồi với bên phải.

Người dùng sử dụng biểu mẫu của bạn và điền vào biểu mẫu ngày, vì vậy, nó chỉ nên chấp nhận chữ số và có thể, dấu gạch ngang. ví dụ. nnnnn-nn-nn. nếu bạn nhận được một cái gì đó mà không phù hợp với đó, sau đó từ chối nó.

Đó là ví dụ về lọc.

PHP tiếp theo, làm điều gì đó với nó, cho phép nói lưu trữ nó trong cơ sở dữ liệu Mysql.

Những gì Mysql cần được bảo vệ khỏi SQL injection, vì vậy bạn sử dụng PDO hoặc các câu lệnh chuẩn bị của Mysqli để chắc chắn rằng EVEN NẾU bộ lọc của bạn thất bại, bạn không thể cho phép tấn công vào cơ sở dữ liệu của mình. Đây là một ví dụ về Escaping, trong trường hợp này thoát cho lưu trữ SQL.

Sau đó, PHP lấy dữ liệu từ db của bạn và hiển thị nó trên trang HTML. Vì vậy, bạn cần phải thoát khỏi dữ liệu cho phương tiện tiếp theo, HTML (đây là nơi bạn có thể cho phép các cuộc tấn công XSS).

Trong đầu bạn phải phân chia từng chức năng 'bảo vệ' của PHP thành một hoặc một trong hai họ này, Lọc hoặc Thoát.

Trường Freetext dĩ nhiên phức tạp hơn việc lọc ngày, nhưng đừng bận tâm, tuân thủ nguyên tắc và bạn sẽ không sao.

Hy vọng điều này sẽ giúp http://phpsec.org/projects/guide/

+0

Thực ra bạn vừa trả lời tất cả các câu hỏi Tôi đã có trong đầu của tôi một thời gian. Bây giờ tôi đã hiểu các câu lệnh chuẩn bị sẵn có ở đâu và nơi thoát là necesarry. Cảm ơn :) –

Các vấn đề liên quan