MySQL 是一款常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由于其開源、易用等特點(diǎn),很多網(wǎng)站都采用了 MySQL 數(shù)據(jù)庫作為后端存儲(chǔ)數(shù)據(jù)。但是,由于 MySQL 注入漏洞的存在,攻擊者可以通過幾行簡單的代碼,輕松地從數(shù)據(jù)庫中讀取敏感信息,比如管理員賬號(hào)密碼等。
下面演示一下通過 MySQL 注入漏洞讀取數(shù)據(jù)庫密碼的方法。
// 在登錄頁面中,用戶輸入的數(shù)據(jù)沒有進(jìn)行過濾,直接拼接到 sql 語句中
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// 而攻擊者可以構(gòu)造惡意數(shù)據(jù)進(jìn)行 SQL 注入攻擊
$username = "' or 1=1#";
$password = "'";
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// 這樣構(gòu)造的 SQL 語句中,1=1 為恒成立的條件,# 號(hào)為注釋符號(hào),使得 SQL 語句變?yōu)?
// SELECT * FROM users WHERE username='' or 1=1#' AND password=''
// 實(shí)際執(zhí)行時(shí),查詢條件中的 or 1=1# 部分會(huì)被忽略,而查詢語句變?yōu)?
// SELECT * FROM users WHERE username='' AND password=''
// 這樣就能獲得數(shù)據(jù)庫中所有用戶名和密碼的信息了
為了防止 MySQL 注入攻擊,可以采取以下措施:
- 對(duì)用戶輸入的數(shù)據(jù)進(jìn)行過濾,比如去除空格、過濾特殊字符等
- 使用預(yù)處理語句保護(hù) SQL 查詢,預(yù)處理語句會(huì)自動(dòng)對(duì)用戶輸入的數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理,防止注入漏洞
- 采用 ORM 框架等高層抽象工具,讓用戶輸入的數(shù)據(jù)通過對(duì)象操作,而非直接拼接為 SQL 語句