天天看點

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

作為web開發人員,我們首先應當知道,不應當相信所有使用者送出的資料,即,預設 使用者送出的所有資料,我們都應将其視為惡意代碼資料,應當對其進行相關處理,再進行資料的解析。

我們從php的學習開始,從幾個小小的執行個體,分析一下可能的攻擊

首先我們先了解一下兩種比較常見的攻擊

sql注入

sql注入,從名字來看,不難了解為,通過SQL語句,通過注入某些東西的手段,達到自己的目的

官方解釋如下:

所謂SQL注入,就是通過把SQL指令插入到Web表單送出或輸入域名或頁面請求的查詢字元串,最終達騙伺服器執行惡意的SQL指令。

SQL注入攻擊指的是通過建構特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL文法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,緻使非法資料侵入系統

我們本地資料庫目前有資料如下

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

我們寫基于菜鳥教程第一版的php如下

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $database="sql_test";
    // 建立連接配接
    $conn = new mysqli($servername, $username, $password,$database);
     
    // 檢測連接配接
    if ($conn->connect_error) {
        die("連接配接失敗: " . $conn->connect_error);
    } 
    $sql = "SELECT id, name, password FROM sql_attack";
    $result = $conn->query($sql);
    
    if ($result->num_rows > 0) {
        // 輸出資料
        while($row = $result->fetch_assoc()) {
            echo "id: " . $row["id"]. " - Name: " . $row["name"]. " " . $row["password"]. "<br>";
        }
    } else {
        echo "0 結果";
    }
    $conn->close();
?>
           

可見,本php通路結果是,周遊輸出所有資料庫中的内容,

我們在浏覽器跑本php結果如下

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

觀察到,和我們想象中一樣。

此時,我們不妨再寫一個存入資料庫的php檔案

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $database="sql_test";
    // 建立連接配接
    $conn = new mysqli($servername, $username, $password,$database);
     
    // 檢測連接配接
    if ($conn->connect_error) {
        die("連接配接失敗: " . $conn->connect_error);
    } 
    $name=$_GET['name'];
    $password=$_GET['password'];
    $sql = "INSERT INTO sql_attack ( name, password)
    VALUES ('$name','$password')";
    if ($conn->query($sql) === TRUE) {
        echo "新記錄插入成功";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
           

get方式和post方式傳參,是一樣的效果,達到我們想要的效果即可,測試add成功

目前,資料庫資料如下

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

現在我們開始模拟sql攻擊

為了直覺看出差別,我們略微修改第一個select的部分代碼如下

$id = $_POST['id'];
$sql = "SELECT  name, password FROM sql_attack WHERE id='$id' and password ='asd'";
           

目前模拟執行如下,

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

現在,我們往資料庫添加一個新的資料,

name = " 1 ’ or 1=1 #";

password = 1;

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)
我們觀察到,id為5,我們進行如下請求
【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

id為5的password 和 asd 不比對,是以,傳回0.

但是,當我們送出id 為 5’#

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)
看到,結果被傳回了,這樣想,如果不是5,換另外一個數,也可以被同步傳回!

安全問題!暴露!

(甚至如果嵌入其他SQL代碼,問題就大了)!!

分析一下,原因

列印一下sql語句,發現sql語句變成了

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

可能還不太顯眼,放到php中,加個顔色,

看到,原來#讓它之後的語句被注釋了,就相當于沒作用!

從小小的執行個體,我們發現了它的原理,進行原理的推斷,防sql注入,可以采用資料的檢驗,如果不是文本字段,QQ号,手機号,姓名,肯定是沒有# ’ ,這種特殊符号,是以,可以進行簡單的邏輯判斷。

防禦:

采用 預處理 的方法

原理是,先執行 SQL語句,再填參數,順序變化,進行防禦。

執行個體代碼如下

$sql = " Insert test SET title=? , u_url=? , content=? WHERE id=? " ;
    $stmt=$conn->prepare($sql);
    $stmt->bind_param("sssi", $title, $u_url, $content,$id);
    $stmt->execute();
           

其餘代碼,類似不再舉例(舉一反三,修改參數,自己測試,動手>看别人的結果)

XSS攻擊

XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使使用者加載并執行攻擊者惡意制造的網頁程式

我們依然以一個最簡單的執行個體來檢視

<?php
    echo $_GET['name'];
           

ok,非常簡單的例子

【從零開始】WEB後端php學習(3) -- 防SQL注入和XSS攻擊--2019(HNU-MSC)

進行如上輸入,就輸出了錯誤的情況

如果嵌入代碼,是破壞性更嚴重的代碼,各種資料就可能洩露!

防禦:

采用該函數,即可得到比較有效的防禦

具體不再進行安全測試,本文章主要給萌新提供一種思路和解析情況,具體了解,請具體參照官方文檔,安全第一!

Tips:

第一個php檔案中,直接将資料庫的各種資訊暴露了,不如再看看如何在另一個檔案中寫,再引入該檔案

(時間緊迫,思緒比較混亂,如有錯誤,請留言,謝謝)