Có phải filter_var
có lợi ích gì cho việc lọc dữ liệu không? Loại dữ liệu xấu nào sẽ lọc? Tôi sử dụng mysql_real_escape_string
nhưng tôi tự hỏi liệu việc thêm filter_var
có giúp ích gì không?Filter_var có phải là một cách hay không?
Trả lời
Để bảo vệ khỏi các câu lệnh chuẩn bị sẵn sàng sử dụng SQL injection nếu có thể. Nếu không, hãy sử dụng mysql_real_escape_string cho chuỗi, (int) casting hoặc intval() cho số nguyên, (float) hoặc floatval() cho float và addcslashes ($ input, '% _') cho chuỗi được sử dụng trong các câu lệnh LIKE. Mọi thứ trở nên phức tạp hơn khi cố gắng thoát khỏi các chuỗi được sử dụng bên trong các câu lệnh RLIKE.
Đối với lọc nội dung HTML, tốt nhất là nên strip_tags (mà không đi $ allowable_tags), nhưng ... bạn có thể không thích/muốn nó, trong trường hợp này là giải pháp hợp lý nhất là:
$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset);
Một giải pháp đáng tin cậy hơn là sử dụng thư viện như HTML Purifier
Chức năng lọc là OK, nhưng một số hàm là bộ xác thực hợp lệ hơn bộ lọc. Tùy thuộc vào nhu cầu của bạn, bạn có thể thấy một số trong số đó hữu ích.
htmlspecialchars() là điều đúng đắn cần làm để xuất văn bản sang HTML. strip_tags() sẽ mất nội dung nếu bạn muốn sử dụng ký tự ‘<’ hợp lệ trong văn bản và sẽ không hiển thị ‘&’ đúng cách. – bobince
Nó thực sự phụ thuộc vào những gì bạn đang cố gắng làm, tôi thực sự không thể trả lời mà không biết chi tiết cụ thể. Các bộ lọc và hiệu ứng của chúng có thể được liệt kê tại đây: Types of filters
Về cơ bản để lọc và xác thực bất kỳ khai thác xss hoặc mysql nào đến từ đầu vào của người dùng. – mikelbring
Có quá nhiều cách (http://ha.ckers.org/xss.html) của XSS và SQL injection. Tất cả phụ thuộc vào ứng dụng của bạn như thế nào nó xử lý dữ liệu người dùng. – Gumbo
Bạn điều chỉnh filter_var
bằng cách sử dụng nó với FILTER_*
constants. Có vẻ như bạn đang tìm kiếm sanitisation dữ liệu (thực sự điều chỉnh dữ liệu để làm cho dữ liệu an toàn *) thay vì validation (kiểm tra dữ liệu an toàn).
Các bộ lọc khác nhau có thể trợ giúp với các tác vụ khác nhau. Trong khi mysql_real_escape_string
là ok cho vệ sinh dữ liệu để ngăn chặn SQL injection nó không tốt cho xuất dữ liệu có thể chứa HTML. Dưới đây là một vài bộ lọc của tôi muốn sử dụng cho công việc hàng ngày:
FILTER_SANITIZE_SPECIAL_CHARS
- hữu ích cho việc hiển thị (không loại bỏ) HTML, ngăn chặn các cuộc tấn công XSS và chuyển đổi biểu tượng để các thực thể HTML.FILTER_SANITIZE_STRING
với cờSTRIP_LOW/HIGH
- thực sự xóa HTML (xemstrip_tags
).FILTER_SANITIZE_URL
- làm cho URL an toàn *.FILTER_SANITIZE_EMAIL
- làm cho địa chỉ email an toàn, mặc dù tôi muốn sử dụng nó là người anh em họ xác thực trước khi lưu địa chỉ.
* Tôi sử dụng an toàn lỏng lẻo, tôi cho rằng bạn không bao giờ có thể quá chắc chắn.
Chỉ dựa trên một số thử nghiệm nhỏ, tôi đã đi đến kết luận rằng hằng số của filter_var
không đáng tin cậy.
Ví dụ:
filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // valid
filter_var('http://.', FILTER_VALIDATE_URL); // valid
filter_var('[email protected]', FILTER_SANITIZE_EMAIL); // [email protected]
filter_var('http://.', FILTER_SANITIZE_URL); // http://.
Đây là những giá trị rõ ràng không hợp lệ, nhưng vượt qua filter_var
's hằng số. Không tin tưởng filter_var
.
Vệ sinh cũng không giống như xác thực. –
@Mathew, bạn đúng nhưng tôi không chắc chắn những gì đã làm với các vấn đề với 'filter_var' tôi chỉ ra. Nó sẽ không lọc chính xác và cũng không chính xác khử trùng các yếu tố đầu vào mà tôi đã cung cấp. – eyelidlessness
Theo như tôi thấy trong http://tools.ietf.org/html/rfc822 địa chỉ email được xây dựng chính xác. Đặc biệt, 'c' có thể được đăng ký như một TLD mới, và' b-'một tên miền trong đó (' -' là một ký tự hợp lệ). Tôi thấy không có vấn đề ở đó. Không phải là '! Def! Xyz% abc + tag @ [127.0.0.1]' một địa chỉ hợp lệ? Tôi sẽ không nhanh chóng bật lên bất kỳ ví dụ nào về tên miền, mặc dù tôi có thể cho bạn biết rằng 'dig .' đưa ra một phản hồi hợp lý và' stackoverflow.com.' trả về cùng một ip như 'stackoverflow.com' (có, dấu chấm trên url đầu tiên). Tôi đồng ý với 'filter_var' và PHP trong này. – Iiridayn
Tất cả phụ thuộc vào ý bạn là url hợp lệ hoặc email hợp lệ.
Ví dụ: [email protected]
- tốt, bạn có thể lọc các tên miền cấp cao nhất để loại trừ .c
nhưng danh sách tên miền cấp cao nhất không phải là hằng số. Hơn nữa tất cả các ký tự đều hợp lệ. Mặc dù điều này có vẻ lạ và gần như chắc chắn không hợp lệ, nhiều bộ lọc regex cũng sẽ xác thực nó.
Với email [email protected]
hoặc url http://.
nếu được hiển thị hoặc sử dụng trong liên kết, chúng sẽ không gây hại, ngay cả khi chúng không đi đến đâu cả.
Tôi nghĩ một phần của vấn đề là câu hỏi bạn muốn bộ lọc của mình lỏng lẻo đến mức nào. Nếu mối quan tâm lớn là XSS hoặc SQL injection hoặc ngăn chặn đầu vào nguy hiểm, có hay không giá trị có thể sử dụng có thể không liên quan, do đó, loại bộ lọc này có thể thực hiện thủ thuật.
Nếu bạn muốn đảm bảo giá trị không chỉ an toàn mà còn có thể sử dụng được, đó là một con thú khó hơn.
- 1. List.ForEach có phải là một phần của LINQ hay không?
- 2. CSS lớn có phải là một ý tưởng hay không?
- 3. PropertySanged event testing: đây có phải là cách hay không?
- 4. cách để biết chuỗi có phải là base64 hay không
- 5. MSMQ có phải là ý tưởng hay không
- 6. Xóa đầu vào cin: cin.ignore có phải là một cách hay không?
- 7. có phải là websockets an toàn hay không?
- 8. Một biến đó không phải là công hay tư-Java
- 9. Rails/ActiveRecord: phát hiện xem một cột có phải là một liên kết hay không
- 10. Có phải viết một daemon bằng Python là một ý tưởng hay không?
- 11. Chức năng 'include' của php có phải là một hàm hay một câu lệnh không?
- 12. Cách tăng tên biến/Đây có phải là ý tưởng không hay không
- 13. Java - Cách kiểm tra xem một bộ phận có phải là một số nguyên hay một phao không?
- 14. Có phải quá trình forking trong PHP/Apache là một ý tưởng hay không?
- 15. WPF ControlTemplates phải có TargetType hay không?
- 16. Singleton đơn lẻ có phải là một ý tưởng hay không?
- 17. Dịch vụ web REST sử dụng MVC, đó có phải là một ý tưởng hay không?
- 18. Khi có cột nhận dạng không phải là một ý tưởng hay?
- 19. Việc đăng nhập vào hàng đợi thư có phải là một ý tưởng hay không?
- 20. Xử lý lỗi - đây có phải là một mẫu khá hay không?
- 21. Các lớp trợ giúp CSS toàn cầu có phải là một ý tưởng hay không?
- 22. Có phải là một cách hay để làm cho người xây dựng rõ ràng
- 23. Cách kiểm tra xem biến có phải là số hay chuỗi không?
- 24. Cách xác định xem ứng dụng có phải là ứng dụng web hay không
- 25. Đây có phải là cách hay để giải phóng bộ nhớ không?
- 26. activerecord làm mô hình, đây có phải là một ý tưởng hay không?
- 27. Gooang có phải là một thông dịch viên hay trình biên dịch không?
- 28. Có phải logic nghiệp vụ trong các nhà thầu là một ý tưởng hay không?
- 29. Lớp học "sở thích chính" có phải là một ý tưởng hay không?
- 30. Đây có phải là cách hay để xác định Kiến trúc OS không?
Bạn không chắc tại sao điều này lại bị giảm giá – Ross
Bạn nên cố gắng hiểu những gì XSS và SQL tiêm là gì và tại sao chúng có thể thay vì yêu cầu một phép lạ để ngăn chặn chúng. – Gumbo
Sẽ giúp gì? Những gì bạn đang cố gắng để làm điều đó bạn hy vọng filter_var sẽ thực hiện? – jmucchiello