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 官方部落格
相關文章
- ES-MySQL-PHP的使用MySqlPHP
- PHP 安全:如何防範使用者上傳 PHP 可執行檔案PHP
- 如何寫出安全又可靠的PHP指令碼PHP指令碼
- [PHP 安全] OWASP 維護的 PHP 安全配置速查表PHP
- 筆記:MAC使用brew配置nginx、php、mysql、php-fpm、redis筆記MacNginxPHPMySqlRedis
- MYSQL下如何安全的快速刪除大表MySql
- MySql escape如何使用MySql
- 28. 使用MySQL之安全管理MySql
- 如何在 XAMPP 中使用 不同的 PHP 版本PHP
- PHP開發api介面,如何做才算是安全的PHPAPI
- php安全PHP
- php檔案Hash如何使用PHP
- [PHP 安全] pcc —— PHP 安全配置檢測工具PHP
- PHP 互斥鎖:如何確保程式碼的執行緒安全?PHP執行緒
- [精選]php 如何使用最近很火的ChatGPTPHPChatGPT
- MySql如何使用索引(一)MySql索引
- MySql如何使用索引(二)MySql索引
- 如何在FreeBSD中安裝Nginx,MySQL,PHP(FEMP)NginxMySqlPHP
- 如何安全使用加密套件?加密套件
- MySQL Delete PHPMySqldeletePHP
- 教你如何使用 PHP 優雅的生成 PDF 和 ImagePHP
- iOS如何安全而又優雅的使用NSTimeriOS
- MySQL如何避免使用swap(ZT)MySql
- 如何在 PHP 專案中使用 MQTTPHPMQQT
- PHP 命令的使用PHP
- php開源短影片原始碼,如何快速修改MySQL的表結構?PHP原始碼MySql
- PHP安全編碼PHP
- PHP 程式碼安全PHP
- mysql如何修改root使用者的密碼MySql密碼
- MySQL入門--MySQL安全MySql
- 簡單的php連線mysql類PHPMySql
- PHP 如何使用比特幣 Coinbase 錢包庫PHP比特幣
- MySQL中MAX函式如何使用?MySql函式
- 如何使用APT庫安裝MySQLAPTMySql
- MySQL更新資料,如何使用updateMySql
- PHP Mysql support: 是mysql 還是mysqlnd?PHPMySql
- php中foreach的使用PHP
- mysql的使用MySql
- MySQL Workbench 中文使用指南 - 如何使用 Workbench 操作 MySQL 資料庫教程MySql資料庫