Tiếng Việt

HTML, chmod, vùng chứa và cron

Lý do đằng sau bốn tiện ích: tại sao trình soạn thảo HTML cần danh sách cho phép và hộp cát, tại sao chữ S viết hoa trong chuỗi chmod lại quan trọng, lệnh chạy docker không thể biểu thị những gì trong soạn thư và hai quy tắc cron có thể nắm bắt được tất cả mọi người.

Trình chỉnh sửa HTML: danh sách cho phép, không phải bộ lọc

Trình chỉnh sửa tạo ra HTML và HTML xuất phát từ hộp văn bản là vectơ chèn lâu đời nhất hiện có. Hai câu hỏi khác nhau bị nhầm lẫn ở đây, vì vậy cần tách chúng ra. Đầu tiên là "liệu trình soạn thảo này có thể bị lừa tạo ra đánh dấu chạy mã trong trang hiển thị nó không?" Thứ hai là "đây có phải là cách an toàn để xóa HTML thù địch khỏi một nguồn không đáng tin cậy không?" Công cụ này trả lời có cho câu đầu tiên và không cho câu thứ hai, và nó sẽ nói như vậy trên bảng điều khiển thay vì để bạn giả định ngược lại.

Cơ chế này là một danh sách cho phép. Một danh sách các phần tử được cho phép; mọi phần tử khác đều được mở ra, vì vậy văn bản của nó vẫn tồn tại còn thẻ của nó thì không. Danh sách các thuộc tính được phép cho mỗi phần tử; mọi thứ khác đều bị loại bỏ, đó là điều khiến mọi trình xử lý sự kiện không thể thực hiện được thay vì chỉ bị chặn. Tên thuộc tính được viết thường trước lần kiểm tra đó, vì vậy oNeRrOr và ONERROR đều bị từ chối giống như onerror. Các phần tử có nội dung mà trình phân tích cú pháp HTML coi là văn bản thô — tập lệnh, kiểu, vùng văn bản, iframe, tiêu đề — sẽ bị xóa cùng với nội dung của chúng, vì việc mở gói chúng sẽ dán nguồn tập lệnh vào tài liệu dưới dạng đánh dấu.

Địa chỉ liên kết nhận được kiểm tra riêng của họ. Giá trị này được giải mã thực thể và loại bỏ khoảng trắng cũng như các ký tự điều khiển trước khi lược đồ của nó được đọc, bởi vì đó là những gì trình duyệt thực hiện khi nó điều hướng: javascript:alert(1) và jav ascript:alert(1) đều đến cùng một vị trí. Chỉ các địa chỉ http, https, mailto, tel, ftp và tương đối tồn tại. Tham chiếu ký tự mà công cụ không thể giải quyết — : là kiểu cổ điển — khiến toàn bộ địa chỉ bị từ chối thay vì được chuyển qua, bởi vì bộ lọc hiểu ít dữ liệu đầu vào hơn trình duyệt là bộ lọc có lỗ hổng trong đó.

Không có nút hình ảnh và img không có trong danh sách cho phép. Thẻ hình ảnh được phép là một yêu cầu gửi đi từ bất kỳ nơi nào tài liệu kết thúc và một bề mặt có lỗi. Đối với một người biên tập viết văn xuôi thì điều đó cũng không có giá trị gì.

Cách phòng thủ không phụ thuộc vào bất kỳ điều nào trong số này là hoàn hảo là bản xem trước. Nó hiển thị trong iframe với thuộc tính sandbox không cấp gì cả — không có tập lệnh, không biểu mẫu, không có quyền truy cập cùng nguồn gốc. Nếu một tải trọng vẫn tồn tại trong danh sách cho phép thì trình duyệt vẫn sẽ từ chối thực thi nó ở đó. Đó là một sự đảm bảo về mặt cấu trúc hơn là một lời hứa về quy tắc của chúng tôi.

Giới hạn trung thực: đây là trình khử trùng dựa trên chuỗi, không phải trình phân tích cú pháp HTML5 đầy đủ. Sự khác biệt của trình phân tích cú pháp - đầu vào trong đó trình duyệt xây dựng một cây khác với cây mã thông báo này đã làm - là điểm yếu đã biết của mọi trình khử trùng được xây dựng theo cách này. Đối với đầu ra, bạn tự tạo trong trình chỉnh sửa này là ổn. Để dọn dẹp HTML đến từ người lạ, hãy sử dụng trình khử trùng chạy trên trình phân tích cú pháp thực, trên máy chủ mà bạn kiểm soát.

Chmod: chữ in hoa là toàn bộ tin nhắn

Chế độ tệp Unix có mười hai bit: ba bit cấp phép cho mỗi chủ sở hữu, nhóm và người khác, cộng với setuid, setgid và bit dính. Dạng bát phân là cách đọc trực tiếp các bit đó, đó là lý do tại sao 4 + 2 + 1 = 7 có nghĩa là đọc, ghi và thực thi.

Dạng biểu tượng mà ls in ra là nơi các bit đặc biệt trở nên thú vị vì chúng không có cột riêng. setuid thay thế ký tự thực thi chủ sở hữu, setgid thay thế ký tự thực thi nhóm và Sticky thay thế ký tự thực thi khác. Chữ cái này là chữ thường khi bit thực thi cơ bản cũng được đặt và trường hợp UPPER khi không đặt.

Vậy 4755 là rwsr-xr-x — một chương trình setuid có thể được thực thi — trong khi 4644 là rwSr--r--, một tệp setuid mà không ai có thể chạy. Chữ S viết hoa là hệ thống cho bạn biết bit đó là trơ và nó hầu như luôn là một sai lầm chứ không phải là một sự lựa chọn. Điều tương tự cũng áp dụng cho 1644, hiển thị rw-r--r-T: một bit dính trên một tệp thông thường trong đó bit thực thi khác rõ ràng, điều này trên hạt nhân hiện đại chính xác không làm gì cả.

Hai điểm khác biệt nữa đáng được lưu ý. Chuỗi chín ký tự ls in ra không phải là đối số mà chmod lấy: chmod muốn một danh sách gán chẳng hạn như u=rwx,g=rx,o=rx,u+s. Và các bit giống nhau có nghĩa là những thứ khác nhau trên một thư mục so với trên một tệp - thực thi có nghĩa là "có thể nhập và truyền tải", setgid có nghĩa là "các tệp mới kế thừa nhóm này" và bit cố định có nghĩa là "bất kỳ ai cũng có thể tạo, chỉ chủ sở hữu mới có thể xóa", đó là lý do /tmp là 1777.

docker run để soạn thảo: phân tích cú pháp và những gì không chuyển đổi

Trình chuyển đổi phân tách lệnh bằng mã thông báo nhận biết trích dẫn được viết cho công cụ này. Không có gì được thực thi, đánh giá hoặc chuyển giao cho shell. Lệnh chứa dấu backticks, $(...) hoặc dấu chấm phẩy được đọc dưới dạng ký tự bằng chữ, bởi vì điều duy nhất mà công cụ này thực hiện với thông tin đầu vào của bạn là đọc nó.

Hầu hết các cờ đều ánh xạ rõ ràng: cổng, ổ đĩa, môi trường, nhãn, chính sách khởi động lại, khả năng, kiểm tra tình trạng, giới hạn tài nguyên, DNS và các máy chủ bổ sung đều có khóa soạn thảo có cùng ý nghĩa. Các khối được đặt tên và mạng do người dùng xác định cần có một khai báo cấp cao nhất cũng như tham chiếu dịch vụ, do đó, đầu ra mang một - với external: true trên các mạng, bởi vì một lệnh chạy docker mạng có thể tham gia là một lệnh đã tồn tại.

Một số cờ không có nội dung tương đương và đây là lúc các bộ chuyển đổi thường bị lỗi một cách âm thầm. --rm không phải là thuộc tính dịch vụ: dịch vụ soạn thư không bị xóa khi thoát. -d mô tả cách bạn gọi CLI chứ không phải dịch vụ là gì. --link là di sản, --mount cần một dạng dài mà công cụ này không viết, --gpus tùy thuộc vào trình điều khiển của bạn. Mỗi trong số này tạo ra một cảnh báo được đặt tên thay vì biến mất. Một cờ không xác định cũng tạo ra một cảnh báo và được coi là không có giá trị vì việc đoán rằng nó sẽ biến tên hình ảnh của bạn thành một đối số và tạo ra một tệp chắc chắn là sai.

Đầu ra không có phiên bản cấp cao nhất: key. Compose v2 bỏ qua nó và các phiên bản hiện tại cảnh báo về nó; nó đã lỗi thời kể từ khi Đặc tả Compose thay thế các phiên bản định dạng tệp cũ.

Trích dẫn không phải là mỹ phẩm. Ánh xạ cổng được viết dưới dạng 8080:80 không có dấu ngoặc kép sẽ được đọc dưới dạng số bởi trình phân tích cú pháp YAML 1.1 và có, không, bật và tắt là các boolean trong cùng một phương ngữ. Bất cứ điều gì có thể bị đọc sai đều được trích dẫn; bất cứ thứ gì đọc rõ ràng dưới dạng chuỗi sẽ được giữ nguyên, vì vậy tệp vẫn có thể đọc được.

Cron: hai quy tắc thu hút mọi người

Đầu tiên là quy tắc ngày. Khi cả ngày trong tháng và ngày trong tuần đều được đặt thành giá trị khác *, cron sẽ chạy công việc khi EITHER khớp — chứ không phải khi cả hai đều như vậy. Vì vậy 0 0 13 * 5 là "nửa đêm ngày 13 và nửa đêm thứ Sáu hàng tuần", tức là khoảng năm lần một tháng chứ không phải "Thứ Sáu ngày 13", tức là một hoặc hai lần một năm. Trình tạo cảnh báo bất cứ khi nào cả hai trường bị hạn chế và câu nó viết có nội dung là "hoặc" thay vì "và".

Thứ hai là múi giờ. Cron sử dụng vùng của máy mà nó chạy, thường là UTC trên máy chủ và hầu như không bao giờ là vùng của người viết crontab. Do đó, bản xem trước lần chạy tiếp theo sẽ hỏi vùng nào sẽ được sử dụng thay vì giả sử vùng của bạn. Thời gian được tính là thời gian trên đồng hồ treo tường trong vùng đó, do đó, công việc hàng ngày vẫn giữ nguyên giờ địa phương trong suốt thời gian thay đổi theo mùa thay vì trôi đi một giờ — và giờ địa phương không tồn tại, trong giờ bị bỏ qua vào mỗi mùa xuân, sẽ bị loại khỏi danh sách vì khi đó cron cũng sẽ không chạy.

Bản thân cú pháp rất nhỏ: một ngôi sao, một số, một dải ô a-b, một danh sách a,b,c, một bước */n hoặc a-b/n, và tên tháng và ngày JAN-DEC và SUN-SAT. Cả 0 và 7 đều có nghĩa là Chủ Nhật. Giá trị trần có một bước, chẳng hạn như 5/15 trong trường phút, có nghĩa là "từ 5 đến cuối phạm vi, cứ sau 15", tức là phút 5, 20, 35 và 50.

Xác nhận là nghiêm ngặt về mục đích. 60 * * * * bị từ chối vì số phút dừng ở 59; * * * * 8 bị từ chối vì trường ngày dừng ở 7; */0 * * * * bị từ chối vì bước 0 không khớp với gì. Sáu trường thường có nghĩa là biểu thức Quartz hoặc systemd có trường đầu tiên là giây, vì vậy lỗi cho biết điều đó thay vì chỉ đếm. Lịch trình hợp lệ về mặt cú pháp nhưng không bao giờ có thể chạy — 0 0 30 2 * yêu cầu vào ngày 30 tháng 2 — được chấp nhận và gắn cờ vì từ chối lịch đó sẽ là sai và giữ im lặng sẽ tệ hơn.

Điều gì xảy ra với những gì bạn dán

  • Mọi chuyển đổi, băm, giải mã và tìm khác biệt đều chạy trong tab trình duyệt của bạn. Không có đầu vào nào được tải lên, ghi lại hoặc lưu trữ trên máy chủ vì không có máy chủ nào liên quan sau khi trang được tải.
  • Băm đến từ việc triển khai Web Crypto của chính trình duyệt và UUID từ trình tạo ngẫu nhiên được bảo mật bằng mật mã của nó. Không liên quan đến cuộc gọi mạng.
  • Không có nội dung nào bạn nhập được ghi vào bộ nhớ cục bộ hoặc cookie. Tải lại trang sẽ loại bỏ nó; đóng tab sẽ loại bỏ nó.
  • Phân tích trên toàn trang web chỉ chạy trên máy chủ sản xuất chuẩn đã được định cấu hình và được tiết lộ trong Chính sách quyền riêng tư; máy chủ cục bộ và bản xem trước từ chối nó. Các giá trị, mã thông báo, URL và nội dung tệp đã dán sẽ bị loại trừ khỏi các sự kiện phân tích của chính ToolAcre. Quảng cáo bị vô hiệu hóa trong cấu hình hiện tại.
  • Điều đó cho biết: khóa JWT hoặc API là thông tin xác thực trực tiếp. Thói quen an toàn là không bao giờ dán nội dung này vào trang web mà bạn không viết, cho dù những tuyên bố của trang đó có đáng tin cậy đến đâu đi nữa - bao gồm cả trang này.

Câu hỏi

Tôi có thể dán HTML thù địch vào trình chỉnh sửa để xóa nó không?

Bạn có thể dán nó và sẽ không có gì thực thi: trình xử lý dán sẽ dọn sạch tải trọng bảng tạm trước khi chèn bất cứ thứ gì và bản xem trước là một iframe được đóng hộp cát không có tập lệnh cho phép. Tuy nhiên, không sử dụng kết quả làm biện pháp kiểm soát bảo mật cho đầu vào không đáng tin cậy. Đây là danh sách cho phép dựa trên chuỗi dành cho đầu ra của chính một người chỉnh sửa, không phải là bộ lọc XSS có mục đích chung và trình phân tích cú pháp của trình duyệt có thể tiếp cận một cây khác với cây mã thông báo như cây này. Đối với nội dung không đáng tin cậy, hãy vệ sinh trên máy chủ bằng trình phân tích cú pháp HTML5 thực.

Tại sao trình chỉnh sửa xóa hình ảnh và bảng biểu của tôi?

Bởi vì họ không nằm trong danh sách cho phép. Hình ảnh là một yêu cầu gửi đi và một bề mặt có lỗi; các bảng đơn giản nằm ngoài chức năng của trình soạn thảo này. Nội dung văn bản của họ tồn tại, còn các thẻ thì không. Đó là danh sách cho phép đang hoạt động chứ không phải lỗi — nhưng điều đó có nghĩa là đây không phải là công cụ phù hợp để chỉnh sửa một tài liệu phức tạp hiện có.

Tại sao chmod 4644 hiển thị chữ S viết hoa?

Bởi vì setuid được đặt và bit thực thi của chủ sở hữu thì không. Chữ in hoa có nghĩa là bit đặc biệt không có gì để thực hiện: đó là tệp setuid không thể thực thi được. Chữ thường s có nghĩa là cả hai bit đều được đặt. Quy tắc tương tự cung cấp cho bạn S cho setgid và T cho bit dính và việc đảo ngược nó là lỗi phổ biến nhất trong máy tính chế độ.

Trình chuyển đổi docker có chạy lệnh của tôi không?

Không, và nó không thể. Lệnh được phân chia bởi một mã thông báo hiểu được trích dẫn và không có gì khác. Không có eval, không có shell, không có tiến trình con - trang không có cách nào để bắt đầu một tiến trình con. Mọi thứ bạn dán vẫn ở trong tab.

Tại sao trình chuyển đổi cảnh báo thay vì chỉ thả cờ mà nó không thể xử lý?

Bởi vì một tệp soạn thảo âm thầm thực hiện ít hơn lệnh mà nó xuất phát còn tệ hơn là không có kết quả nào cả: bạn sẽ tìm hiểu trong quá trình sản xuất. Mỗi lá cờ không được đại diện đều được đặt tên và phải làm gì với nó. Nếu bạn không thấy cảnh báo, không có gì bị mất.

Tại sao các lần chạy cron tiếp theo lại khác với những gì máy chủ của tôi thực hiện?

Hầu như luôn luôn theo múi giờ. Cron sử dụng vùng của máy đang chạy nó; bản xem trước sử dụng vùng bạn đã chọn trong danh sách thả xuống. Đặt nó vào vùng máy chủ của bạn — thường là UTC — và họ sẽ đồng ý. Ứng cử viên còn lại là quy tắc ngày: nếu cả ngày trong tháng và ngày trong tuần được đặt, cron sẽ chạy theo một trong hai, điều này thường xuyên hơn hầu hết mọi người dự định.

Hạn chế

  • Trình dọn dẹp HTML là danh sách cho phép dành cho kết quả đầu ra của chính người chỉnh sửa này, được triển khai dưới dạng trình mã thông báo chuỗi thay vì trình phân tích cú pháp HTML5 đầy đủ. Đây không phải là bộ lọc XSS có mục đích chung và không được sử dụng làm bộ lọc.
  • Trình chỉnh sửa không có hình ảnh, bảng biểu, màu sắc hoặc điều khiển phông chữ và không có cách nào để thêm chúng: mọi thứ nằm ngoài danh sách cho phép đều bị xóa.
  • Giao diện chỉnh sửa sử dụng document.execCommand, giao diện này không được dùng nữa và chưa được triển khai thay thế. Các trình duyệt vẫn hỗ trợ nó; hành vi hơi khác nhau giữa chúng, đặc biệt là về việc lồng danh sách.
  • Máy tính chmod chỉ bao gồm 12 bit quyền. Danh sách kiểm soát truy cập, thuộc tính mở rộng, bối cảnh SELinux, số học umask và ACL Windows đều nằm ngoài phạm vi.
  • Trình chuyển đổi docker chuyển một lệnh chạy docker thành một dịch vụ duy nhất. Nó không đọc Dockerfiles, không phân giải hình ảnh và không thể biểu thị --mount, --gpus, --device, --link hoặc --volumes-from; thay vào đó, mỗi cái đó tạo ra một cảnh báo được đặt tên.
  • Các cờ mà trình chuyển đổi không nhận ra sẽ được coi là không có giá trị. Nếu một cờ như vậy đã lấy một cờ, giá trị sẽ bị đọc sai - cảnh báo cho biết như vậy và việc xóa cờ là cách khắc phục.
  • Trình tạo cron chỉ đọc định dạng crontab năm trường. Các biểu thức thạch anh và systemd sáu trường, @reboot và L, W, # và ? các nhà khai thác bị từ chối thay vì đoán.
  • Thời gian chạy tiếp theo được lấy từ cơ sở dữ liệu múi giờ của chính trình duyệt thông qua Intl. Chúng là bản xem trước, không phải là sự đảm bảo: máy chạy cron có thể có vùng khác, phiên bản cơ sở dữ liệu khác hoặc daemon không chạy khi đến thời điểm.