PHP 如何安全的使用 MySQL ?
大多數 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 官方部落格
相關文章
- PHP+MySQL安全方案整理PHPMySql
- ES-MySQL-PHP的使用MySqlPHP
- PHP 安全:如何防範使用者上傳 PHP 可執行檔案PHP
- 如何寫出安全又可靠的PHP指令碼PHP指令碼
- [Chromium]如何安全的使用PostTask
- 如何消除MySQL賬號的安全隱患MySql
- php中如何使用phpredisPHPRedis
- MYSQL下如何安全的快速刪除大表MySql
- [PHP 安全] OWASP 維護的 PHP 安全配置速查表PHP
- MySql escape如何使用MySql
- PHP開發api介面,如何做才算是安全的PHPAPI
- php安全PHP
- PHP,CURL和你的安全!PHP
- 如何安全使用加密套件?加密套件
- php檔案Hash如何使用PHP
- 如何在 XAMPP 中使用 不同的 PHP 版本PHP
- [PHP 安全] pcc —— PHP 安全配置檢測工具PHP
- 如何通過 PHP 取得 MySQL procedure 結果PHPMySql
- 筆記:MAC使用brew配置nginx、php、mysql、php-fpm、redis筆記MacNginxPHPMySqlRedis
- MySql如何使用索引(二)MySql索引
- MySql如何使用索引(一)MySql索引
- MAC使用brew搭建nginx、php、mysql環境MacNginxPHPMySql
- [精選]php 如何使用最近很火的ChatGPTPHPChatGPT
- 如何使用PHP開發高效的WEB系統PHPWeb
- 【PHP】Php連結mysqlPHPMySql
- PHP如何使用GeoIP資料庫PHP資料庫
- PHP web 安全PHPWeb
- 如何安全刪除mysql下的binlog日誌薦MySql
- 如何檢視執行中的apache,php,mysql的編譯引數ApachePHPMySql編譯
- MySQL如何避免使用swap(ZT)MySql
- 教你如何使用 PHP 優雅的生成 PDF 和 ImagePHP
- 網路安全系列之十八 MySQL基本操作(PHP注入基礎)MySqlPHP
- MySQL Delete PHPMySqldeletePHP
- PHP和MySQLPHPMySql
- 如何在 PHP 專案中使用 MQTTPHPMQQT
- MYSQL 安全MySql
- 如何在FreeBSD中安裝Nginx,MySQL,PHP(FEMP)NginxMySqlPHP
- PHP安全編碼PHP