<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 最佳安全實踐 下面,我們將會回顧常見的安全原則,并介紹在使用 Yii 開發應用程序時,如何避免潛在安全威脅。 ## 基本準則 無論是開發何種應用程序,我們都有兩條基本的安全準則: 1. 過濾輸入 2. 轉義輸出 ### 過濾輸入 過濾輸入的意思是,用戶輸入不應該認為是安全的,你需要總是驗證你獲得的輸入值是在允許范圍內。比如,我們假設 sorting 只能指定為?`title`,?`created_at`?和?`status`?三個值,然后,這個值是由用戶輸入提供的,那么,最好在我們接收參數的時候,檢查一下這個值是否是指定的范圍。 對于基本的 PHP 而言,上述做法類似如下: ~~~ $sortBy = $_GET['sort']; if (!in_array($sortBy, ['title', 'created_at', 'status'])) { throw new Exception('Invalid sort value.'); } ~~~ 在 Yii 中,很大可能性,你會使用?[表單校驗器](http://www.yiichina.com/doc/guide/2.0/input-validation)?來執行類似的檢查。 ### 轉義輸出 轉義輸出的意思是,根據我們使用數據的上下文環境,數據需要被轉義。比如:在 HTML 上下文,你需要轉義?`<`,`>`?之類的特殊字符。在 JavaScript 或者 SQL 中,也有其他的特殊含義的字符串需要被轉義。 由于手動的給所用的輸出轉義容易出錯,Yii 提供了大量的工具來在不同的上下文執行轉義。 ## 避免 SQL 注入 SQL 注入發生在查詢語句是由連接未轉義的字符串生成的場景,比如: ~~~ $username = $_GET['username']; $sql = "SELECT * FROM user WHERE username = '$username'"; ~~~ 除了提供正確的用戶名外,攻擊者可以給你的應用程序輸入類似 '; DROP TABLE user; --` 的語句。 這將會導致生成如下的 SQL : ~~~ SELECT * FROM user WHERE username = ''; DROP TABLE user; --' ~~~ 這是一個合法的查詢語句,并將會執行以空的用戶名搜索用戶操作,然后,刪除?`user`?表。這極有可能導致網站出差,數據丟失。(你是否進行了規律的數據備份?) 在 Yii 中,大部分的數據查詢是通過?[Active Record](http://www.yiichina.com/doc/guide/2.0/db-active-record)?進行的,而其是完全使用 PDO 預處理語句執行 SQL 查詢的。在預處理語句中,上述示例中,構造 SQL 查詢的場景是不可能發生的。 有時,你仍需要使用?[raw queries](http://www.yiichina.com/doc/guide/2.0/db-dao)?或者?[query builder](http://www.yiichina.com/doc/guide/2.0/db-query-builder)。在這種情況下,你應該使用安全的方式傳遞參數。如果數據是提供給表列的值,最好使用預處理語句: ~~~ // query builder $userIDs = (new Query()) ->select('id') ->from('user') ->where('status=:status', [':status' => $status]) ->all(); // DAO $userIDs = $connection ->createCommand('SELECT id FROM user where status=:status') ->bindValues([':status' => $status]) ->queryColumn(); ~~~ 如果數據是用于指定列的名字,或者表的名字,最好的方式是只允許預定義的枚舉值。 ~~~ function actionList($orderBy = null) { if (!in_array($orderBy, ['name', 'status'])) { throw new BadRequestHttpException('Only name and status are allowed to order by.') } // ... } ~~~ 如果上述方法不行,表名或者列名應該被轉義。 Yii 針對這種轉義提供了一個特殊的語法,這樣可以在所有支持的數據庫都使用一套方案。 ~~~ $sql = "SELECT COUNT($column) FROM {{table}}"; $rowCount = $connection->createCommand($sql)->queryScalar(); ~~~ 你可以在?[Quoting Table and Column Names](http://www.yiichina.com/doc/guide/2.0/db-dao#quoting-table-and-column-names)?中獲取更多的語法細節。 ## 防止 XSS 攻擊 XSS 或者跨站腳本發生在輸出 HTML 到瀏覽器時,輸出內容沒有正確的轉義。例如,如果用戶可以輸入其名稱,那么他輸入`<script>alert('Hello!');</script>`?而非其名字?`Alexander`,所有輸出沒有轉義直接輸出用戶名的頁面都會執行 JavaScript 代碼?`alert('Hello!');`,這會導致瀏覽器頁面上出現一個警告彈出框。就具體的站點而言,除了這種無意義的警告輸出外,這樣的腳本可以以你的名義發送一些消息到后臺,甚至執行一些銀行交易行為。 避免 XSS 攻擊在 Yii 中非常簡單,有如下兩種一般情況: 1. 你希望數據以純文本輸出。 2. 你希望數據以 HTML 形式輸出。 如果你需要的是純文本,你可以如下簡單的轉義: ~~~ <?= \yii\helpers\Html::encode($username) ?> ~~~ 如果是 HTML ,我們可以用 HtmlPurifier 幫助類來執行: ~~~ <?= \yii\helpers\HtmlPurifier::process($description) ?> ~~~ 注意: HtmlPurifier 幫助類的處理過程較為費時,建議增加緩存: ## 防止 CSRF 攻擊 CSRF 是跨站請求偽造的縮寫。這個攻擊思想源自許多應用程序假設來自用戶的瀏覽器請求是由用戶自己產生的,而事實并非如此。 比如說:`an.example.com`?站點有一個?`/logout`?URL,當以 GET 請求訪問時,登出用戶。如果它是由用戶自己操作的,那么一切都沒有問題。但是,有一天壞人在一個用戶經常訪問的論壇發了一個?`<img src="/docs/guide/2.0/http://an.example.com/logout">`?內容的帖子。瀏覽器無法辨別請求一個圖片還是一個頁面,所以,當用戶打開含有上述標簽的頁面時,他將會從?`an.example.com`?登出。 上面就是最原始的思想。有人可能會說,登出用戶也不是什么嚴重問題,然而,我們發送一些 POST 數據其實也不是很麻煩的事情。 為了避免 CSRF 攻擊,你總是需要: 1. 遵循 HTTP 準則,比如 GET 不應該改變應用的狀態。 2. 保證 Yii CSRF 保護開啟。 ## 防止文件暴露 默認的服務器 webroot 目錄指向包含有?`index.php`?的?`web`?目錄。在共享托管環境下,這樣是不可能的,這樣導致了所有的代碼,配置,日志都在webroot目錄。 如果是這樣,別忘了拒絕除了?`web`?目錄以外的目錄的訪問權限。如果沒法這樣做,考慮將你的應用程序托管在其他地方。 ## 在生產環境關閉調試信息和工具 在調試模式下, Yii 展示了大量的錯誤信息,這樣是對開發有用的。同樣,這些調試信息對于攻擊者而言也是方便其用于破解數據結構,配置值,以及你的部分代碼。永遠不要在生產模式下將你的?`index.php`?中的?`YII_DEBUG`?設置為?`true`。 你同樣也不應該在生產模式下開啟 Gii。它可以被用于獲取數據結構信息,代碼,以及簡單的用 Gii 生成的代碼覆蓋你的代碼。 調試工具欄同樣也應該避免在生產環境出現,除非非常有必要。它將會暴露所有的應用和配置的詳情信息。如果你確定需要,反復確認其訪問權限限定在你自己的 IP。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看