<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國際加速解決方案。 廣告
                # 第四節:SQL注入 # SQL注入 所謂SQL注入,就是通過把SQL命令插入到表單中或頁面請求的查詢字符串中,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到后臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。 比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的。 ## 場景: 比如現在數據庫中有一個`front_user`表,表結構如下: ``` <pre class="calibre12">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span><span class="hljs-params">(models.Model)</span>:</span> telephone = models.CharField(max_length=<span class="hljs-params">11</span>) username = models.CharField(max_length=<span class="hljs-params">100</span>) password = models.CharField(max_length=<span class="hljs-params">100</span>) ``` ``` 然后我們使用原生`sql`語句實現以下需求: 1. 實現一個根據用戶`id`獲取用戶詳情的視圖。示例代碼如下: ``` <pre class="calibre12">``` <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">index</span><span class="hljs-params">(request)</span>:</span> user_id = request.GET.get(<span class="hljs-string">'user_id'</span>) cursor = connection.cursor() cursor.execute(<span class="hljs-string">"select id,username from front_user where id=%s"</span> % user_id) rows = cursor.fetchall() <span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows: print(row) <span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'success'</span>) ``` ``` 這樣表面上看起來沒有問題。但是如果用戶傳的`user_id`是等于`1 or 1=1`,那么以上拼接后的`sql`語句為: ``` <pre class="calibre12">``` <span class="hljs-keyword">select</span> <span class="hljs-keyword">id</span>,username <span class="hljs-keyword">from</span> front_user <span class="hljs-keyword">where</span> <span class="hljs-keyword">id</span>=<span class="hljs-params">1</span> <span class="hljs-keyword">or</span> <span class="hljs-params">1</span>=<span class="hljs-params">1</span> ``` ``` 以上`sql`語句的條件是`id=1 or 1=1`,只要`id=1`或者是`1=1`兩個有一個成立,那么整個條件就成立。毫無疑問`1=1`是肯定成立的。因此執行完以上`sql`語句后,會將`front_user`表中所有的數據都提取出來。 2. 實現一個根據用戶的`username`提取用戶的視圖。示例代碼如下: ``` <pre class="calibre12">``` <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">index</span><span class="hljs-params">(request)</span>:</span> username = request.GET.get(<span class="hljs-string">'username'</span>) cursor = connection.cursor() cursor.execute(<span class="hljs-string">"select id,username from front_user where username='%s'"</span> % username) rows = cursor.fetchall() <span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows: print(row) <span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'success'</span>) ``` ``` 這樣表面上看起來也沒有問題。但是如果用戶傳的`username`是`zhiliao' or '1=1`,那么以上拼接后的`sql`語句為: ``` <pre class="calibre12">``` <span class="hljs-keyword">select</span> <span class="hljs-keyword">id</span>,username <span class="hljs-keyword">from</span> front_user <span class="hljs-keyword">where</span> username=<span class="hljs-string">'zhiliao'</span> <span class="hljs-keyword">or</span> <span class="hljs-string">'1=1'</span> ``` ``` 以上`sql`語句的條件是`username='zhiliao'`或者是一個字符串,毫無疑問,字符串的判斷是肯定成立的。因此會將`front_user`表中所有的數據都提取出來。 ## sql注入防御: 以上便是`sql`注入的原理。他通過傳遞一些惡意的參數來破壞原有的`sql`語句以便達到自己的目的。當然`sql`注入遠遠沒有這么簡單,我們現在講到的只是冰山一角。那么如何防御`sql`注入呢?歸類起來主要有以下幾點: 1. 永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。 2. 永遠不要使用動態拼裝`sql`,可以使用參數化的`sql`或者直接使用存儲過程進行數據查詢存取。比如:``` <pre class="calibre12">``` <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">index</span><span class="hljs-params">(request)</span>:</span> user_id = <span class="hljs-string">"1 or 1=1"</span> cursor = connection.cursor() cursor.execute(<span class="hljs-string">"select id,username from front_user where id=%s"</span>,(user_id,)) rows = cursor.fetchall() <span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows: print(row) <span class="hljs-keyword">return</span> HttpResponse(<span class="hljs-string">'success'</span>) ``` ``` 3. 永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。 4. 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。 5. 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。 ## 在Django中如何防御`sql`注入: 1. 使用`ORM`來做數據的增刪改查。因為`ORM`使用的是參數化的形式執行`sql`語句的。 2. 如果萬一要執行原生`sql`語句,那么建議不要拼接sql,而是使用參數化的形式。
                  <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>

                              哎呀哎呀视频在线观看