PHP 如何安全的使用 MySQL ?

OneAPM官方技術部落格發表於2016-01-19

大多數 PHP 程式設計師對 MySQL 肯定不陌生,至於各種 MySQL 函式的用法在開發手冊和 w3school 這類網站上也有很多介紹。但是,你所用的寫法真的安全嗎?面對越來越猖獗的黑客攻擊,SQL 注入防範非常重要,所以使用 MySQL 也要有更正確的姿勢。

關於 SQL 注入

SQL Injection:就是通過把 SQL 命令插入到 Web 表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的 SQL 命令。

具體來說,它是利用現有應用程式,將(惡意)的 SQL 命令注入到後臺資料庫引擎執行的能力,它可以通過在 Web 表單中輸入(惡意)SQL 語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行 SQL 語句。

在網上可以搜到一些簡單例子,通過一步步有目的地調整 url 請求引數,讓 server 返回其 MySQL 資料結構及內容,以達到獲取敏感資料的目的。

防注入的方法

開發者要使用合適的資料庫操作函式,這一點也是開發手冊和教程上很少提到的。 舉個例子,要實現一個簡單的查詢功能,一般會這樣寫:

```

$username = $_POST['user']; $password = $_POST['pwd'];

$sql = "SELECT * FROM Person WHERE username=$username AND password=$password";

mysql_query($sql,$con);

// 一些程式碼

mysql_close($con); ?> ```

這種用法相當不安全,如果被人盯上,會很容易地進行 sql 注入 所以有不少人推薦使用 mysql_real_escape_string,寫法如下:

```

$username = $_POST['user']; $password = $_POST['pwd'];

// 如果不是數字則加引號 $username = "'" . mysql_real_escape_string($username) . "'"; $password = "'" . mysql_real_escape_string($password) . "'";

$sql = "SELECT * FROM Person WHERE username=$username AND password=$password";

mysql_query($sql,$con);

// 一些程式碼

mysql_close($con); ?> ```

這種方法安全性比第一種更高,但對方還是可以利用編碼的漏洞來實現輸入任意密碼就能登入伺服器的注入攻擊。另外像一些 str_replace,addslashes 或者使用 magic_quotes_gpc 選項之類的方法,不是已經失效就是仍然有可能被破解。

然而百度一下「PHP 防注入」,仍然有很多文章在介紹上述辦法。所以我們這裡要鄭重提示大家這個風險,提醒所有後來者繞過這個坑。

那麼,如今還能倖免於注入的方法就是 Prepared Statement 機制了。這裡推薦大家使用 mysqli 方式,mysql 擴充套件已經在 php5.5 中被廢棄,在 php7 中更是直接不支援。為向高版本相容考慮,新程式碼儘量使用 mysqli 最終的查詢程式碼就變成了這樣:

```

if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }

$username = $_POST['user']; $password = $_POST['pwd'];

if ($stmt = $mysqli->prepare("SELECT * FROM Person WHERE username=? AND password=?")) { $stmt->bind_param("ss",$username,$password);

$stmt->execute(); }

// 一些程式碼

$mysqli->close(); ?> ```

把所有操作 MySQL 的程式碼都重構成上面這樣,那麼面對 SQL 注入就可以高枕無憂了。另外 pdo 也有 Prepared Statement 機制,同樣能夠保護資料庫,有興趣的同學可以自己嘗試一下。

OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用效能管理 能夠深入到所有 PHP 應用內部完成應用效能管理和監控,包括程式碼級別效能問題的可見性、效能瓶頸的快速識別與追溯、真實使用者體驗監控、伺服器監控和端到端的應用效能管理。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格 本文轉自 OneAPM 官方部落格

相關文章