Chà, đến bữa tiệc muộn một chút, nhưng dường như có một chút hiểu lầm về việc autocomplete
nên và không nên làm việc như thế nào . Theo thông số kỹ thuật HTML, tác nhân người dùng (trong trường hợp này là Chrome) có thể ghi đè autocomplete
:
https://www.w3.org/TR/html5/forms.html#autofilling-form-controls:-the-autocomplete-attribution
Tác nhân người dùng có thể cho phép người dùng ghi đè tên trường tự động điền của phần tử, ví dụ: thay đổi từ "tắt" thành "bật" để cho phép các giá trị được ghi nhớ và điền trước bất chấp sự phản đối của tác giả trang hoặc luôn luôn "tắt", không bao giờ nhớ các giá trị. Tuy nhiên, tác nhân người dùng không nên cho phép người dùng ghi đè một cách tầm thường tên trường tự động điền từ "tắt" sang "bật" hoặc vì các giá trị bảo mật quan trọng cho người dùng nếu tất cả các giá trị luôn được ghi nhớ, bất kể tùy chọn của trang web.
Vì vậy, trong trường hợp của Chrome, các nhà phát triển về cơ bản đã nói "chúng tôi sẽ để người dùng quyết định tùy chọn của họ cho dù họ muốn autocomplete
làm việc hay không. Nếu bạn không muốn, đừng kích hoạt nó trong trình duyệt của bạn" .
Tuy nhiên, có vẻ như đây là một chút quá nhiệt tình về phần họ theo ý thích của tôi, nhưng nó là như vậy. Đặc điểm kỹ thuật cũng thảo luận về ý nghĩa bảo mật tiềm năng của một động thái như vậy:
Từ khóa "tắt" chỉ ra rằng dữ liệu đầu vào của điều khiển đặc biệt nhạy cảm (ví dụ mã kích hoạt cho vũ khí hạt nhân); hoặc đó là một giá trị sẽ không bao giờ được sử dụng lại (ví dụ: khóa một lần để đăng nhập ngân hàng) và do đó người dùng sẽ phải nhập dữ liệu rõ ràng mỗi lần, thay vì có thể dựa vào UA để điền trước giá trị cho anh ta; hoặc rằng tài liệu cung cấp cơ chế tự động hoàn thành của chính nó và không muốn tác nhân người dùng cung cấp các giá trị tự động hoàn thành.
Vì vậy, sau khi trải qua sự thất vọng giống như mọi người khác, tôi đã tìm ra một giải pháp phù hợp với mình. Nó tương tự như tĩnh mạch vớiautocomplete="false"
câu trả lời.
Một bài viết của Mozilla nói về chính xác vấn đề này:
https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turn_off_form_autocompletion
Trong một số trường hợp, trình duyệt sẽ tiếp tục đề xuất các giá trị tự động hoàn thành ngay cả khi thuộc tính tự động hoàn thành được đặt thành tắt. Hành vi bất ngờ này có thể khá khó hiểu cho các nhà phát triển. Mẹo để thực sự buộc không hoàn thành là gán một chuỗi ngẫu nhiên cho thuộc tính
Vì vậy, đoạn mã sau nên hoạt động:
autocomplete="nope"
Và mỗi thứ sau đây cũng nên như vậy:
autocomplete="false"
autocomplete="foo"
autocomplete="bar"
Vấn đề tôi thấy là tác nhân trình duyệt có thể đủ thông minh để tìm hiểu autocomplete
thuộc tính và áp dụng nó vào lần tiếp theo khi nó nhìn thấy biểu mẫu. Nếu nó làm điều này, cách duy nhất tôi có thể thấy để giải quyết vấn đề sẽ là thay đổi linh hoạtautocomplete
giá trị thuộc tính khi trang được tạo.
Một điểm đáng nói là nhiều trình duyệt sẽ bỏ qua autocomplete
các cài đặt cho các trường đăng nhập (tên người dùng và mật khẩu). Như bài viết của Mozilla nêu:
Vì lý do này, nhiều trình duyệt hiện đại không hỗ trợ autocomplete = "off" cho các trường đăng nhập.
- Nếu một trang web đặt autocomplete = "off" cho một biểu mẫu và biểu mẫu bao gồm các trường nhập tên người dùng và mật khẩu, thì trình duyệt vẫn sẽ cung cấp để nhớ thông tin đăng nhập này và nếu người dùng đồng ý, trình duyệt sẽ tự động điền vào các trường đó vào lần tiếp theo người dùng truy cập trang này.
- Nếu một trang web đặt autocomplete = "tắt" cho các trường nhập tên người dùng và mật khẩu, thì trình duyệt vẫn sẽ cung cấp để nhớ thông tin đăng nhập này và nếu người dùng đồng ý, trình duyệt sẽ tự động điền các trường đó vào lần tiếp theo người dùng truy cập trang này.
Đây là hành vi trong Firefox (kể từ phiên bản 38), Google Chrome (từ 34) và Internet Explorer (kể từ phiên bản 11).
Cuối cùng một thông tin nhỏ về việc thuộc tính thuộc về form
phần tử hay input
phần tử. Thông số kỹ thuật một lần nữa có câu trả lời:
Nếu thuộc tính tự động hoàn thành bị bỏ qua, giá trị mặc định tương ứng với trạng thái thuộc tính tự động hoàn thành của chủ sở hữu mẫu của phần tử được sử dụng thay thế ("bật" hoặc "tắt"). Nếu không có chủ sở hữu biểu mẫu, thì giá trị "bật" được sử dụng.
Vì thế. Đặt nó trên biểu mẫu nên áp dụng cho tất cả các trường đầu vào. Đặt nó vào một yếu tố riêng lẻ nên áp dụng cho chỉ yếu tố đó (ngay cả khi không có yếu tố nào trên biểu mẫu). Nếuautocomplete
không được đặt ở tất cả, nó mặc định là on
.
Tóm lược
Để vô hiệu hóa autocomplete
trên toàn bộ biểu mẫu:
<form autocomplete="off" ...>
Hoặc nếu bạn cần phải làm điều đó:
<form autocomplete="random-string" ...>
Để vô hiệu hóa autocomplete
trên một thành phần riêng lẻ (bất kể cài đặt biểu mẫu có mặt hay không)
<input autocomplete="off" ...>
Hoặc nếu bạn cần phải làm điều đó:
<input autocomplete="random-string" ...>
Và hãy nhớ rằng các tác nhân người dùng nhất định có thể ghi đè ngay cả những nỗ lực chiến đấu khó khăn nhất của bạn để vô hiệu hóa autocomplete
.