2009-06-29 37 views
13

Tôi muốn chuẩn hóa UTF8 trên trang web của chúng tôi. Tất cả cơ sở dữ liệu và nội dung trên internet của chúng tôi đều ở dạng UTF8. Tất cả các máy chủ web của chúng tôi đang gửi tiêu đề HTTP charset=utf-8. Tuy nhiên tôi đã phát hiện ra rằng bằng cách thay đổi mã hóa trong Firefox của tôi (View -> Character Encoding) thành một cái gì đó khác, tôi có thể nhập một ký tự Latin-9 vào một form và PHP chỉ xử lý chúng như là UTF8 không đúng định dạng.Tôi có thể buộc trình duyệt web gửi văn bản biểu mẫu dưới dạng UTF8 không?

Tôi phải lo lắng về điều đó bao nhiêu? Trình duyệt web của người dùng có thể ghi đè tiêu đề bộ ký tự UTF8 và gửi không phải UTF8 không?

Cập nhật: Một số người đã đề xuất accept-charset trên các biểu mẫu riêng lẻ. Tuy nhiên tôi không muốn thay đổi mọi mẫu web. Giả sử tôi có thể kiểm soát tiêu đề kiểu nội dung HTTP và được đặt thành UTF8, tôi có lo lắng gì không?

+0

"Tất cả cơ sở dữ liệu và nội dung trên internet của chúng tôi" - tất cả nội dung trên internet của bạn đều thuộc về chúng tôi. –

+0

Theo câu trả lời được chấp nhận cho [câu hỏi này] (http://stackoverflow.com/questions/3719974/is-there-any-benefit-to-adding-accept-charset-utf-8-to-html-forms- if-the-page), 'accept-charset' sẽ giải quyết vấn đề cụ thể bạn đã phát hiện: tức là nếu người dùng yêu cầu trình duyệt của họ diễn giải trang là không phải UTF-8,' accept-charset' sẽ làm cho trình duyệt gửi biểu mẫu nội dung dưới dạng UTF-8 mặc dù vậy.Cho dù bảo vệ chống lại tình hình cụ thể đó là giá trị thêm thuộc tính cho tất cả các hình thức của bạn, tốt, đó là cuộc gọi phán xét của bạn. –

+1

đảm bảo trang của bạn thực sự là utf-8; trong trình gỡ lỗi trình duyệt, hãy tìm tiêu đề Kiểu nội dung được gửi. Ngoài ra, trong giao diện điều khiển JS, đánh giá document.charset; nên trả về một số chính tả của utf8. 'windows-1252' có thể có nghĩa là trình duyệt không nhận dạng được mã hóa được gửi. – OsamaBinLogin

Trả lời

3

Thử thêm thuộc tính accept-charset vào phần tử biểu mẫu của bạn.

2

Đặt phần tử accept-charset = "UTF-8" trên phần tử biểu mẫu, điều này sẽ làm cho biểu mẫu đăng thành UTF-8 bất chấp việc mã hóa nội dung trang.

10

Có thể cho web của người dùng trình duyệt ghi đè lên bộ ký tự utf8 tiêu đề và gửi không phải UTF8?

Tất nhiên. Bạn không kiểm soát máy khách và máy khách có thể làm bất cứ điều gì nó muốn, bao gồm cho phép người dùng ghi đè lên các mã hóa thông thường và gây ra rác (hoặc những gì chuyển cho rác) được gửi đến máy chủ của bạn.

Điều đó nói rằng, có vẻ như bạn đã thực hiện hầu hết các bước quan trọng tại đây. Tài liệu HTML thực tế của bạn được mã hóa UTF-8 và được đánh dấu rõ ràng như vậy, điều đó có nghĩa là các trình duyệt nói chung sẽ mặc định gửi biểu mẫu trong mã hóa đó. (Lưu ý rằng thông số HTML không yêu cầu điều này. Chỉ định accept-charset trên biểu mẫu một cách rõ ràng là chỉ bảo đảm chỉ tuân thủ.) Tôi nghi ngờ điều này sẽ hoạt động như mong đợi trong tất cả các trình duyệt hiện đại và bạn có thể thử nghiệm điều này một cách dễ dàng.

Trên máy chủ, công việc của bạn là luôn là để xác thực thông tin nhập của bạn trong phạm vi quan trọng đối với dịch vụ của bạn. Mặc dù phần lớn người dùng của bạn sẽ nhân từ và sử dụng các trình duyệt chuẩn hiện đại, giao thức HTTP đang mở, và cả người dùng lập dị và tin tặc độc hại đều có mặt ở đó và cả hai đều có thể ném bất kỳ loại dữ liệu nào họ muốn. Đảm bảo rằng bạn không đưa ra giả định về mã hóa dữ liệu khi bảo mật hoặc dữ liệu được xác thực có liên quan và vệ sinh công cụ này trước khi bạn đưa dữ liệu vào cơ sở dữ liệu.

4

Tôi nghĩ giải pháp tốt nhất là chuyển đổi sang UTF-8 và xử lý mọi ký tự không phải UTF-8 khi người dùng gửi dữ liệu. Như đã lưu ý ở trên, accept-charset="UTF-8" sẽ không đảm bảo dữ liệu đó là UTF-8. Và, nếu bạn phải thay đổi các biểu mẫu trên toàn bộ trang web của bạn thì đó không phải là giải pháp tốt.

Vì vậy, việc xử lý dữ liệu nhập khi gửi có thể là cách tốt hơn.

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