漏洞與修補留言板 XSS 和 SQL Injection


Posted by tzutzu858 on 2020-09-10

XSS

Cross-site scripting 不叫 css 是因為 css 已經有人用了
XSS : 一種網站應用程式的安全漏洞攻擊,是代碼注入的一種


好玩的開始囉!興奮興奮O(≧▽≦)O自己的網站自己攻

插入 script 標籤,然後裡面放 google 連結,那之後誰進來這網站都直接被導到 google 首頁去
因為原本首頁是寫放留言的這個資料表用迴圈秀出來,然後直接加在 HTML 裡面,所以只要這個留言還存在,就會直接導向釣魚網站,或是用無窮迴圈跳 alert ,只要進到這個網站就有關不完的alert,終於知道小時候遇到那些討人厭的網站是怎麼弄出來的。

知道網站漏洞後就要開始修補漏洞囉!!

php 有提供內建的 function 叫做 htmlspecialchars,他可以把特殊的字元,編碼成另一個,例如 < 編碼成 &lt;,那這個 &lt; 會被 html 解釋成小於這個符號,而不是小於這個 tag,有些人可能會想 htmlspecialchars 是不是在資料庫以前做,但會推薦這個 htmlspecialchars 在顯示的時候做,讓資料庫保持使用者輸入的內容。

function escape($str)
{
    return htmlspecialchars($str, ENT_QUOTES);
}
<?php echo escape($row['content']); ?>

SQL Injection

偽造別人留言

如果知道資料表名稱,就可以下 SQL 語法

'), ('gg', (select password from users limit 1))#

修正 SQL Injection 就要用到 Prepared Statements

其實就是把使用者輸入的內容解釋成字串,就不會有問題了

Prepared Statements : MySQL數據庫支持準備好的語句。準備好的語句或參數化的語句,用於重複執行同一條語句。
The MySQL database supports prepared statements. A prepared statement or a parameterized statement is used to execute the same statement repeatedly with high efficiency.

作法 :

把原本的 sprintf 拿掉
sprintf : Return a formatted string
變成

$sql = "INSERT INTO table_name(nickname, content) VALUE(?, ?)" // 參數改成 ?;
$stmt = $conn->prepare($sql);
$stmt->bind_param('ss', $nickname, $content); //兩個參數都是字串,就打SS

bind_param('ss', $nickname, $content);

  1. bind_param() 該函式繫結了 SQL 的引數,且告訴資料庫引數的值。 'ss' 引數列處理其餘引數的資料型別。s 字元告訴資料庫該引數為字串。

引數有以下四種型別:
i – integer(整型)
d – double(雙精度浮點型)
s – string(字串)
b – BLOB(布林值)

這樣就結合成一個完整的 query
原本 $result = $conn->query($sql); 變成 $result = $stmt->execute();

需要拿結果就 $result = $stmt->get_result();











Related Posts

防止 XSS 可能比想像中困難

防止 XSS 可能比想像中困難

OOP - 3 物件與類別

OOP - 3 物件與類別

JS Advanced --Closure 閉包

JS Advanced --Closure 閉包


Comments