很可惜 T 。T 您現(xiàn)在還不是作者身份,不能自主發(fā)稿哦~
如有投稿需求,請把文章發(fā)送到郵箱tougao@appcpx.com,一經(jīng)錄用會有專人和您聯(lián)系
咨詢?nèi)绾纬蔀榇河鹱髡哒埪?lián)系:鳥哥筆記小羽毛(ngbjxym)
如果你從事軟件工程方面的工作,很可能你聽說過至少一條軟件工程原則。雖然我不主張嚴格遵守每一條原則,但有一些確實是值得關注的。
我今天要講的就是最小驚訝原則,它有一個奇特的名字,但卻是一個非常簡單的想法。它所說的是,當呈現(xiàn)聲稱要做某件事的代碼時,大多數(shù)用戶都會假設它是如何完成這件事的。因此,作為開發(fā)人員,你的工作是編寫符合這些假設的代碼,這樣你的用戶就不會感到意外。
這是一個很好的原則,因為開發(fā)人員喜歡對事物進行假設。如果你導出一個名為calculateScore(GameState) 的函數(shù),很多人就會假設該函數(shù)只會從游戲狀態(tài)中讀取。如果你還改變了游戲狀態(tài),你會使得很多人面臨困惑的狀態(tài),他們試圖弄清楚為什么他們的游戲狀態(tài)會隨機被破壞。即使你把它放在文檔中,仍然不能保證人們會看到它,所以最好首先確保你的代碼不會令人驚訝。
“6小時的調(diào)試工作,可以為你們節(jié)省5分鐘的文檔閱讀時間?!?/p>
早在 2018 年初,當ERC-721 標準被起草出來時,有人就提出了實施轉(zhuǎn)賬安全性?的建議,以確保代幣不會被卡在不用于處理代幣的接受者合約中。為此,提案作者修改了transfer函數(shù)的行為,以檢查接收方是否能夠支持代幣轉(zhuǎn)賬。他們還引入了unsafeTransfer函數(shù),如果發(fā)送者愿意,該函數(shù)將繞過這個檢查。
然而,由于擔心向后兼容性,這個函數(shù)在隨后的提交中被重命名了。這使得ERC-20 和 ERC-721 代幣的transfer函數(shù)表現(xiàn)相同。但是,現(xiàn)在需要將接收方檢查轉(zhuǎn)移到其他地方。因此,標準作者就引入了safe類函數(shù):safeTransfer 以及 safeTransferFrom。
這是一個關于正當性問題的解決方案,因為有許多 ERC-20 代幣被意外轉(zhuǎn)移到從未期望收到代幣的合約的例子(一個特別常見的錯誤是將代幣轉(zhuǎn)移到代幣合約中,將其永久鎖定)。而在起草 ERC-1155 標準時,提案作者從ERC-721標準汲取了靈感,不僅在轉(zhuǎn)賬時,而且在鑄造(mint)也納入了接收方檢查,這一點也不足為奇。
在接下來的幾年里,這些標準大多處于休眠狀態(tài),而 ERC-20代幣標準保持了它的流行狀態(tài),而最近gas成本的飆升,以及社區(qū)對NFT興趣的增強,自然而然導致開發(fā)者越來越多地使用ERC-721和ERC-1155代幣標準。有了這些新的興趣,我們應該慶幸這些標準的設計考慮了安全性,對嗎?
Ok,但對于轉(zhuǎn)帳和鑄造來說,安全意味著什么呢?不同的當事人對安全有不同的解釋。對于開發(fā)人員來說,一個安全函數(shù)可能意味著它不包含任何bug或引入額外的安全問題。而對于用戶來說,這可能意味著它包含額外的護欄,以保護他們不被意外射中自己的腳。
事實證明,在這種情況下,這些函數(shù)更多的是后者,而較少會是前者。這是特別令人遺憾的,因為在transfer和safeTransfer函數(shù)之間進行選擇時,你為什么不選擇安全的那個函數(shù)呢?名字都體現(xiàn)出來了!
好吧,其中的一個原因可能是我們的老朋友reentrancy(可重入性),或者我一直在努力將其重命名為:不安全的外部調(diào)用?;叵胍幌?,如果接收方是攻擊者控制的,則任何外部調(diào)用都可能不安全,因為攻擊者可能會導致你的合約轉(zhuǎn)換為未定義狀態(tài)。根據(jù)設計,這些“安全”函數(shù)執(zhí)行對代幣接收者的外部調(diào)用,通常在鑄造或轉(zhuǎn)移期間由發(fā)送者控制。換句話說,這實際上是不安全外部調(diào)用的教科書示例。
但是,你可能會問自己,如果允許接收方合約拒絕他們無法處理的轉(zhuǎn)賬,那最壞的后果是什么?好吧,讓我通過兩個案例研究來回答這個問題。
Hashmasks是一個供應有限的 NFT頭像項目,用戶每次交易最多可以購買 20 個mask NFT(盡管它們已經(jīng)售罄數(shù)月了)。下面是購買mask的函數(shù):
你可能覺得這個函數(shù)看起來非常合理。然而,正如你可能已經(jīng)預料到的,在 _safeMint 調(diào)用中隱藏著一些險惡的東西。讓我們來看看。
為了安全性,這個函數(shù)對token的接受者執(zhí)行了一次callback回調(diào),以檢查他們是否愿意接受轉(zhuǎn)賬。然而,我們是token的接收者,這意味著我們剛剛得到了一次callback回調(diào),在這個點上我們可以做任何我們想做的事情,包括再次調(diào)用mintNFT函數(shù)。如果我們這樣做,我們將在僅鑄造了一個mask后重調(diào)用該函數(shù),這意味著我們可以請求再鑄造另外19個mask。這導致最終鑄造出了39個 mask NFT,盡管規(guī)則允許鑄造的最大數(shù)量只有20個。
最近,來自ENS 的Nick Johnson聯(lián)系了我,他想讓我看看他們正在進行的ENS域名封裝器工作。這個域名封裝器允許用戶用新的ERC-1155 token代幣化他們的ENS域名,這提供了對細粒度權(quán)限以及更一致的 API 的支持。
概括地說,為了封裝任何ENS域名(更具體地說,除了 2LD.eth 之外所有的ENS域名),你必須首先批準域名封裝器以訪問你的ENS域名。然后,你調(diào)用wrap(bytes,address,uint96,address),它既為你鑄造一個ERC-1155 token,也負責管理底層的ENS域名。
下面就是這個wrap函數(shù),它相當簡單。首先,我們調(diào)用_wrap,它執(zhí)行一些邏輯并返回哈希域名。然后,我們確保交易發(fā)送方確實是ENS域名的所有者,然后再接管該域名。請注意,如果發(fā)送方不擁有底層的ENS域名,則整個交易應還原,撤銷在_wrap 中所做的任何更改。
下面是_wrap函數(shù)本身,這里沒有什么特別的。
不幸的是,正是這個 _mint 函數(shù),它可能會給毫無戒心的開發(fā)者帶來可怕的驚喜。ERC-1155 規(guī)范規(guī)定,在鑄造token時,應咨詢接收者是否愿意接受該token。在深入研究庫代碼(該代碼庫根據(jù)OpenZeppelin的基礎稍作了修改)后,我們發(fā)現(xiàn)情況確實如此。
但這到底對我們有什么好處呢?好的,我們再一次看到了一個不安全的外部調(diào)用,我們可以用它來執(zhí)行重入攻擊。具體地說,請注意,在callback回調(diào)期間,我們擁有了代幣ENS域名的ERC-1155 token,但域名封裝器尚未驗證我們擁有基礎ENS域名本身。這使我們能夠在不實際擁有ENS域名的情況下對其進行操作。例如,我們可以要求域名封裝器解開我們的域名,燃燒掉我們剛剛鑄造的token并獲取底層的ENS域名。
現(xiàn)在我們擁有了底層的ENS域名,我們可以用它做任何我們想做的事情,比如注冊新的子域名或者設置解析器。完成后,我們只需退出callback回調(diào)。域名封裝器將和底層ENS域名的當前所有者(即我們)交互,并完成交易。就像那樣,我們已經(jīng)取得了域名封裝器被批準用于的任何ENS域名的臨時所有權(quán),并對其進行了任意更改。
令人驚訝的代碼可能會以災難性的方式破壞事物。在本文的兩個案例下,開發(fā)人員合理地假設safe函數(shù)類可以安全地使用,卻無意中增加了他們的攻擊面。隨著ERC-721和ERC-1155代幣標準變得越來越流行及廣泛,這類攻擊情況很可能會越來越頻繁。開發(fā)人員需要考慮使用safe類函數(shù)的風險,并確定外部調(diào)用如何與他們編寫的代碼進行交互。
本文為作者獨立觀點,不代表鳥哥筆記立場,未經(jīng)允許不得轉(zhuǎn)載。
《鳥哥筆記版權(quán)及免責申明》 如對文章、圖片、字體等版權(quán)有疑問,請點擊 反饋舉報
我們致力于提供一個高質(zhì)量內(nèi)容的交流平臺。為落實國家互聯(lián)網(wǎng)信息辦公室“依法管網(wǎng)、依法辦網(wǎng)、依法上網(wǎng)”的要求,為完善跟帖評論自律管理,為了保護用戶創(chuàng)造的內(nèi)容、維護開放、真實、專業(yè)的平臺氛圍,我們團隊將依據(jù)本公約中的條款對注冊用戶和發(fā)布在本平臺的內(nèi)容進行管理。平臺鼓勵用戶創(chuàng)作、發(fā)布優(yōu)質(zhì)內(nèi)容,同時也將采取必要措施管理違法、侵權(quán)或有其他不良影響的網(wǎng)絡信息。
一、根據(jù)《網(wǎng)絡信息內(nèi)容生態(tài)治理規(guī)定》《中華人民共和國未成年人保護法》等法律法規(guī),對以下違法、不良信息或存在危害的行為進行處理。
1. 違反法律法規(guī)的信息,主要表現(xiàn)為:
1)反對憲法所確定的基本原則;
2)危害國家安全,泄露國家秘密,顛覆國家政權(quán),破壞國家統(tǒng)一,損害國家榮譽和利益;
3)侮辱、濫用英烈形象,歪曲、丑化、褻瀆、否定英雄烈士事跡和精神,以侮辱、誹謗或者其他方式侵害英雄烈士的姓名、肖像、名譽、榮譽;
4)宣揚恐怖主義、極端主義或者煽動實施恐怖活動、極端主義活動;
5)煽動民族仇恨、民族歧視,破壞民族團結(jié);
6)破壞國家宗教政策,宣揚邪教和封建迷信;
7)散布謠言,擾亂社會秩序,破壞社會穩(wěn)定;
8)宣揚淫穢、色情、賭博、暴力、兇殺、恐怖或者教唆犯罪;
9)煽動非法集會、結(jié)社、游行、示威、聚眾擾亂社會秩序;
10)侮辱或者誹謗他人,侵害他人名譽、隱私和其他合法權(quán)益;
11)通過網(wǎng)絡以文字、圖片、音視頻等形式,對未成年人實施侮辱、誹謗、威脅或者惡意損害未成年人形象進行網(wǎng)絡欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法規(guī)禁止的其他內(nèi)容;
2. 不友善:不尊重用戶及其所貢獻內(nèi)容的信息或行為。主要表現(xiàn)為:
1)輕蔑:貶低、輕視他人及其勞動成果;
2)誹謗:捏造、散布虛假事實,損害他人名譽;
3)嘲諷:以比喻、夸張、侮辱性的手法對他人或其行為進行揭露或描述,以此來激怒他人;
4)挑釁:以不友好的方式激怒他人,意圖使對方對自己的言論作出回應,蓄意制造事端;
5)羞辱:貶低他人的能力、行為、生理或身份特征,讓對方難堪;
6)謾罵:以不文明的語言對他人進行負面評價;
7)歧視:煽動人群歧視、地域歧視等,針對他人的民族、種族、宗教、性取向、性別、年齡、地域、生理特征等身份或者歸類的攻擊;
8)威脅:許諾以不良的后果來迫使他人服從自己的意志;
3. 發(fā)布垃圾廣告信息:以推廣曝光為目的,發(fā)布影響用戶體驗、擾亂本網(wǎng)站秩序的內(nèi)容,或進行相關行為。主要表現(xiàn)為:
1)多次發(fā)布包含售賣產(chǎn)品、提供服務、宣傳推廣內(nèi)容的垃圾廣告。包括但不限于以下幾種形式:
2)單個帳號多次發(fā)布包含垃圾廣告的內(nèi)容;
3)多個廣告帳號互相配合發(fā)布、傳播包含垃圾廣告的內(nèi)容;
4)多次發(fā)布包含欺騙性外鏈的內(nèi)容,如未注明的淘寶客鏈接、跳轉(zhuǎn)網(wǎng)站等,誘騙用戶點擊鏈接
5)發(fā)布大量包含推廣鏈接、產(chǎn)品、品牌等內(nèi)容獲取搜索引擎中的不正當曝光;
6)購買或出售帳號之間虛假地互動,發(fā)布干擾網(wǎng)站秩序的推廣內(nèi)容及相關交易。
7)發(fā)布包含欺騙性的惡意營銷內(nèi)容,如通過偽造經(jīng)歷、冒充他人等方式進行惡意營銷;
8)使用特殊符號、圖片等方式規(guī)避垃圾廣告內(nèi)容審核的廣告內(nèi)容。
4. 色情低俗信息,主要表現(xiàn)為:
1)包含自己或他人性經(jīng)驗的細節(jié)描述或露骨的感受描述;
2)涉及色情段子、兩性笑話的低俗內(nèi)容;
3)配圖、頭圖中包含庸俗或挑逗性圖片的內(nèi)容;
4)帶有性暗示、性挑逗等易使人產(chǎn)生性聯(lián)想;
5)展現(xiàn)血腥、驚悚、殘忍等致人身心不適;
6)炒作緋聞、丑聞、劣跡等;
7)宣揚低俗、庸俗、媚俗內(nèi)容。
5. 不實信息,主要表現(xiàn)為:
1)可能存在事實性錯誤或者造謠等內(nèi)容;
2)存在事實夸大、偽造虛假經(jīng)歷等誤導他人的內(nèi)容;
3)偽造身份、冒充他人,通過頭像、用戶名等個人信息暗示自己具有特定身份,或與特定機構(gòu)或個人存在關聯(lián)。
6. 傳播封建迷信,主要表現(xiàn)為:
1)找人算命、測字、占卜、解夢、化解厄運、使用迷信方式治??;
2)求推薦算命看相大師;
3)針對具體風水等問題進行求助或咨詢;
4)問自己或他人的八字、六爻、星盤、手相、面相、五行缺失,包括通過占卜方法問婚姻、前程、運勢,東西寵物丟了能不能找回、取名改名等;
7. 文章標題黨,主要表現(xiàn)為:
1)以各種夸張、獵奇、不合常理的表現(xiàn)手法等行為來誘導用戶;
2)內(nèi)容與標題之間存在嚴重不實或者原意扭曲;
3)使用夸張標題,內(nèi)容與標題嚴重不符的。
8.「飯圈」亂象行為,主要表現(xiàn)為:
1)誘導未成年人應援集資、高額消費、投票打榜
2)粉絲互撕謾罵、拉踩引戰(zhàn)、造謠攻擊、人肉搜索、侵犯隱私
3)鼓動「飯圈」粉絲攀比炫富、奢靡享樂等行為
4)以號召粉絲、雇用網(wǎng)絡水軍、「養(yǎng)號」形式刷量控評等行為
5)通過「蹭熱點」、制造話題等形式干擾輿論,影響傳播秩序
9. 其他危害行為或內(nèi)容,主要表現(xiàn)為:
1)可能引發(fā)未成年人模仿不安全行為和違反社會公德行為、誘導未成年人不良嗜好影響未成年人身心健康的;
2)不當評述自然災害、重大事故等災難的;
3)美化、粉飾侵略戰(zhàn)爭行為的;
4)法律、行政法規(guī)禁止,或可能對網(wǎng)絡生態(tài)造成不良影響的其他內(nèi)容。
二、違規(guī)處罰
本網(wǎng)站通過主動發(fā)現(xiàn)和接受用戶舉報兩種方式收集違規(guī)行為信息。所有有意的降低內(nèi)容質(zhì)量、傷害平臺氛圍及欺凌未成年人或危害未成年人身心健康的行為都是不能容忍的。
當一個用戶發(fā)布違規(guī)內(nèi)容時,本網(wǎng)站將依據(jù)相關用戶違規(guī)情節(jié)嚴重程度,對帳號進行禁言 1 天、7 天、15 天直至永久禁言或封停賬號的處罰。當涉及欺凌未成年人、危害未成年人身心健康、通過作弊手段注冊、使用帳號,或者濫用多個帳號發(fā)布違規(guī)內(nèi)容時,本網(wǎng)站將加重處罰。
三、申訴
隨著平臺管理經(jīng)驗的不斷豐富,本網(wǎng)站出于維護本網(wǎng)站氛圍和秩序的目的,將不斷完善本公約。
如果本網(wǎng)站用戶對本網(wǎng)站基于本公約規(guī)定做出的處理有異議,可以通過「建議反饋」功能向本網(wǎng)站進行反饋。
(規(guī)則的最終解釋權(quán)歸屬本網(wǎng)站所有)