2010-09-03 28 views
5

Tôi rất bối rối về điều gì đó và đang tự hỏi liệu có ai đó có thể giải thích hay không.Xác thực tính năng nhập của người dùng?

Trong PHP tôi xác thực người dùng nhập vào htmlentitiies, mysql_real_escape_string được sử dụng trước khi chèn vào cơ sở dữ liệu, không phải trên mọi thứ như tôi thích sử dụng cụm từ thông dụng khi tôi có thể mặc dù tôi thấy chúng khó làm việc. Bây giờ rõ ràng là tôi sẽ sử dụng mysql_real_escape_string khi dữ liệu đang đi vào cơ sở dữ liệu nhưng không chắc tôi nên sử dụng htmlentities() chỉ khi nhận dữ liệu từ cơ sở dữ liệu và hiển thị nó trên một trang web như trước khi bàn tay đang thay đổi dữ liệu được nhập bởi một người không giữ nguyên hình thức ban đầu có thể gây ra vấn đề nếu tôi muốn sử dụng dữ liệu đó sau này để sử dụng cho một thứ khác.

Ví dụ: tôi có một lưu bút với 3 tên trường, chủ đề và thông điệp. Bây giờ rõ ràng các trường có thể chứa bất kỳ thứ gì giống như mã độc trong thẻ js về cơ bản, bây giờ điều gì khiến tôi nhầm lẫn là tôi là một người độc hại và tôi đã quyết định sử dụng thẻ js và một số mã js độc hại và gửi biểu mẫu, bây giờ về cơ bản tôi có độc hại dữ liệu vô ích trong cơ sở dữ liệu của tôi. Bây giờ bằng cách sử dụng htmlentities khi xuất mã độc vào trang web (lưu bút) không phải là vấn đề vì htmlentities đã chuyển đổi nó thành an toàn tương đương nhưng sau đó cùng lúc tôi có mã độc vô dụng trong cơ sở dữ liệu mà tôi không muốn có. Vì vậy, sau khi nói tất cả điều này câu hỏi của tôi là tôi nên chấp nhận thực tế rằng một số dữ liệu trong cơ sở dữ liệu có thể độc hại, dữ liệu vô dụng và miễn là tôi sử dụng htmlentities trên đầu ra mọi thứ sẽ được ok hoặc tôi nên làm cái gì khác? .

Tôi đọc rất nhiều sách nói về lọc dữ liệu khi nhận nó và thoát nó khi xuất ra để biểu mẫu ban đầu được giữ nhưng chúng chỉ đưa ra các ví dụ như đảm bảo trường chỉ là một hàm đang sử dụng. Tôi chưa bao giờ tìm thấy bất cứ điều gì liên quan đến việc đảm bảo một thứ gì đó giống như một lưu bút mà bạn muốn người dùng gõ bất cứ thứ gì họ muốn mà còn cách bạn lọc dữ liệu đó ngoài mysql_real_escape_string() để đảm bảo nó không phá vỡ truy vấn DB?

Ai đó có thể vui lòng cuối cùng đóng sự nhầm lẫn này cho tôi và cho tôi biết tôi nên làm gì và thực hành tốt nhất là gì?

Nhờ bất kỳ ai có thể giải thích.

Chúc mừng!

Trả lời

2

Đây là một câu hỏi dài, nhưng tôi nghĩ rằng những gì bạn đang thực sự yêu cầu nắm để: "Tôi có nên thoát HTML trước khi chèn nó vào cơ sở dữ liệu của tôi, hoặc khi tôi đi để hiển thị nó"

Câu trả lời chung được chấp nhận cho câu hỏi này là bạn nên thoát HTML (qua số htmlspecialchars) khi bạn đi để hiển thị nó cho người dùng và không trước khi đưa nó vào cơ sở dữ liệu.

Lý do là: cơ sở dữ liệu lưu trữ dữ liệu. Những gì bạn đang đưa vào đó là những gì người dùng đã nhập.Khi bạn gọi mysql_real_escape_string, nó không thay đổi những gì được chèn vào cơ sở dữ liệu; nó chỉ tránh việc giải thích đầu vào của người dùng dưới dạng câu lệnh SQL. htmlspecialchars thực hiện điều tương tự cho HTML; khi bạn in đầu vào của người dùng, nó sẽ tránh việc nó được hiểu là HTML. Nếu bạn gọi htmlspecialchars trước khi chèn, bạn không còn trung thành nữa.

Bạn nên luôn cố gắng để có đại diện có độ trung thực cao nhất mà bạn có thể nhận được. Vì việc lưu trữ mã "độc hại" trong cơ sở dữ liệu của bạn không gây hại (trên thực tế, nó tiết kiệm cho bạn một số không gian, vì HTML đã thoát dài hơn không thoát!) Và bạn có thể trong tương lai muốn HTML đó (nếu bạn sử dụng Trình phân tích cú pháp XML trên các nhận xét của người dùng hoặc một số ngày cho phép người dùng đáng tin cậy có một tập hợp con HTML trong các nhận xét của họ, hoặc một số như vậy?), Tại sao không để cho nó được?

Bạn cũng hỏi một chút về các loại xác thực đầu vào khác (ràng buộc số nguyên, v.v.). Lược đồ cơ sở dữ liệu của bạn nên thực thi các lược đồ này, và chúng cũng có thể được kiểm tra ở lớp ứng dụng (tốt nhất là trên đầu vào thông qua JS và sau đó một lần nữa là phía máy chủ).

Lưu ý khác, cách tốt nhất để làm cơ sở dữ liệu thoát với PHP có lẽ là sử dụng PDO, thay vì gọi trực tiếp mysql_real_escape_string. PDO có chức năng nâng cao hơn, bao gồm kiểm tra kiểu.

1

mysql_real_escape_string() là tất cả những gì bạn cần cho các hoạt động cơ sở dữ liệu. Nó sẽ đảm bảo rằng người dùng độc hại không thể nhúng nội dung nào đó vào dữ liệu sẽ "ngắt" truy vấn của bạn.

htmlentities()htmlspecialchars() phát huy tác dụng khi bạn gửi nội dung tới ứng dụng khách/trình duyệt. Nếu bạn muốn dọn dẹp HTML có khả năng thù địch, bạn nên sử dụng HTMLPurifier, sẽ xóa dữ liệu vào nền tảng và ống nó xuống bằng thuốc tẩy và xây dựng lại nó đúng cách.

+0

Wow, cảm ơn bạn Marc B, không bao giờ biết tôi sẽ nhận được trả lời nhanh như vậy. Cảm ơn cho đầu vào của bạn tôi sẽ kiểm tra liên kết ra nhưng cũng điều này đã xóa tất cả mọi thứ lên. Rất may là trang web của tôi rất nhỏ nên không phải lo lắng nhưng ít nhất tôi có thể thay đổi mã của mình khi cần và làm những gì tôi nghĩ tôi cần làm như xác nhận của bạn. Tôi cảm thấy tự tin rằng tôi đang theo dõi lịch sử :) Rõ ràng nếu có ai khác muốn thêm bất kỳ đề xuất nào khác, vui lòng thực hiện. PS. Mong muốn trang web tuyệt vời tôi tìm thấy nó từ lâu, chỉ cần đăng ký :) – PHPLOVER

+0

Nó không bao giờ là quá sớm để bắt đầu làm việc trên bảo mật dữ liệu và tính toàn vẹn. Có thực sự không phải là nhiều đến nó, nhưng sớm hơn bạn nhận được vào thói quen điều trị bất cứ điều gì đến từ bên ngoài như chất thải độc hại, thì tốt hơn. Là một lớp bảo mật bổ sung, bạn có thể muốn điều tra bằng cách sử dụng PDO và các câu lệnh đã chuẩn bị, trừ khi bạn phải xây dựng các truy vấn không phù hợp với giới hạn của nó. –

+0

Cảm ơn Marc và mọi người khác, Thực sự đã trả lời tất cả các câu hỏi của tôi và hơn thế nữa, tôi đã học được rất nhiều từ việc viết bài này và cảm thấy thoải mái khi nói ít nhất là bây giờ :) Bạn đã giúp đỡ rất nhiều nhờ tất cả các bạn. – PHPLOVER

0

Không có lý do gì phải lo lắng về việc có mã JavaScript độc hại trong cơ sở dữ liệu nếu bạn đang thoát HTML khi nó xuất hiện. Chỉ cần chắc chắn rằng bạn luôn luôn thoát khỏi bất cứ điều gì mà đi ra khỏi DB.

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