Golang vệ sinh html

từ chối trách nhiệm. đây không phải là bài đăng hoặc thông tin liên lạc chính thức của Google, chỉ là tôi nhận xét về nội dung nào đó hiện có sẵn

Nhóm infosec của Google vừa phát hành gói Go “safehtml”. Nếu bạn quan tâm đến việc làm cho ứng dụng của mình linh hoạt với XSS phía máy chủ, bạn có thể muốn áp dụng nó thay vì “html/mẫu”. Việc di chuyển sang safehtml sẽ khá đơn giản vì nó chỉ là một nhánh rẽ cứng của gói tiêu chuẩn html/mẫu ban đầu. Nếu bạn không có lỗi lớn trong ứng dụng của mình thì việc chuyển đổi nó sang sử dụng phiên bản an toàn sẽ không quá phức tạp.

Đây là những gì Google sử dụng nội bộ để bảo vệ sản phẩm khỏi XSS

Nếu bạn chỉ muốn sử dụng nó mà không cần đọc qua phần giải thích, bạn có thể chuyển đến

Các vấn đề với “html/mẫu”

“html/template” không có khái niệm “làm bẩn” và không theo dõi cách các loại nguy hiểm như được xây dựng. Chỉ có một dòng trong tài liệu nêu rõ

Sử dụng loại này có rủi ro bảo mật. nội dung được đóng gói phải đến từ một nguồn đáng tin cậy, vì nó sẽ được bao gồm nguyên văn trong đầu ra mẫu

Điều này không chỉ thiếu lời giải thích về “tại sao” và “làm thế nào” để sử dụng loại này, mà nó còn được sử dụng rất phổ biến, khiến nó trở thành một cạm bẫy rất nguy hiểm cùng với tất cả các loại khác có dòng đó trong tài liệu [bảy

Hơn nữa, “html/mẫu” có một số vấn đề thường trực không có cách nào tốt để khắc phục đúng cách mà không vi phạm tính tương thích ngược. Sự cân bằng giữa khả năng bị hỏng và lợi ích bảo mật không rõ ràng, vì vậy nếu bạn muốn chọn tham gia để an toàn hơn, có lẽ bạn nên bỏ “html/template”

Lưu ý rằng tôi đang duy trì “html/template” [ở đây tôi là empijei], vì vậy tôi nói với bạn điều này với một chút thông tin cơ bản về việc bị cắn bởi gói đó. Nếu tôi có thể di chuyển tất cả người dùng sang phiên bản an toàn một cách kỳ diệu, tôi sẽ

Cấu trúc

Safehtml bao gồm một số gói. Tùy thuộc vào hệ thống xây dựng hoặc chuỗi công cụ của công ty bạn, có một số ràng buộc mà bạn nên thực thi. Nhóm bảo mật của công ty bạn hoặc những người hiểu biết về bảo mật nên thiết lập điều này cho mọi người

an toànhtml

Đây là gói gốc và nó chỉ cung cấp các loại an toàn khi xây dựng. Đây là cách nó hoạt động một cách ngắn gọn

  • Chỉ có 3 cách để xây dựng
    • , đảm bảo an toàn khi sử dụng
    • , sử dụng tự động thoát theo ngữ cảnh, vì vậy nó an toàn [bạn có thể đọc thêm về điều này trong bài viết trước của tôi]
    • , hầu hết là an toàn và thực tế đòi hỏi ý định xấu để phạm sai lầm

Điều này đảm bảo rằng mọi phiên bản của loại HTML được biết là an toàn. Hoạt động tương tự nhưng thay vì có các mẫu, nó chỉ có thể được tạo từ các hằng số hoặc dữ liệu. Để diễn đạt khái niệm về “hằng số thời gian biên dịch”, nó có , vì vậy cách duy nhất để gọi chúng là a [tôi thấy đây là một thủ thuật rất gọn gàng]

Tất cả các loại khác trong gói này theo một mẫu tương tự

safehtml/mẫu

Đây là sự thay thế “html/mẫu” thực sự của bạn và là gói mà mọi người nên sử dụng. Nếu "chuyển đổi kế thừa" và "chuyển đổi không được kiểm tra" [đọc bên dưới] không được sử dụng và tất cả các phản hồi HTML của bạn được tạo bởi gói này, thì bạn có thể đảm bảo rằng sẽ không có bất kỳ XSS phía máy chủ nào trong các sản phẩm của bạn

Chúng tôi đang nghiên cứu các công cụ để đảm bảo điều kiện cuối cùng này là đúng, nhưng sẽ mất một chút thời gian. Hãy theo dõi để cập nhật

safehtml/legacyconversions

Gói này chỉ nên được sử dụng để chuyển đổi sang API an toàn. Nó cho phép bất kỳ chuỗi tùy ý nào trở thành loại an toàn để quá trình chuyển đổi sang safehtml có thể rất nhanh chóng và tất cả mã mới sẽ an toàn. Khi quá trình di chuyển đã xảy ra, việc sử dụng gói này sẽ bị ngăn chặn. Như tên gọi. đây chỉ dành cho mã kế thừa, không nên sử dụng mã mới nào và tất cả các cách sử dụng gói này sẽ dần dần được cấu trúc lại để sử dụng các hàm tạo an toàn thay thế

safehtml/testconversions

Gói này chỉ nên được sử dụng trong các mục tiêu thử nghiệm và chỉ khi cần thiết. Bạn nên thiết lập một số linters để đảm bảo nó

safehtml/uncheckedconversions

Đây là vấn đề sắc thái nhất. Đôi khi API safehtml quá bất tiện hoặc thậm chí không thể sử dụng. Đôi khi bạn phải sử dụng các mẫu không an toàn vì bạn muốn làm điều gì đó không thể chứng minh là an toàn [e. g. lấy một số HTML mà bạn tin tưởng từ cơ sở dữ liệu và cung cấp nó cho khách hàng]

Đối với những tình huống rất hiếm gặp này, bạn có thể sử dụng gói này. Việc nhập nó nên được giới hạn trong một nhóm người phụ thuộc được chọn thủ công và mỗi lần nhập mới sẽ yêu cầu một số người có nhận thức về bảo mật xem xét nó

Đảm bảo rằng việc sử dụng là an toàn và sẽ luôn an toàn vì các chuyển đổi không được kiểm soát không làm tăng tính an toàn. Chúng chỉ ở đó để thông báo cho trình biên dịch rằng bạn đã xem lại mã và muốn nó được tin cậy. Thực hiện theo các hướng dẫn này

  • chỉ sử dụng nếu thực sự cần thiết [e. g. nếu sử dụng safehtml/template yêu cầu nhiều công việc hơn một chút nhưng thực hiện công việc, hãy thực hiện thêm công việc]
  • tài liệu lý do tại sao việc sử dụng là an toàn cho người đánh giá và người bảo trì trong tương lai
  • thu hẹp ngữ cảnh bằng cách giảm sự phụ thuộc của chuyển đổi không được kiểm soát vào các đối số chức năng kèm theo, các trường cấu trúc có thể được sửa đổi tùy ý, v.v.

Tập quán của gói này là điểm thất bại duy nhất của bạn, vì vậy hãy đảm bảo bạn làm theo những điều này. [Câu này giả định rằng cuối cùng bạn sẽ thoát khỏi các chuyển đổi cũ]

Một ví dụ về việc sử dụng đúng gói này sẽ là đầu ra của chất khử trùng. Nếu bạn cần nhúng một số HTML mà người dùng của bạn cung cấp vào phản hồi [e. g. bởi vì bạn hiển thị đánh dấu hoặc bạn có một webmail], bạn sẽ làm sạch HTML đó. Sau khi nó được làm sạch [nếu trình khử trùng của bạn được triển khai đúng cách], bạn có thể sử dụng một chuyển đổi không được kiểm tra để thăng cấp nó lên loại HTML

an toànhtml/thô

Nhập gói này nên được ngăn chặn. Mọi thứ nằm ngoài cây thư mục “safehtml/” sẽ không hiển thị gói này

safehtml/safehtmlutil

Vâng, tôi biết, không phải là một cái tên hay. Hãy xem xét rằng gói này, giống như gói trước, cũng không được nhập bên ngoài safehtml và nó chỉ được tạo để giảm trùng lặp mã và tránh phụ thuộc theo chu kỳ. Tôi đồng ý rằng gói này có thể được đặt tên hoặc có cấu trúc khác, nhưng vì bạn sẽ không bao giờ tương tác với gói này nên bạn không nên quá bận tâm

Cách thực hiện tái cấu trúc

Printf và các mẫu lồng nhau

Một ví dụ về mã mà bạn có thể có là

var theLink template.HTML = fmt.Sprintf["the link`
t := template.Must[template.New["outer"].Parse[outer]]
t = template.Must[t.New["inner"].Parse[inner]]
t.ExecuteTemplate[os.Stdout, "outer", map[string]string{"URL": myLink}]

hằng số

Nếu bạn có mã HTML const, bạn chỉ cần sử dụng nó làm mẫu và thực thi nó thành html. Điều này sẽ kiểm tra xem tất cả các thẻ có cân bằng không và những thứ khác và trả về một phiên bản của loại HTML

Vì vậy, điều này

var myHtml template.HTML := `

This is a title

`

trở thành cái này

myHtml := template.MustParseAndExecuteToHTML[`

This is a title

`
]

danh sách kiểm tra
  1. Chặn quyền truy cập vào một số gói
  • Ngăn các gói bên ngoài thư mục “safehtml” nhập “raw”, “uncheckedconversions” và “safehtmlutil”
  • Chỉ cho phép các bản dựng thử nghiệm nhập gói “testconversions”
  1. Di chuyển khỏi “html/template” và thay thế nó bằng “safehtml/template”
  • Đối với mọi sự cố hoặc mọi vấn đề, hãy sử dụng cuộc gọi "chuyển đổi kế thừa". Có thể cần thực hiện một số thao tác tái cấu trúc thủ công, nhưng quá trình di chuyển sẽ khá đơn giản
  • CHẠY TẤT CẢ THỬ NGHIỆM TÍCH HỢP VÀ E2E CỦA BẠN. Điều này quan trọng, quan trọng đến mức tôi đã sử dụng SHIFT chứ không phải CAPS để nhập
  • Chặn danh sách chuyển đổi cũ. kể từ thời điểm này, việc nhập mới gói "chuyển đổi kế thừa" bị cấm
  • Cấm sử dụng “html/template”, để tất cả mã mới được an toàn
  1. Tái cấu trúc các chuyển đổi cũ để sử dụng các mẫu an toàn
  • Bất cứ nơi nào có thể xây dựng HTML theo cách an toàn và xóa các chuyển đổi cũ
  • Trường hợp không thể sử dụng chuyển đổi không được kiểm soát. Mỗi lần nhập mới gói "chuyển đổi không được kiểm tra" phải được xem xét
kết luận

Nếu bạn muốn chắc chắn rằng mình không có XSS phía máy chủ trong mã Go thì đây có lẽ là cách tốt nhất để làm như vậy. Nếu bạn có bất kỳ câu hỏi nào hoặc cần thêm các ví dụ tái cấu trúc, vui lòng cho tôi biết, bạn có thể liên hệ với tôi trên twitter [tin nhắn trực tiếp đang mở] hoặc qua email

Khi nào bạn nên dọn dẹp HTML?

Khử trùng HTML là một chiến lược được OWASP đề xuất để ngăn chặn các lỗ hổng XSS trong các ứng dụng web . Khử trùng HTML cung cấp một cơ chế bảo mật để xóa nội dung không an toàn [và có khả năng độc hại] khỏi các chuỗi HTML thô không đáng tin cậy trước khi hiển thị chúng cho người dùng.

Điều gì có nghĩa là vệ sinh HTML?

Khử trùng HTML là quá trình kiểm tra tài liệu HTML và tạo tài liệu HTML mới chỉ giữ lại bất kỳ thẻ nào được chỉ định là “an toàn” và mong muốn. HTML sanitization can be used to protect against cross-site scripting [XSS] attacks by sanitizing any HTML code submitted by a user.

Bạn có nên vệ sinh đầu vào của người dùng?

Khử trùng và xác thực đầu vào thường là lớp bảo vệ đầu tiên . Sanitizing bao gồm xóa bất kỳ ký tự không an toàn nào khỏi đầu vào của người dùng và xác thực sẽ kiểm tra xem dữ liệu có ở định dạng và loại dự kiến ​​hay không. Những kẻ tấn công đã sử dụng các lỗ hổng cổ điển trong nhiều năm với tỷ lệ thành công khá cao.

Chủ Đề