HTML、chmod、容器與 cron
四個實用程式背後的推理:為什麼 HTML 編輯器需要白名單和沙箱、為什麼 chmod 字串中的大寫 S 很重要、docker run 命令無法在 compose 中表達的內容,以及捕獲所有人的兩個 cron 規則。
HTML 編輯器:白名單,而不是過濾器
編輯器產生 HTML,而來自文字方塊的 HTML 是最古老的注入向量。這裡混淆了兩個不同的問題,因此值得將它們分開。第一個是“這個編輯器是否會被欺騙發出在顯示它的頁面中運行代碼的標記?”第二個問題是“這是一種從不信任的來源清除惡意 HTML 的安全方法嗎?”該工具對第一個問題的回答是“是”,對第二個問題的回答是“否”,並且它在面板上如此說明,而不是讓您做出其他假設。
該機制是允許名單。允許使用元素列表;所有其他元素都被展開,因此它的文字會保留下來,而它的標籤不會。每個元素允許有一個屬性清單;其他所有內容都被刪除,這使得每個事件處理程序都變得不可能,而不僅僅是被阻止。屬性名稱在該測試之前是小寫的,因此 oNeRrOr 和 ONERROR 與 onerror 是相同的拒絕名稱。 HTML 解析器將其內容視為原始文字(腳本、樣式、文字區域、iframe、標題)的元素與其內容一起刪除,因為展開它們會將腳本來源作為標記貼到文件中。
連結地址有自己的檢查。在讀取其方案之前,該值將被實體解碼並刪除空格和控製字符,因為這是瀏覽器在導航時所做的操作: javascript:alert(1) 和 jav ascript:alert(1) 都到達相同的位置。只有 http、https、mailto、tel、ftp 和相關地址倖存下來。該工具無法解析的字元引用(: 是經典的)會導致整個位址被拒絕而不是通過,因為比瀏覽器理解的輸入內容少的過濾器是一個有漏洞的過濾器。
沒有圖像按鈕,且 img 不在允許清單中。允許的圖像標籤是來自文件結束位置的出站請求,以及 onerror 表面。對於一個創作散文的編輯來說,這也不值得。
不依賴任何一個完美的防禦就是預覽。它在具有沙箱屬性的 iframe 中呈現,該沙箱屬性根本不授予任何內容 — 沒有腳本、沒有表單、沒有同源訪問。如果有效負載在允許清單中倖存下來,瀏覽器仍然會拒絕在那裡執行它。這是一種結構性保證,而不是對我們程式碼的承諾。
誠實的限制:這是一個基於字串的清理器,而不是一個完整的 HTML5 解析器。解析器差異(瀏覽器建立與此標記器不同的樹的輸入)是以這種方式建構的每個消毒器的已知弱點。對於輸出,您可以在這個編輯器中自己生成,這很好。若要清理來自陌生人的 HTML,請使用在您控制的伺服器上針對真實解析器執行的清理程式。
chmod:大写字母是整个消息
Unix 檔案模式為 12 位元:擁有者、群組和其他各三個權限位,加上 setuid、setgid 和黏性位。八進位形式是直接讀取這些位,這就是為什麼 4 + 2 + 1 = 7 表示讀取、寫入和執行。
ls 列印的符號形式是特殊位元變得有趣的地方,因為它們沒有自己的列。 setuid 取代擁有者執行字符,setgid 替換群組執行字符,sticky 取代其他執行字符。當底層執行位元也被設定時,該字母為小寫;當未設定時,該字母為大寫。
所以4755是rwsr-xr-x——一個可以執行的setuid程式——而4644是rwSr--r--,一個沒人可以運作的setuid檔。大寫的 S 是系統告訴您鑽頭是惰性的,這幾乎總是一個錯誤而不是一個選擇。這同樣適用於 1644,它顯示 rw-r--r-T:常規檔案上的黏滯位,其中其他執行位是清除的,而在現代核心上它完全不執行任何操作。
還有兩個差別值得澄清。 ls 列印的九個字元的字串不是 chmod 所採用的參數:chmod 需要一個賦值列表,例如 u=rwx,g=rx,o=rx,u+s。同樣的位在目錄上和在文件上意味著不同的東西——執行意味著“可以進入和遍歷”,setgid意味著“新文件繼承這個組”,而粘性位意味著“任何人都可以創建,只有所有者可以刪除”,這就是 /tmp 是 1777 的原因。
docker run to compose:解析,以及不轉換的內容
轉換器使用為此工具編寫的報價感知標記器來拆分命令。沒有任何內容被執行、評估或傳遞給 shell。包含反引號、$(...) 或分號的命令將被讀取為文字字符,因為該工具對您的輸入所做的唯一操作就是讀取它。
大多數標誌都清楚地映射:連接埠、磁碟區、環境、標籤、重新啟動策略、功能、運行狀況檢查、資源限制、DNS 和額外主機都具有具有相同意義的組合鍵。命名磁碟區和使用者定義的網路需要頂級聲明以及服務引用,因此輸出附帶一個 - 在網路上使用 external: true ,因為網路 docker run 可以加入已經存在的網路。
有些標誌沒有 compose 等效項,這就是轉換器通常會悄悄失敗的地方。 --rm 不是服務屬性:撰寫服務退出時不會被刪除。 -d 描述您如何呼叫 CLI,而不是服務是什麼。 --link 是遺留的,--mount 需要一個長格式,這個工具不寫,--gpus 取決於您的驅動程式。其中每一個都會產生一個命名警告而不是消失。未知標誌也會產生警告,並被視為沒有任何價值,因為猜測它有一個會將您的圖像名稱變成參數並產生一個肯定錯誤的檔案。
輸出不包含頂級版本:key。 Compose v2 會忽略它,當前版本會對此發出警告;自從 Compose 規範取代了舊的文件格式版本以來,它已經過時了。
引用不是裝飾性的。不含引號的 8080:80 形式的連接埠映射被 YAML 1.1 解析器讀取為數字,yes、no、on 和 off 是同一方言中的布林值。任何可能被誤讀的內容都會被引用;任何以字串形式清晰讀取的內容都會被保留,因此文件保持可讀。
Cron:兩條適用於所有人的規則
首先是日規。當月份和星期幾都設定為 * 以外的值時,cron 會在其中一個匹配時執行作業,而不是在兩者都匹配時執行作業。所以 0 0 13 * 5 是“13 號午夜,每週五午夜”,大約每月五次,而不是“13 號星期五”,每年一次或兩次。每當兩個欄位都受到限制時,產生器就會發出警告,並它所寫的句子是“或”而不是“和”。
第二個是時區。 Cron 使用它運行的機器的區域,通常是伺服器上的 UTC,而幾乎從來不是編寫 crontab 的人的區域。因此,下次執行預覽會詢問要使用哪個區域,而不是假設您的區域。時間是按照該區域的掛鐘時間計算的,因此日常工作在夏令時變化期間會保持相同的當地時間,而不是漂移一個小時——而且每年春天跳過的一小時中不存在的當地時間會被排除在列表之外,因為那時 cron 也不會運行。
語法本身很小:一個星號、一個數字、一個範圍 a-b、一個列表 a、b、c、一個步驟 */n 或 a-b/n,以及月份和日期名稱 JAN-DEC 和 SUN-SAT。 0和7都表示星期日。帶步長的裸值,例如分鐘欄位中的 5/15,表示“從 5 到範圍末尾,每 15”,即 5、20、35 和 50 分鐘。
驗證是有目的的嚴格的。 60 * * * * 被拒絕,因為分鐘停止於 59; * * * * 8 被拒絕,因為日期欄位在 7 處停止; */0 * * * 被拒絕,因為零步長不匹配任何內容。六個欄位通常意味著 Quartz 或 systemd 表達式的第一個欄位是秒,因此錯誤表明這一點而不僅僅是計數。語法上有效但永遠無法運作的計畫 — 0 0 30 2 * 要求 2 月 30 日 — 會被接受並標記,因為拒絕它是錯誤的,保持沉默會更糟。
你貼的內容會發生什麼
- 每個轉換、哈希、解碼和差異都在您的瀏覽器標籤中運行。不會在伺服器上傳、記錄或儲存任何輸入,因為頁面載入後就不再涉及伺服器。
- 雜湊值來自瀏覽器自己的 Web Crypto 實現,UUID 來自其加密安全隨機產生器。兩者都不涉及網絡調用。
- 您鍵入的任何內容都不會寫入本機儲存或 cookie。重新載入頁面會丟棄它;關閉選項卡將丟棄它。
- 站點範圍的分析僅在配置的規範生產主機上運行,並在隱私權政策中披露;本地和預覽主機拒絕它。貼上的值、令牌、URL 和文件內容不包括在 ToolAcre 自己的分析事件中。目前配置中停用廣告。
- 也就是說:JWT 或 API 金鑰是即時憑證。安全的習慣是永遠不要將其粘貼到不是您編寫的網頁中,無論其聲明多麼可信 - 包括這個。
問題
我可以將惡意 HTML 貼到編輯器中來清理它嗎?
您可以貼上它,但不會執行任何操作:貼上處理程序會在插入任何內容之前清理剪貼簿有效負載,並且預覽是一個沒有允許腳本的沙盒 iframe。但請勿將結果用作不受信任輸入的安全控制。這是一個基於字串的允許列表,用於一個編輯器自己的輸出,而不是通用的 XSS 過濾器,並且瀏覽器的解析器可以到達與像這樣的標記器不同的樹。對於不受信任的內容,請使用真正的 HTML5 解析器在伺服器上進行清理。
為什麼編輯要刪除我的圖片和表格?
因為他們不在許可名單上。圖像是出站請求和錯誤表面;表格根本不屬於該編輯器的用途。它們的文字內容會保留下來,而標籤則不會。這是允許名單的工作,而不是錯誤——但這確實意味著這不是編輯複雜的現有文件的正確工具。
為什麼 chmod 4644 顯示大寫的 S?
因為 setuid 已設置,但所有者執行位未設置。大寫字母意味著特殊位元沒有任何作用:它是一個無法執行的 setuid 檔案。小寫 s 表示兩個位元均已設定。同樣的規則為您提供了 S 代表 setgid 和 T 代表黏滯位,而將其倒退是模式計算器中最常見的錯誤。
docker 轉換器是否執行我的命令?
不,也不可能。這個指令由一個只理解引用的分詞器分割。沒有 eval、沒有 shell、沒有子進程——頁面無法啟動它們。您貼上的所有內容都會保留在選項卡中。
為什麼轉換器會發出警告而不是只丟棄它無法處理的標誌?
因為一個默默地執行比它來自的命令少的撰寫文件比根本沒有輸出更糟糕:你會在生產中發現。每個未代表的標誌都會被命名,並說明如何處理它。如果您沒有看到任何警告,則沒有任何損失。
為什麼下一個 cron 運行與我的伺服器運行的不同?
幾乎總是時區。 Cron 使用運行它的機器的區域;預覽使用您在下拉清單中選擇的區域。將其設定為您伺服器的區域(通常是 UTC),他們應該同意。另一個候選者是日期規則:如果同時設定了每月的某一天和每週的某一天,則 cron 會在其中任意一個上運行,這比大多數人預期的要頻繁。
限制
- HTML 清理器是該編輯器自己的輸出的允許列表,作為字串標記器而不是完整的 HTML5 解析器實作。它不是通用 XSS 過濾器,不得用作過濾器。
- 編輯器沒有圖像、表格、顏色或字體控件,也無法添加它們:允許列表之外的所有內容都將被刪除。
- 編輯介面使用 document.execCommand,它已被棄用並且沒有實現替代。瀏覽器仍然支援它;它們之間的行為略有不同,尤其是在清單嵌套方面。
- chmod 計算器僅涵蓋十二個權限位元。存取控制清單、擴充屬性、SELinux 上下文、umask 算術和 Windows ACL 均超出範圍。
- docker 轉換器將單一 docker run 指令轉換為單一服務。它不讀取 Dockerfiles,不解析映像,也不能表達 --mount、--gpus、--device、--link 或 --volumes-from;其中每一個都會產生一個命名警告。
- 轉換器無法識別的標誌將被視為無值。如果這樣的標誌確實取了一個,則該值將被誤讀 - 警告是這樣說的,刪除該標誌就是修復方法。
- cron 產生器僅讀取五個欄位 crontab 格式。六字段 Quartz 和 systemd 表达式、@reboot 以及非标准 L、W、# 和 ?操作员被拒绝而不是被猜测。
- 下次運行時間來自瀏覽器自己的時區資料庫,透過 Intl。它們是預覽,而不是保證:運行 cron 的機器可能有不同的區域、不同的資料庫版本,或在時間到來時未運行的守護程序。