文首發:看雪論壇 http://bbs.pediy.com/thread-217315.htm
04
指定站點攻擊
雖然多數站點使用如前面所談到的流行的framebusting技術,但是一些站點選擇開發自身的framebusting技術,在這部分,我們將討論一些在調查中發現的很有趣的防御手段,并且展示一些相關的技術來挫敗他們。
4.1
黑暗中的一束光
Facebook的framebusting方法和流行的方法大不相同。它不是在自身框架外進行破壞,而是插入一個灰色的半透明div標簽,這個標簽包括了一個框架頁面的所有內容,當用戶點擊div的任何一處,facebook就破壞框架。這個巧妙的方法允許內容被框架的同時,阻止了點擊劫持攻擊。以下是帶漏洞的代碼版本,我們已經報告給facebook。
If(top!= self){
Window.document.write(“<divstyle=’background:black; opacity: 0.5;filter:alpha(opacity=50);position:absolute; top:0px; left:0px; width:9999px;height:9999px; z-index: 1000001’ onClick=’top.location.href=window.location.href’></div>”)
當被框架時,這段代碼插入一個黑色的9999*9999像素,50%透明的(0,0)處的div標簽。因為所有出這個div之外的facebook內容都在框架之中,這個保護可以被載入足夠大的框架挫敗,由此整個框架的中心久位于黑色的div區域外。內容自然地流動到框架的中心并被直接顯示給用戶并且沒有被黑色覆蓋,框架代碼如下,相應的頁面如圖5
<bodys t y l e=" overflow-x : hidden ;
border : 0 px ; margin : 0 px ; ">
<iframe width="21800px" height="2500px"
s r c=" http :/ / facebook . com/"
frameborder="0"
marginheight="0" marginwidth="0" >
</iframe>
<s c r i p t >window . s c ro l l T o ( 1 0 2 0 0 , 0 ) ;
</s c r i p t >
移除點擊此處添加圖片說明文字
Figure 5:Facebook’s elegant black layer defense
注意到 scrollTo 函數動態翻轉滾動到 frame 的中心,這樣內容出現得很清除。
4.2
域檢查錯誤
USBank使用framebusting代碼來檢測referrer字段從而判斷是否能夠被框架化。工作代碼如下:
i f ( s e l f!= top ) {
var dom = getDom( document . r e f e r r e r ) ;
var okDom = /usbank j l o c a lh o s t | usbnet / ;
var matchDomain = dom . search (okDom ) ;
i f ( matchDomain == -1){ //b u s t}
getDomain是一個用來返回URL中的域名信息,注意到任何包含USBank的都將被允許來框架頁面,這完全不是開發者所希望的。舉例來說,挪威的statehousebank(http://www.husbank.no)和莫斯科銀行(http://www.rusbannk.org)都可互相來被允許框架頁面,因為兩者的域名中都包含由字符串usbank
4.3
信任問題
Myspace.com的framebusting代碼:
移除點擊此處添加圖片說明文字
代碼被設計成允許myspace被谷歌圖片所框架。然而谷歌圖片谷歌圖片沒有framebusting,結果就是一個攻擊者框架谷歌圖片然后通過谷歌額圖片來框架myspace。因為myspace接收到來自谷歌圖片的referrer它并不會識圖導出框架。結果如圖六所示:
移除點擊此處添加圖片說明文字
Figure 6: Because MySpace whitelists Google in
這個例子顯示在framebusting的情景下,相互的信任關系會變得很危險。一個兄弟站點不使用framebusting會導致受信頁面被攻擊者框架化
05
安全地framebusting
現在我們將角度轉到防御者的角度,討論如何是一個占地那避免被框架化。首先我們回顧相關的用戶端的額特點,然后給出一段有效抵御現有攻擊的framebusting代碼
5.1
x-frame-options
微軟在IE8中為了抵抗點擊劫持攻擊特意引入了x-frame-options,這是一個HTTP響應報文中的報頭,這個字段有兩個不同的值:DENY和SAMEORIGIN。當時用DENY時,IE8將會在請求站點的框架內容中進行渲染。如果使用的是SAMEORIGIN,IE只會在頂層瀏覽內容來源和包含指令內容來源不同時才會禁止該頁面。
盡管這個機制很有效,但是它還是有三個主要的局限。
每頁策略指定:
該策略需要為每個頁面指定,這可能使部署復雜化。為提供全面強制執行策略的能力,例如在登陸的時候,可以簡化采用。
多域名問題
在目前的實現下不允許網站管理員提供允許框架網頁的白名單,雖然白名單可能是危險的,但在某些情況下,管理員可能無法選擇而至鞥你使用主域名。
代理
網絡代理在添加,刪除頭部字段方面是臭名昭著的,如果一個網絡代理剔除了x-frame-options字段,那網站將失去它的框架保護
x-frame-options已經被瀏覽器開發商迅速采用,出了firefox之外,每個最新版本的瀏覽器都使用了這個技術,danfirefox通過NoScriptfirefox插件提供此項功能。
但是在web方面采用較慢,最新一項調查顯示,在top10000中只有4個網站使用了它,這個結論是和我們的觀察是一致的,我們觀察到只有三個站點使用了這項技術。
5.2
內容安全策略
內容安全策略是一個Mozilla計劃,該計劃向web開發人員提供了一種網站上可指定互動內容的方法,它在firefox3.7中的部署已經被提上了日程。和x-frame-options一樣,策略通過HTTP響應頭傳送,它比x-frame-options更為通用,允許網站的所有者指定其他類型的內容互動,例如:它允許網站將腳本限制在特定的來源。
Web管理者可直接使用指定的frame-ancestors指令來指定那些來源能夠被嵌入到frame或者iframe標簽中去。因此不像x-frame-options,web管理者可指定允許的第三方網站嵌入到iframe中。CSP從x-frame-options的另外一些局限性中吃到了苦頭。它并不提供一個強制的全局策略,到現在這個策略尚處于測試階段還未被網站所使用。
5.3
使用javascript
到此x-frame-options或其他基于瀏覽器的防護手段被廣泛使用,這使web站點幾乎沒有選擇的余地只能使用javascript來對抗點擊劫持。圖7中所示的是目前我們認為最有效安全的framebusting代碼
移除點擊此處添加圖片說明文字
頁面加載時,樣式表會隱藏頁面上的所有內容。 如果禁用JavaScript,頁面將保持為空。 類似地,如果頁面被框架,它將保持空白,否則將嘗試破壞框架。 如果framebusting代碼被阻止,如通過掛起卸載事件或進行204沖洗攻擊,頁面將保持為空。該腳本僅顯示內容頁面不在框架中運行的文檔。 請注意,通過瀏覽器設置或NoScript禁用JavaScript的用戶將無法使用該站點。 如果是這樣的話,設計師可能想要有一個后備機制。
在我們的示例中,整個頁面最初是不可見的,但是通過讓子元素不可見,這種防御可能更加地細粒度。這樣,如果禁用JavaScript,則可以向用戶顯示一條消息。 但是,不建議激活超出該簡單消息的任何功能子集。
我們通過注入代碼到頂部頁面手工測試了一些負載重的站點。 使用Firefox的YSlow和Chrome的Speed Tracer,我們無法識別渲染或加載時間的任何顯著降低
我們強調,這個代碼沒有被證明是框架破壞的一種安全方法。 正如我們在整篇文章中所展示的,許多錯誤和漏洞可用于攻擊者定位JavaScript framebusting,并且可能還有更多。 我們的代碼片段可能已經很容易受到未知攻擊的影響。但據我們所知,這是當前最好的方法。
06
相關工作
第一次提到透明iframe的負面影響是2002年MozzilaFirefox瀏覽器的錯誤報告[21]。術語“劫持”[10]是由Hansen和Grossman在2008年創造的。Clickjacking與網絡釣魚[9]不同,因為它不會誘使用戶將機密憑證輸入假冒網站。相反,用戶必須將其憑據輸入真實的站點以建立認證會話。攻擊能夠持續到用戶的會話過期。劫持可以被認為是混淆代理的一個實例[5]。 “混淆代理”一詞是1988年由哈迪創造的[11]。另一個網絡上的混淆代理問題的例子是跨站點請求偽造[2]。網絡密鑰認證方案[6]在URL中使用不可預知的秘密,而不是cookie進行身份驗證。這種方法可以減輕混淆代理的問題,如劫持和CSRF。用于點擊劫持的實驗客戶端防御包括ClearClick [18]和ClickIDS [1]。這些防御還沒有廣泛部署,所以他們不能作為網站主要的防御。他們還介紹了陳舊網站的一些兼容性成本,這可能會妨礙瀏覽器廠商的采用。
07
結論
我們調查了top500網站的framebusting的做法。 通過使用已知和新穎的攻擊技術,我們發現我們遇到的所有劫持防御都可以以某種方式繞過。
許多攻擊是通用的,可以用于攻擊各種各樣的站點。我們發現使用有針對性的攻擊可以擊敗具有高級劫持防御(如Facebook和MySpace)的站點。在查看了可用的防御措施后,我們提出了一種基于JavaScript的防御方式,直到瀏覽器支持X-FRAME-OPTIONS等解決方案得到廣泛部署。
本文由 看雪翻譯小組 wangrin 編譯,來源Stanford Web Security Research
完~
如果你喜歡的話,不要忘記點個贊哦!
小新 編譯自 Insight Data Blog
量子位 出品 | 公眾號 QbitAI
寫個網頁能有多麻煩?在大多數公司里,這項工作分為三步:
1. 產品經理完成用戶調研任務后,列出一系列技術要求;
2. 設計師根據這些要求來設計低保真原型,逐漸修改得到高保真原型和UI設計圖;
3. 工程師將這些設計圖實現為代碼,最終變成用戶使用的產品。
這么多環節,任何地方出一點問題,都會拉長開發周期。因此,不少公司,比如Airbnb已經開始用機器學習來提高這個過程的效率。
△ Airbnb內部的AI工具,從圖紙到代碼一步到位
看起來很美好,但Airbnb還沒公開該模型中端到端訓練的細節,以及手工設計的圖像特征對該模型的貢獻度。這是該公司特有的閉源解決方案專利,可能不會進行公開。
好在,一個叫Ashwin Kumar的程序員創建了一個開源版本,讓開發者/設計師的工作變得更簡單。
以下內容翻譯自他的博客:
理想上,這個模型可以根據網站設計的簡單手繪原型,很快地生成一個可用的HTML網站:
△ SketchCode模型利用手繪線框圖來生成HTML網站
事實上,上面例子就是利用訓練好的模型在測試集上生成的一個實際網站,代碼請訪問:https://github.com/ashnkumar/sketch-code。
目前要解決的問題屬于一種更廣泛的任務,叫做程序綜合(program synthesis),即自動生成工作源代碼。盡管很多程序綜合研究通過自然語言規范或執行追蹤法來生成代碼,但在當前任務中,我會充分利用源圖像,即給出的手繪線框圖來展開工作。
在機器學習中有一個十分熱門的研究領域,稱為圖像標注(image caption),目的是構建一種把圖像和文本連接在一起的模型,特別是用于生成源圖像內容的描述。
△ 圖像標注模型生成源圖像的文本描述
我從一篇pix2code論文和另一個應用這種方法的相關項目中獲得靈感,決定把我的任務按照圖像標注方式來實現,把繪制的網站線框圖作為輸入圖像,并將其相應的HTML代碼作為其輸出內容。
注:上段提到的兩個參考項目分別是
pix2code論文:https://arxiv.org/abs/1705.07962
floydhub教程:https://blog.floydhub.com/turning-design-mockups-into-code-with-deep-learning/?source=techstories.org
確定圖像標注方法后,理想中使用的訓練數據集會包含成千上萬對手繪線框圖和對應的HTML輸出代碼。但是,目前還沒有我想要的相關數據集,我只好為這個任務來創建數據集。
最開始,我嘗試了pix2code論文給出的開源數據集,該數據集由1750張綜合生成網站的截圖及其相應源代碼組成。
△ pix2code數據集中的生成網站圖片和源代碼
這是一個很好的數據集,有幾個有趣的地方:
該數據集中的每個生成網站都包含幾個簡單的輔助程序元素,如按鈕、文本框和DIV對象。盡管這意味著這個模型受限于將這些少數元素作為它的輸出內容,但是這些元素可通過選擇生成網絡來修改和擴展。這種方法應該很容易地推廣到更大的元素詞匯表。
每個樣本的源代碼都是由領域專用語言(DSL)的令牌組成,這是該論文作者為該任務所創建的。每個令牌對應于HTML和CSS的一個片段,且加入編譯器把DSL轉換為運行的HTML代碼。
為了修改我的任務數據集,我要讓網站圖像看起來像手工繪制出的。我嘗試使用Python中的OpenCV庫和PIL庫等工具對每張圖像進行修改,包括灰度轉換和輪廓檢測。
最終,我決定直接修改原始網站的CSS樣式表,通過執行以下操作:
1. 更改頁面上元素的邊框半徑來平滑按鈕和DIV對象的邊緣;
2. 模仿繪制的草圖來調整邊框的粗細,并添加陰影;
3. 將原有字體更改為類似手寫的字體;
最終實現的流程中還增加了一個步驟,通過添加傾斜、移動和旋轉來實現圖像增強,來模擬實際繪制草圖中的變化。
現在,我已經處理好數據集,接下來是構建模型。
我利用了圖像標注中使用的模型架構,該架構由三個主要部分組成:
1. 一種使用卷積神經網絡(CNN)的計算機視覺模型,從源圖像提取圖像特征;
2. 一種包含門控單元GRU的語言模型,對源代碼令牌序列進行編碼;
3. 一個解碼器模型,也屬于GRU單元,把前兩個步驟的輸出作為輸入,并預測序列中的下一個令牌。
△ 以令牌序列為輸入來訓練模型
為了訓練模型,我將源代碼拆分為令牌序列。模型的輸入為單個部分序列及它的源圖像,其標簽是文本中的下一個令牌。該模型使用交叉熵函數作為損失函數,將模型的下個預測令牌與實際的下個令牌進行比較。
在模型從頭開始生成代碼的過程中,該推理方式稍有不同。圖像仍然通過CNN網絡進行處理,但文本處理開始時僅采用一個啟動序列。在每個步驟中,模型對序列中輸出的下個預測令牌將會添加到當前輸入序列,并作為新的輸入序列送到模型中;重復此操作直到模型的預測令牌為,或該過程達到每個文本中令牌數目的預定義值。
當模型生成一組預測令牌后,編譯器就會將DSL令牌轉換為HTML代碼,這些HTML代碼可以在任何瀏覽器中運行。
我決定使用BLEU分數來評估模型。這是機器翻譯任務中常用的一種度量標準,通過在給定相同輸入的情況下,衡量機器生成的文本與人類可能產生內容的近似程度。
實際上,BLEU通過比較生成文本和參考文本的N元序列,以創建修改后的準確版本。它非常適用于這個項目,因為它會影響生成HTML代碼中的實際元素,以及它們之間的相互關系。
最棒的是,我還可以通過檢查生成的網站來比較當前的實際BLEU分數。
△ 觀察BLEU分數
當BLEU分數為1.0時,則說明給定源圖像后該模型能在正確位置設置合適的元素,而較低的BLEU分數這說明模型預測了錯誤元素或是把它們放在相對不合適的位置。我們最終模型在評估數據集上的BLEU分數為0.76。
后來,我還想到,由于該模型只生成當前頁面的框架,即文本的令牌,因此我可以在編譯過程中添加一個定制的CSS層,并立刻得到不同風格的生成網站。
△ 一個手繪圖生成多種風格的網頁
把風格定制和模型生成兩個過程分開,在使用模型時帶來了很多好處:
1.如果想要將SketchCode模型應用到自己公司的產品中,前端工程師可以直接使用該模型,只需更改一個CSS文件來匹配該公司的網頁設計風格;
2. 該模型內置的可擴展性,即通過單一源圖像,模型可以迅速編譯出多種不同的預定義風格,因此用戶可以設想出多種可能的網站風格,并在瀏覽器中瀏覽這些生成網頁。
受到圖像標注研究的啟發,SketchCode模型能夠在幾秒鐘內將手繪網站線框圖轉換為可用的HTML網站。
但是,該模型還存在一些問題,這也是我接下來可能的工作方向:
1. 由于這個模型只使用了16個元素進行訓練,所以它不能預測這些數據以外的令牌。下一步方向可能是使用更多元素來生成更多的網站樣本,包括網站圖片,下拉菜單和窗體,可參考啟動程序組件(https://getbootstrap.com/docs/4.0/components/buttons/)來獲得思路;
2. 在實際網站構建中,存在很多變化。創建一個能更好反映這種變化的訓練集,是提高生成效果的一種好方法,可以通過獲取更多網站的HTML/CSS代碼以及內容截圖來提高;
3. 手繪圖紙也存在很多CSS修改技巧無法捕捉到的變化。解決這個問題的一種好方法是使用生成對抗網絡GAN來創建更逼真的繪制網站圖像。
代碼:https://github.com/ashnkumar/sketch-code
原文:https://blog.insightdatascience.com/automated-front-end-development-using-deep-learning-3169dd086e82
— 完 —
誠摯招聘
量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復“招聘”兩個字。
量子位 QbitAI · 頭條號簽約作者
?'?' ? 追蹤AI技術和產品新動態
簫 發自 凹非寺
量子位 報道 | 公眾號 QbitAI
TikTok,海外版抖音,字節跳動出品。
這是中國科技公司有史以來最成功的全球化產品——甚至沒有之一。
而且它發展壯大于巨頭扎堆的領域——海外的Facebook、谷歌,Snapchat,哪一個不是根基深厚的巨頭,卻可以異軍突起,風靡于海外用戶之間。
卻還能在一眾圍追堵截中——從Facebook扎克伯克的明搶,到標榜公平的美國印度政府的政令,頑強生長。
真是一個不折不扣的“看不慣又干不掉”的產品。
所以問題也來了,TikTok,海外版抖音,發展壯大的核心秘訣究竟是啥?
一方面,自然還是打鐵還靠本身硬。
先從直觀下載量來看,2017年上線的TikTok,在SensorTower的下載量基本一路拔高。
其中,關鍵爆發節點,發生在當年11月,那時候字節跳動完成了對Musical.ly的收購合并。
此后,雖然TikTok在海外分別受到了不同國家的政策制裁(FTC控告TikTok非法收集兒童信息等),導致其在2019年前兩個季度呈現下滑趨勢;
但整體而言,下載量依舊穩定,并在短短3年的時間內積攢了4億多用戶。
從今年2月份的下載排名數據來看,TikTok在印度宣布封禁前,依舊保持著極高的熱度。
美國 Our Favorites 分類第一英國 Photo & Video 和Social Networking 分類第一加拿大 Music 分類第二法國 Music 分類 第五
2017年8月才正式上線的TikTok,只利用短短3年的時間,就擊敗了Facebook旗下Instagram,以及谷歌系的Youtube等老牌主流社交平臺。
即使國外政府親自出手打壓,似乎也無法阻止TikTok在海外一眾大廠林立的情況下勢頭瘋漲。
所以,TikTok憑什么殺出重圍?
TikTok在海外的大火,要從對Musical.ly的收購說起。
這款堪稱“美國青少年版快手”的短視頻軟件,歷時一年就登上了蘋果商店在美國地區的榜首,潛力無限。
而張一鳴一眼看中了這個短視頻社交軟件,并直接在17年11月以10億美元的資本收購了它。
事實上,快手和Fackbook此前都曾與Musical.ly相關方討論過收購事宜,但均未能達成協議。
Musical.ly的投資方,來自獵豹的傅盛,提出了一個「捆綁銷售」的要求,要求在收購Musical.ly的同時,也要將獵豹下的News Republic和Live.me一同收購,加起來近10億美元。
要知道,當時外界對Musical.ly的估值僅在5億美元左右。
快手拒絕了,但張一鳴果斷地應了下來。
現在看來,這是一個明確的決定,相比于TikTok單打獨斗進駐歐美市場,Musical.ly在海外打下的「江山」無疑于是本土化最好的根基。
用戶裂變的來源有了,而TikTok自身產品的特性,決定了它能帶來「病毒式轉發」的效應。
在產品內容上,TikTok充分放大了「人類的本質是復讀機」的模仿行為,將國外的meme文化發揚到了極致。
meme文化,在青少年群體中指模仿行為,通過形式上的模仿、復制、變異、傳播,將文化傳播出去,過程中產生的沙雕效果,給傳播和受眾帶來了無窮樂趣,如下圖。
在傳播過程中,TikTok的軟件做了三個創新舉動:將主題標簽設為一級分類;提供傻瓜式操作模板;允許用戶上傳自己的音樂。
想象一下,三步就能在TikTok上跟進潮流、展示自我:
第一步,在搜索框內一鍵搜索,立即搜到感興趣標簽下的視頻內容;第二步,想要錄制視頻、跟風標簽內容時,只需要選取錄制模板,就能自帶修剪等大片特效;最后,上傳自己的音樂,保留用戶個性。
用戶基本只需動動手指,就能完成原本需要專業剪輯軟件才能做出的視頻效果。
而在這些標簽化下面,隱藏的是大量的視頻關聯算法,將每一個故事都變得有關聯。
除此之外,TikTok在細節上的設計也引人注目。
播放形式上,視頻采取沉浸式、豎屏播放,前者讓用戶放棄思考不需要做出選擇,就能根據算法看見自己想要的視頻類型;后者則使得用戶無需再鍛煉頸椎翻轉屏幕查看內容,更快捷方便。
視頻創作上,用戶能直接從創作者的TikTok主頁跳到Youtube和Ins,這對創作者的發展非常友好。
三大利器,將TikTok的發展直接推上了頂峰。
哪怕是扎克伯格,對TikTok也做出了非常高的評價,言語間充滿忌憚:
我確實認為TikTok很值得關注,不僅僅因為它是最新的潮流,也不僅因為它的擴張態勢——從地緣政治方面看,他們的所作所為也很值得思考。
但TikTok的壯大,也意味著Facebook等國際巨頭的“失手”,而且Facebook并非在短視頻方面沒有嘗試。
可為啥他們失敗了?
Facebook并不是沒有做出過嘗試的舉動。
TikTok火了后一年,Facebook模仿TikTok,推出了獨立視頻應用軟件Lasso。
尷尬的是,上線一年后,Lasso的的下載量僅為42.5萬次,《紐約時報》對此做出的評價是「一個蹩腳的抄襲版本」。
而Facebook旗下的子公司Instagram,曾嘗試在南美推出過一款短視頻軟件,也以業績不好而腰斬。
但事實上,作為美國數一數二的互聯網公司,Facebook遠非表面上那般風光。
可以說,Facebook近年的發展道路足以譜一曲國外的《臉書沒有夢想》。
在與Twitter和Snapchat競爭社交軟件市場的過程中,Facebook將「CV玩家」(Ctrl+C、Ctrl+V)的精髓發揮到了極致:隔壁做出的好功能,直接照搬過來。
Facebook內部的某個團隊甚至形成了這樣一種風氣:「不抄襲也不是啥值得驕傲的事情」。
而扎克伯格本人,在Facebook涉及侵犯用戶隱私安全、面臨罰款時,第一時間想到的竟然是將TikTok拖下水……
要是說Facebook更多的是自身出了問題,那么再來說說Youtube這些大公司,為什么也沒能創造出像TikTok這樣的軟件。
事實上,核心原因也許在于,初創公司的創意有時候更接近于「草率的創業」。
例如,谷歌的最初業務是從做好搜索引擎開始,Instagram的產品想法則是「希望手機能擁有這一功能」,而TikTok也一樣,最初Musical.ly創始人的想法只是將青少年喜歡聽歌和錄視頻這兩點融合起來。
但大公司必須更加關注業務的數據和競爭,有時候也許就會誤判新產品對于公司的貢獻預期。
不僅如此,并非所有大公司的文化都適合互聯網潮流里最新的創意。
此前,在Instagram爆火的時候,Google就曾推出過社交產品Buzz,但用戶體驗不好,原因是Google的產品文化更側重于功能,相比之下,Instagram對于人的情感則會更加照顧。
類似的情況也可以解釋如今部分大公司無法再造一個TikTok的原因。
但如今TikTok在國外面臨著封殺的情況,這是否是某些視頻、社交產品的契機,似乎也不一定。
日前,國外各大社交平臺如Snapchat、Ins、Youtube,已經在尋求進一步發展的契機。
據了解,一些模仿TikTok的短視頻軟件近日下載量暴增。
其中印度的一個本土競品短視頻應用Chingari,在TikTok下架后一天,每小時暴增20萬次下載量。
字節跳動正考慮分拆TikTok為美國公司,并保證不會與國內公司共享任何相關信息。
但此舉是否能贏得美國政府的信任,目前尚不得而知。
現在看來,這場戰役還會持續下去。
參考鏈接:
https://stratechery.com/2020/the-tiktok-war/
https://mp.weixin.qq.com/s/vkH2B9AAwCubMiWfQbmkQw
http://www.woshipm.com/it/3443070.html
https://mp.weixin.qq.com/s/on0C6GElAJEbJKZmpOLzzw
https://mp.weixin.qq.com/s/YmePzcRMzXneou-dyk_DW
ghttps://www.sohu.com/a/129975261_350699
— 完 —
量子位 QbitAI · 頭條號簽約
關注我們,第一時間獲知前沿科技動態
*請認真填寫需求信息,我們會在24小時內與您取得聯系。