2009-03-18 27 views
34

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?

+1

Bạn không chắc tại sao điều này lại bị giảm giá – Ross

+2

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

+2

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

Trả lời

23

Để 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.

+4

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

1

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

+0

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

+0

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

17

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 (xem strip_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.

-5

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.

+4

Vệ sinh cũng không giống như xác thực. –

+0

@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

+13

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

2

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.

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