Một nhà tiếp thị kỹ thuật cần thực sự hiểu mã hóa ASCII-to-Unicode — ít nhất là bao gồm mã hóa URL [%NNNN
, a. k. a. mã hóa phần trăm] và mã hóa HTML [_______7/NNNN;
, a. k. a. mã hóa dấu và]
Và lý tưởng nhất là mã hóa Q [______9, a. k. a. mã hóa dòng chủ đề] quá
Nhưng bạn không thể chỉ mã hóa mọi thứ “đề phòng. ” Cả không mã hóa khi bạn nên và mã hóa khi không nên đều có thể khiến email, trang và biểu mẫu bị lỗi nghiêm trọng
Việc mã hóa nhầm đó có hại đã xuất hiện trong một chủ đề Marketo Nation gần đây. Một người dùng đã sao chép một số JS ban đầu có một dòng như thế này
Nhưng vì lý do nào đó, CMS của họ [không phải Marketo] đã quyết định "sửa lỗi" khi nó được dán vào trình chỉnh sửa của họ
Như bạn có thể thấy,
0 đã được thay thế bằng tham chiếu ký tự HTML của nó,
0. Ví dụ cụ thể về mã hóa HTML đó cực kỳ nổi tiếng, chỉ có đối thủ là
0Nhưng có một vấn đề
Bạn không mã hóa HTML bên trong một
1Tuy nhiên, hãy tưởng tượng nếu logic chuyển hướng nằm trong trình xử lý sự kiện
Go Somewhere
Trong trường hợp này, việc mã hóa giá trị không chỉ an toàn mà còn chính xác vì đó là một thuộc tính
Phương thức
2 áp dụng mã hóa HTML cho một chuỗi để ngăn một ký tự đặc biệt được hiểu là thẻ HTML. Phương pháp này hữu ích để hiển thị văn bản có thể chứa các ký tự HTML "đặc biệt" như dấu ngoặc kép, dấu ngoặc nhọn và các ký tự khác theo ngôn ngữ HTML. Điều này tương đương với
3 trong ASPCharacterConverted To
4 {dấu nháy kép}
4
6 {dấu nháy đơn / dấu nháy đơn}
6 1
0
0
0
0
21
21{dấu cách}
23 2{tab}
24{return} / {linefeed}
25 31. Dấu nháy đơn phải được mã hóa thành thực thể
6 tuy nhiên Internet Explorer không nhận ra thực thể này. Kết quả là, dấu nháy đơn được mã hóa bằng điểm mã số #39. 2. Một khoảng trắng không được mã hóa cho thực thể
23. Nếu gặp nhiều hơn một khoảng trắng liên tiếp, thì tất cả các khoảng trắng sau ký tự khoảng trắng đầu tiên được chuyển đổi thành
23. 3. Mọi kết hợp xuống dòng - linefeed [
29] được chuyển đổi thành một thẻ HTML
25 duy nhất. Do đó, chuỗi {return-linefeed} được chuyển đổi thành
25, nhưng chuỗi {return}{return} được chuyển đổi thành
32. Để tương thích với trình duyệt hiện có, thẻ Break được viết là
25 thay vì
25 hoặc
25. Hầu hết trình duyệt sẽ chấp nhận cả ba biểu mẫu, tuy nhiên một số trình duyệt web có thể không thích thẻ
25. Thẻ
25 không được khuyên dùng vì nó không tương thích với XML/XHTML. Cách sử dụng.
Bạn nên sử dụng phương thức
2 mỗi khi muốn hiển thị văn bản từ cây phả hệ như tên, nhận xét hoặc bất kỳ trường dữ liệu nào khác. Phương pháp
2 có thể được sử dụng để tạo siêu liên kết HTML. strName = Util.HtmlEncode[i.name]
Report.Write strName
Mẹo.
Trình tạo báo cáo có phương thức
40 tự động mã hóa HTML. Xem thêm.
______141
Phương thức HTMLEncode áp dụng mã hóa HTML cho một chuỗi đã chỉ định
cú pháp
Người phục vụ. Mã hóa HTML[chuỗi]
Tham sốChuỗi mô tảBắt buộc. Chuỗi để mã hóa
Thí dụ
kịch bản sau
response.write[Server.HTMLEncode["The image tag: "]]
%>
đầu ra
The image tag:
Đầu ra trình duyệt web
thẻ hình ảnh.
❮ Hoàn thành tham chiếu đối tượng máy chủMáy chủ ASP. Phương thức HTMLEncode[] được sử dụng để chuyển đổi mã HTML thành chuỗi. Nó được sử dụng để mã hóa dữ liệu biểu mẫu và dữ liệu yêu cầu của khách hàng khác trước khi sử dụng nó trong ứng dụng web. Khi chuỗi được mã hóa là một bộ ký tự byte kép, phương thức này sẽ chuyển đổi các ký tự như dưới đây
Một câu hỏi phổ biến mà tôi nghe được từ các nhà phát triển là khi nào thì họ nên mã hóa dữ liệu của mình. Bảo vệ chống lại tập lệnh chéo trang thực sự có thể khó khăn và thật tốt khi biết được sự nhiệt tình để mã hóa đúng cách. Tôi đã thấy các nhà phát triển HTML mã hóa dữ liệu của họ trước khi lưu trữ nó trong cơ sở dữ liệu, ngay khi họ lấy dữ liệu từ cơ sở dữ liệu, trong lớp nghiệp vụ và nhiều nơi khác. Vì vậy, có bất cứ điều gì sai trái với những kỹ thuật này?
Câu hỏi đầu tiên mà nhà phát triển cần biết khi quyết định mã hóa dữ liệu của họ cho đầu ra là dữ liệu đó sẽ được sử dụng trong bối cảnh nào. Như tôi đã đề cập trước đây, kịch bản chéo trang có thể khó khắc phục. Dữ liệu có được xuất ra trong ngữ cảnh Phần tử HTML không? . Tôi nghĩ rằng bạn sẽ có được điểm. Tất cả những thứ này thực sự có các kỹ thuật mã hóa khác nhau do các ký tự cần được mã hóa
Hãy nghĩ về HTML mã hóa dữ liệu của chúng tôi trước khi lưu trữ nó trong cơ sở dữ liệu. Tại thời điểm đó trong ứng dụng, chúng ta có biết chắc chắn 100% rằng dữ liệu chỉ được sử dụng trong ngữ cảnh Phần tử HTML khi nó được xuất ra không? . Với thời gian đáp ứng yêu cầu của thị trường, các ứng dụng đang thay đổi nhanh chóng
Giả sử chúng ta đang nói về đầu vào dữ liệu Tên công ty. Có thể khi tôi lần đầu tiên xây dựng ứng dụng, nó chỉ xuất ra trình duyệt dưới dạng nhãn nên nó nằm trong ngữ cảnh phần tử HTML. Vì vậy, Mã hóa HTML này trước khi chuyển đến cơ sở dữ liệu sẽ hoạt động ngay bây giờ. Điều gì sẽ xảy ra nếu trong lần phát hành tiếp theo, chúng tôi đưa tên công ty vào một thuộc tính làm văn bản thay thế của hình ảnh cho biểu tượng công ty của chúng tôi? . Trong. mạng 4. 0, đây sẽ là một ví dụ tồi vì HTMLEncode và HTMLAttributeEncode mã hóa các ký tự giống nhau, nhưng nếu bạn đang sử dụng một khung trước đó như 2 thì sao?. 0? . Nếu dữ liệu này được sử dụng trong JavaScript hoặc trong một URL thì sao? . Chúng tôi có phải giải mã dữ liệu trước khi gửi đến báo cáo đã chọn không? .
Như bạn có thể thấy, rất khó để thực sự nắm bắt được tất cả những nơi mà dữ liệu của chúng ta sẽ được sử dụng trong suốt thời gian tồn tại của các ứng dụng của chúng ta. Tôi luôn khuyên các nhà phát triển nên mã hóa vào giây phút cuối cùng trước khi gửi dữ liệu ra hệ thống bên ngoài. Tôi biết tôi đang sử dụng tập lệnh chéo trang làm ví dụ, nhưng điều này áp dụng cho tất cả các biện pháp giảm thiểu tiêm nhiễm.
Vậy tại sao lại là khoảnh khắc cuối cùng? .
- Đây thực sự là lần duy nhất bạn biết bối cảnh chính xác mà dữ liệu sẽ được sử dụng trong. Ngay cả khi đây là biến cấp độ lớp trong mã phía sau tệp, chỉ tại điểm đầu ra chính xác, bạn mới biết ngữ cảnh là gì.
- Nó làm cho việc xem xét mã dễ dàng hơn nhiều vì người đánh giá có thể thấy mã hóa rõ ràng tại điểm cần thực hiện. Điều này tiết kiệm rất nhiều thời gian vì người đánh giá không cần phải thực hiện nhiều lần theo dõi ứng dụng để xem ứng dụng có được mã hóa trước đó hay không. Nó cũng làm giảm việc sử dụng bối cảnh mã hóa sai khi nó rõ ràng ở đầu ra
- Dễ dàng kiểm tra xem nhà phát triển có bỏ lỡ mã hóa hay không. Không ai cho rằng dữ liệu đã được mã hóa ở đâu đó trên dòng
Nếu bạn đang sử dụng cùng một thành phần dữ liệu nhiều lần trong một phản hồi và lo ngại về hiệu suất mã hóa dữ liệu này ở mọi đầu ra thì có thể có một giải pháp thay thế. Bạn có thể tạo một biến và lưu trữ phiên bản được mã hóa của dữ liệu trong đó. Điều này sẽ chỉ cho phép mã hóa một lần nhưng sử dụng cùng một dữ liệu nhiều lần. Điều QUAN TRỌNG là nếu bạn định sử dụng phương pháp này, tên của biến phải cho biết loại mã hóa của dữ liệu. Điều này cho phép bạn biết nó sẽ hoạt động trong bối cảnh nào, cũng như cho các nhà phát triển khác biết dữ liệu không ở dạng thô
Nếu bạn chỉ sử dụng một biến như “var companyName” thì không có dấu hiệu nào cho thấy biến này được mã hóa. Nhưng nếu bạn sử dụng “var companyNameHTMLLEnc” thì rõ ràng là dữ liệu không ở dạng thô. Trong hầu hết các trường hợp, tôi không khuyên bạn nên làm theo cách này vì nó có thể gây nhầm lẫn, nhưng nếu bạn đang sử dụng một biến để giữ dữ liệu của mình, điều này sẽ giúp mọi việc trở nên đơn giản hơn