<dfn id="hx5t3"><strike id="hx5t3"><em id="hx5t3"></em></strike></dfn>

    <thead id="hx5t3"></thead><nobr id="hx5t3"><font id="hx5t3"><rp id="hx5t3"></rp></font></nobr>

    <listing id="hx5t3"></listing>

    <var id="hx5t3"></var>
    <big id="hx5t3"></big>

      
      

      <output id="hx5t3"><ruby id="hx5t3"></ruby></output>
      <menuitem id="hx5t3"><dfn id="hx5t3"></dfn></menuitem>

      <big id="hx5t3"></big>

        weakish

        weakish 查看完整檔案

        填寫現居城市  |  填寫畢業院校  |  填寫所在公司/組織 mmap.page 編輯
        編輯

        a vigorously lazy deadbeat with matured immaturity

        個人動態

        weakish 贊了文章 · 2020-11-16

        基于 Serverless 的 Valine 可能并沒有那么香

        Valine 是一款樣式精美,部署簡單的評論系統, 第一次接觸便被它精美的樣式,無服務端的特性給吸引了。它最大的特色是基于 LeanCloud 直接在前端進行數據庫操作而無需服務端,極大的縮減了部署流程,僅需要在靜態頁引入 Valine SDK 即可。

        ?????? 初識 Valine

        以下是 Valine 官網提供的快速部署腳本,其中 appIdappKey 是你在 LeanCloud 上創建應用后對應的應用密鑰。也正是基于這對密鑰,Valine 在內部調用了 LeanCloud SDK 進行數據的獲取,最終將數據渲染在 #vcomments 這個 DOM 上。這便是 Valine 的大概原理。

        <head>
          ..
          <script data-original='//unpkg.com/valine/dist/Valine.min.js'></script>
          ...
        </head>
        <body>
          ...
          <div id="vcomments"></div>
          <script>
            new Valine({
              el: '#vcomments',
              appId: 'Your appId',
              appKey: 'Your appKey'
            })
          </script>
        </body>

        有同學可能會有疑問了,appIdappKey 都直接寫在前端了,那豈不是誰都可以修改數據了?這就需要牽扯到 LeanCloud 的數據安全問題了,官方專門寫了篇文檔《數據和安全》 來說明這個問題。簡單的理解就是針對數據設置用戶的讀寫權限,確保正確的人對數據有且僅有正確的權限來保證數據的安全。

        乍聽一下,保證用戶數據只讀的話,感覺還是挺安全的??墒聦嵳娴娜绱嗣?,讓我們繼續來看看。

        ???♂? Valine 的問題

        ?? 閱讀統計篡改

        Valien 1.2.0 增加了文章閱讀統計的功能,用戶訪問頁面就會在后臺 Counter 表中根據 url 記錄訪問次數。由于每次訪問頁面都需要更新數據,所以在權限上必須設置成可寫,才能進行后續的字段更新。這樣就造成了一個問題,實際上該條數據是可以被更新成任意值的。感興趣的同學可以打開 https://valine.js.org/visitor... 官網頁面后進入控制臺輸入以下代碼試試。試完了記得把數改回去哈~

        const counter = new AV.Query('Counter');
        const resp = await counter.equalTo('url', '/visitor.html').find();
        resp[0].set('time', -100001).save();
        location.reload();

        可以看到該頁面的訪問統計被設置成了 -100000 了。這個問題唯一值得慶幸的是 time 字段的值是 Number 類型的,其它的值都無法插入。如果是字符串類型的話就是一個 XSS 漏洞了。

        該問題有一個解決辦法,就是不使用次數累加的存儲方式。更改為每次訪問都存儲一條只讀的訪問記錄,讀取的時候使用 count() 方法進行統計。這樣所有數據都是只讀的,就不存在篡改的問題了。這種解決方案唯一的問題就是數據量會比較大,對查詢會造成一定壓力。當然如果是在基于原數據不變的情況下,只能是增加一層服務端來做修改權限的隔離了。

        ?? XSS 安全

        從很早的版本開始就有用戶報告了 Valine 的 XSS 問題,社區也在使用各種方法在修復這些問題。包括增加驗證碼,前端XSS過濾等方式。不過后來作者才明白,前端的一切驗證都只能防君子,所以把驗證碼之類的限制去除了。

        現有的邏輯里,前端發布評論的時候會將 Markdown 轉換成 HTML 然后走一下前端的一個 XSS 過濾方法最后提交到 LeanCloud 中。從 LeanCloud 中拿到數據之后因為是 HTML 直接插入進行顯示即可。很明顯,這個流程是存在問題的。只要直接提交的是 HTML 而且拿到 HTML 之后直接進行展示的話,XSS 從根本上是無法根除的。

        那有沒有根本的解決辦法?其實是有的。針對存儲型的 XSS 攻擊,我們可以使用轉義編碼進行解決。只要效仿早前 BBCode 的做法,提交到數據庫的是 Markdown 內容。前端讀取到內容對所有 HTML 進行編碼后再進行 Markdown 轉換后展示。

        function encodeForHTML(str){
          return ('' + str)
            .replace(/&/g, '&amp;')
            .replace(/</g, '&lt;')    
            .replace(/>/g, '&gt;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#x27;')
            .replace(/\//g, '&#x2F;');
        };

        由于 Serverless 攻擊者是可以直達存儲階段,所以數據存儲之前的一切防范是無效的,只能在讀取展示過程處理。由于所有的 HTML 轉義后無法解析,Markdown 相當于我們根據自定義的語法解析成 HTML,保證轉換后的 HTML 沒有被插入的機會。

        不過這個方法存在一個問題,那就是對老數據存在不兼容。因為這相當于修改了存儲和展示的規則,而之前一直存儲的都是 HTML 內容,修復后之前的數據將無法展示 HTML 樣式。而為了能在存儲的還是 HTML 情況下規避 XSS 安全問題,唯一的辦法就是增加服務端中間層。存儲階段增加一道閥門,將轉義階段提前至存儲階段,保證新老數據的通用。

        ?? 隱私泄露

        說完了存儲的問題,我們再來看看讀取的問題。攻擊者除了可以直達存儲,也可以直達讀取,當一個數據庫的字段開放了讀取權限后,相當于該字段的內容對攻擊者是透明的。

        在評論數據中,有兩個字段是用戶比較敏感的數據,分別是 IP 和郵箱。燈大甚至專門寫了一篇文章來批判該問題 《請馬上停止使用Valine.js評論系統,除非它修復了用戶隱私泄露問題》。甚至掘金社區在早期使用 LeanCloud 的時候也暴出過泄露用戶手機號的安全問題。

        為了規避這個問題,Valine 作者增加了 recordIP 配置用來設置是否允許記錄用戶 IP。由于是 Serverless,目前能想到的也只是不存儲的方式解決了。不過該配置項會存在一個問題,就是該配置項的配置權在網站,隱私的問題是評論者遇到的,也就是說評論者是無權管理自己的隱私的。

        除了這個矛盾點之外,還有就是郵箱的問題。郵箱本質上只需要返回 md5 用來獲取 Gravatar 頭像即可。但是由于無服務端的限制,只能返回原始內容由前端計算。而郵箱我們又需要獲取到原始值,方便做評論回復郵件通知功能。所以我們也不能不存儲,或者存儲 md5 后的值。

        該問題的解決方案只能是增加一層服務端,通過服務端過濾敏感信息解決這個問題。

        ?? Waline!

        基于以上原因,我們發現只有增加一層服務端中間層才能很好的解決 Valine 的安全問題,所以 Waline 橫空出世了!Waline 與 Valine 最大的不同就是增加了服務端中間層,解決 Valine 暴露出來的安全問題。同時基于服務端的特性,提供了郵件通知、微信通知、評論后臺管理、LeanCloud, MySQL, MongoDB, SQLite, PostgreSQL 多存儲服務支持等諸多特性。不僅如此,Waline 默認使用 Vercel 部署,實現完全免費部署!

        Waline 最初的目標僅僅是為 Valine 增加上服務端中間層。但是由于作者不知為何從 1.4.0 版本開始只推送編譯后的文件到 Github 倉庫中,源文件停止更新。導致我只能連帶前端也實現一遍。當然前端的很多代碼和邏輯為了和 Valine 的配置保持一致都有參考 Valine,甚至在名字上,我也是從 Valine 上衍生的,讓大家能明白這個項目是 Valine 的衍生版。

        ?? 后記

        Serverless 的概念火了非常多年,但技術沒有銀彈,我們在看到它的優點的同時,也要正視它所帶來的問題。而 Serverless 自己可能也意識到了這個問題,從早期的無服務端慢慢轉向了無服務器,更偏向 BaaS 了。不過由于 Valine 沒有開放源代碼,所以上面說的一些問題和解決方法只能等待作者自己發現這件事了。

        查看原文

        贊 9 收藏 2 評論 0

        weakish 評論了文章 · 2019-05-06

        manjaro使用ss方法(安裝SwitchyOmega需nodejs環境)

        剛裝了manjaro,需要安裝shadowsocks-qt5+Proxy SwitchyOmega,但是最新的chrome早就封殺安裝非谷歌商店的crx渠道了,下面是我的解決辦法,很麻煩但能用,如果熟悉nodejs中npm的命令,則不會覺得麻煩,因為要用到nodejs來編譯。

        準備環境:

        1. 一臺已經安裝好shadowsocks服務端的的VPS服務器或第三方ss服務
        2. nodejs -- 用manjaro自帶的octopi搜索nodejs,然后安裝。到終端輸入 node -v有返回版本號就行了。

        開始

        • 先用manjaro自帶的octopi搜索shadowsocks-qt5,然后安裝:

        clipboard.png

        其他linux發行版可以去 shadowsocks-qt5的github 看看有沒有合適的release版本

        安裝成功并配置好你自己的ss后,如下

        clipboard.png

        • 然后去 Proxy SwitchyOmega的github 下載源碼(Source code(zip)),別的方法會叫你直接找crx版本,但是現在crx格式安裝不了了,只能用源碼安裝

        clipboard.png

        # 安裝 nodejs,準備環境那步可以到這里才執行
        # Install node and npm first (make sure npm --version > 2.0), then:
        # 全局安裝grunt-cli和bower
        sudo npm install -g grunt-cli@1.2.0 bower
        # cd 到下載回來的代碼目錄,再執行以下2行命令,注意,下面第二行命令如果報沒有權限,則需要sudo開頭
        cd omega-build
        npm run deps
        # 上面命令,根據網速,可能要跑一陣子,然后跑下面的命令,如果報沒有權限,則需要sudo開頭
        grunt
        
        • 上面的命令跑完之后,會在下載來的源碼中,出現這個文件夾: omega-chromium-extension/build/
        • 打開chrome擴展程序頁面,開啟開發者模式,點擊加載已解壓的擴展程序按鈕,選擇前面出現的build文件夾,確定即完成安裝。安裝完成后如下圖。

        clipboard.png

        ps. 編譯后的代碼不能刪除,但源碼可以刪除,所以可以把編譯后的代碼復制到一個你喜歡的目錄,再加載這個目錄

        • 至此,已成功安裝shadowsocks-qt5+Proxy SwitchyOmega。但有可能顯示連接上了,仍然沒有辦法上谷歌,此時只需要斷開shadowsocks-qt5的連接,把配置中的本地服務器類型改成http(s)然后連接,Proxy SwitchyOmega的配置也改成http,然后訪問谷歌,此時會失敗,然后再把上面兩處配置改回SOCKS5,再連接,就行了,別問我為什么,我也不知道為啥...
        查看原文

        weakish 贊了回答 · 2019-05-04

        為什么react的useEffect hooks重復不停的運行?

        如果是想componentDidMout的效果,第二個參數設置[],如果未設置第二個參數,而且在內部改變了狀態,就會一直重復渲染

        官方文檔:https://reactjs.org/docs/hook...

        關注 4 回答 3

        weakish 回答了問題 · 2019-05-04

        這個mysql的select語句是什么意思?

        這段代碼是測試數據庫連接是否成功。

        1 + 1沒有什么特殊含義。SELECT 1 + 1 AS solution 等價于 SELECT 2 AS solution,就類似寫 Hello World 程序 let solution = 1 + 1 一樣。真實場景下,SELECT 2 AS solution 這樣的查詢無意義,但這里是用來測試連接數據庫是否成功,需要一個足夠簡單且總是成立(無需數據庫中已有數據)的 SQL 語句。

        關注 5 回答 5

        weakish 贊了回答 · 2019-05-04

        這個mysql的select語句是什么意思?

        測試數據庫是否聯通?!其他真心沒有看出有什么意思!

        關注 5 回答 5

        weakish 贊了回答 · 2019-05-04

        這個mysql的select語句是什么意思?

        這是連接器的范例。

        和你剛學語言寫hello world程序一樣。

        關注 5 回答 5

        weakish 贊了問題 · 2019-05-04

        這個mysql的select語句是什么意思?

        下面這段代碼中的SELECT 1 + 1 AS solution表示什么意思?1+1是什么?

        var mysql      = require('mysql');
        var connection = mysql.createConnection({
          host     : 'localhost',
          user     : 'me',
          password : 'secret',
          database : 'my_db'
        });
         
        connection.connect();
         
        connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
          if (error) throw error;
          console.log('The solution is: ', results[0].solution);
        });
         
        connection.end();

        關注 5 回答 5

        weakish 關注了用戶 · 2019-03-12

        LeanCloud @leancloud

        LeanCloud 提供包括數據存儲、文件存儲、消息推送、即時通訊、可自動擴容的云引擎容器和大數據分析工具在內的后端服務,全面涵蓋互聯網產品開發的需求。

        關注 1308

        weakish 評論了文章 · 2019-01-18

        優秀的命令行工具整理(二)

        原文作者: Darren Burns
        翻譯:weakish@LeanCloud
        原文鏈接:Power Up Your Command Line II

        本文是「命令行威力提升」系列的第二篇,這一系列展示一些出色的非標準工具,這些工具能讓命令行用起來更容易、更享受。

        peco 交互式過濾

        將任何命令的輸出通過管道傳給 peco,便能交互式地過濾輸出,查找所需信息。你可以把它想成交互式 grep,隨著輸入實時更新結果,讓搜索過程更直觀。

        你可以使用上下鍵選擇搜索結果,然后用回車鍵確認。按下回車后,peco 會輸出結果。

        安裝 peco

        macOS (Homebrew): brew install peco

        hexyl 十六進制查看器

        檢查二進制文件時通常查看文件的十六進制表示。hexyl 是個命令行下的十六進制查看器。

        界面分為三欄:

        1. 偏移量 當前所在的字節數
        2. 十六進制 文件的十六進制表示(自身又分為兩欄,不過在上面的 gif 例子中不可見)
        3. 表示 嘗試將文件顯示為文本(同樣分為兩欄,gif 例子中未顯示)

        hexyl 顯示的每個字節的顏色取決于其類型(NULL、ASCII、non-ASCII等),這很有助于可讀性。

        小竅門 :查看二進制文件或大的文本文件時,輸出經常會超出屏幕,所以你可以把 hexyl 的輸出傳給 batless,以支持分頁。如果用 less,需要加上 --raw-control-chars/-r 參數以正確顯示顏色。

        hexylDavid Peter 使用 Rust 編寫,他也是 bat、fd、hyperfine 的作者,我在本系列的第一篇文章中介紹過這些工具。

        安裝 hexyl
        • macOS (Homebrew): brew install hexyl

        pomo 番茄鐘計時器

        番茄工作法是提升生產效率的好方法。如果你還沒聽說過,那么它大概是這樣的:

        1. 你心無旁騖地工作 25 分鐘
        2. 放松 5 分鐘,做任何你想做的事情(只要不是工作 ?)
        3. 重復以上步驟 4 次(根據需要調整這個數字),接著休息 15 分鐘
        4. 根據番茄工作法這一理論,遵循這一計劃能讓你在相對較短的時間內完成相對較多的事情。這也許不適用于每個人,但我個人驗證了它的有效性!

        pomo

        pomo 是一個簡單的命令行工具,助你依照番茄工作法管理時間。

        安裝 pomo
        • 在 macOS 上安裝:
        1. 從 GitHub 下載二進制文件:curl -L -o pomohttps://github.com/kevinschoon/pomo/releases/download/0.6.0/pomo-0.6.0-darwin-amd64
        2. 設置權限:chmod +x pomo
        3. 加入 PATHmv pomo /usr/local/bin
        4. 初始化數據庫:pomo init

        ncdu 分析、清理磁盤空間

        如果你的計算機上有很多項目,最近也沒有清理過磁盤。那么你幾乎一定能找到一個占用大量磁盤的文件夾(我發現舊項目的 node_modules 文件夾特別容易占用大量空間)。ncdu是我最愛的修復工具。事實上,在創建下面的 ncdu 演示例子時,我清理了 10 GiB 的磁盤空間!

        只需運行 ncdu 即可使用。它會掃描當前目錄下的所有子目錄,所以如果在家目錄運行 ncdu,也許需要較長時間掃描。

        ncdu 的 ncurses 界面可以使用方向鍵,也可以使用 vim 風格的快捷鍵。

        安裝 ncdu
        • macOS (Homebrew): brew install ncdu

        HTTPie curl 的現代替代品

        HTTPie 是一個更簡單(不像 curl,每次使用都要 Google 下用法)、功能更多、更美觀的 curl 替代品,可以在命令行調用 HTTP 的 API。到目前為止,我介紹的工具中,它是最流行的,而且有很精良的文檔。

        HTTPie

        http 命令的輸出足夠與 cURL 區分開來。輸出的 JSON 響應帶語法高亮,十分美觀,可讀性要好很多。如果你偏愛圖形 UI,那么你也許會喜歡 Insomnia、Postman 或 Paw (Paw 需要購買許可,并且只適用于 macOS)。

        安裝 HTTPie
        • macOS (Homebrew): brew install httpie

        結語

        感謝閱讀!在這一系列的下一篇文章中,還有一些工具值得一提。如果你有任何建議,歡迎聯系我!如果你對更多類似內容感興趣,可以在 Twitter 上關注我。

        查看原文

        weakish 回答了問題 · 2018-08-12

        try-catch-fianlly的運行順序到底是啥樣的?為啥返回的是1?

        finally運行前已經return i(此時i還是1)了。

        關注 2 回答 2

        認證與成就

        • 獲得 2003 次點贊
        • 獲得 54 枚徽章 獲得 0 枚金徽章, 獲得 28 枚銀徽章, 獲得 26 枚銅徽章

        擅長技能
        編輯

        開源項目 & 著作
        編輯

        (??? )
        暫時沒有

        注冊于 2013-10-22
        個人主頁被 17.5k 人瀏覽

        一本到在线是免费观看_亚洲2020天天堂在线观看_国产欧美亚洲精品第一页_最好看的2018中文字幕