作為web開發人員,我們首先應當知道,不應當相信所有使用者送出的資料,即,預設 使用者送出的所有資料,我們都應将其視為惡意代碼資料,應當對其進行相關處理,再進行資料的解析。
我們從php的學習開始,從幾個小小的執行個體,分析一下可能的攻擊
首先我們先了解一下兩種比較常見的攻擊
sql注入
sql注入,從名字來看,不難了解為,通過SQL語句,通過注入某些東西的手段,達到自己的目的
官方解釋如下:
所謂SQL注入,就是通過把SQL指令插入到Web表單送出或輸入域名或頁面請求的查詢字元串,最終達騙伺服器執行惡意的SQL指令。
SQL注入攻擊指的是通過建構特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL文法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,緻使非法資料侵入系統
我們本地資料庫目前有資料如下
我們寫基于菜鳥教程第一版的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結果如下
觀察到,和我們想象中一樣。
此時,我們不妨再寫一個存入資料庫的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成功
目前,資料庫資料如下
現在我們開始模拟sql攻擊
為了直覺看出差別,我們略微修改第一個select的部分代碼如下
$id = $_POST['id'];
$sql = "SELECT name, password FROM sql_attack WHERE id='$id' and password ='asd'";
目前模拟執行如下,
現在,我們往資料庫添加一個新的資料,
name = " 1 ’ or 1=1 #";
password = 1;
我們觀察到,id為5,我們進行如下請求id為5的password 和 asd 不比對,是以,傳回0.
但是,當我們送出id 為 5’#
看到,結果被傳回了,這樣想,如果不是5,換另外一個數,也可以被同步傳回!
安全問題!暴露!
(甚至如果嵌入其他SQL代碼,問題就大了)!!
分析一下,原因
列印一下sql語句,發現sql語句變成了
可能還不太顯眼,放到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,非常簡單的例子
進行如上輸入,就輸出了錯誤的情況
如果嵌入代碼,是破壞性更嚴重的代碼,各種資料就可能洩露!
防禦:
采用該函數,即可得到比較有效的防禦
具體不再進行安全測試,本文章主要給萌新提供一種思路和解析情況,具體了解,請具體參照官方文檔,安全第一!
Tips:
第一個php檔案中,直接将資料庫的各種資訊暴露了,不如再看看如何在另一個檔案中寫,再引入該檔案
(時間緊迫,思緒比較混亂,如有錯誤,請留言,謝謝)