
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授予許可權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者帳戶
- MySQL - 解鎖使用者帳戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 清空表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - 插入查詢
- MySQL - 選擇查詢
- MySQL - 更新查詢
- MySQL - 刪除查詢
- MySQL - 替換查詢
- MySQL - 插入忽略
- MySQL - 插入重複鍵更新
- MySQL - 插入到選擇
- MySQL 運算子和子句
- MySQL - Where 子句
- MySQL - Limit 子句
- MySQL - Distinct 子句
- MySQL - Order By 子句
- MySQL - Group By 子句
- MySQL - Having 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - Like 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - 不等於運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - Between 運算子
- MySQL - UNION 運算子
- MySQL - UNION 與 UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - 內連線
- MySQL - 左連線
- MySQL - 右連線
- MySQL - 交叉連線
- MySQL - 全連線
- MySQL - 自連線
- MySQL - 刪除連線
- MySQL - 更新連線
- MySQL - Union 與 Join
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - 插入前觸發器
- MySQL - 插入後觸發器
- MySQL - 更新前觸發器
- MySQL - 更新後觸發器
- MySQL - 刪除前觸發器
- MySQL - 刪除後觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式和運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 公共表表達式
- MySQL - On Delete Cascade
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - 訊號
- MySQL - 重新發送訊號
- MySQL - 字元集
- MySQL - 校對
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 今日日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - Explain
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - 顯示 Processlist
- MySQL - 更改列型別
- MySQL - 重置自動增量
- MySQL - Coalesce() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - SQL 注入
MySQL 中的 SQL 注入是一種有害的方法,攻擊者透過這種方法將有害的 SQL 程式碼插入或“注入”到資料庫查詢中。這可以透過使用者輸入(例如表單、URL 引數或 Cookie)來完成。攻擊者利用軟體中的弱點從資料庫中竊取資訊。
SQL 注入是如何工作的
假設您有一個帶有登入頁面的 Web 應用程式。當用戶輸入其使用者名稱和密碼時,應用程式會將這些憑據與 MySQL 資料庫中的憑據進行比較。SQL 查詢可能如下所示:
SELECT * FROM users WHERE username = 'user' AND password = 'password';
在安全的應用程式中,“使用者”和“密碼”將是使用者實際輸入的值。但是,在 SQL 注入攻擊中,攻擊者可以操縱輸入欄位以注入惡意 SQL 程式碼。
例如,他們可能會輸入以下內容作為使用者名稱:
' OR '1' = '1
現在,SQL 查詢變為:
SELECT * FROM users WHERE username = '' OR '1' = '1' AND password = 'password';
因為“1”始終等於“1”,所以此條件始終為真,攻擊者可以未經授權訪問應用程式。透過這種方式,他們誘使應用程式在沒有有效密碼的情況下授予訪問許可權。
防止 SQL 注入
為了防止 SQL 注入,在使用 PERL 和 PHP 等指令碼語言時,正確處理跳脫字元非常重要。在使用 PHP 和 MySQL 時,您可以使用 **mysql_real_escape_string()** 函式轉義在 MySQL 中具有特殊含義的輸入字元。以下是如何執行此操作的示例:
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } // escape input characters $name = mysql_real_escape_string($name); // Perform the MySQL query with the escaped 'name' mysqli_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");
LIKE 子句的難題
現在,讓我們解決 LIKE 子句的問題。在處理可能包含“%”和“_”字元的使用者提供的資料時,建立自定義轉義機制以將其視為字面量非常重要。您可以透過將“mysql_real_escape_string()”函式與“addcslashes()”函式結合使用來實現此目的,該函式允許您指定要轉義的字元範圍。以下是如何執行此操作的示例:
// Escape and convert '%' and '_' in the user-provided string $sub = addcslashes(mysql_real_escape_string("%str"), "%_"); // $sub will be equal to \%str\_ // Use the escaped string in the LIKE query mysqli_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
透過這種方式,您可以確保使用者輸入中的“%”和“_”字元在 SQL 查詢中被視為字面字元,從而防止 SQL 注入並維護資料庫操作的完整性。