php資料庫安全性-SQL注入及預防措施
很多 web 開發者沒有註意到 SQL 查詢是可以被竄改的,因而把 SQL 查詢當作可信賴的指令。殊不知道,SQL 查詢可以繞過存取控制,從而繞過身份驗證和權限檢查。更有甚者,有可能透過 SQL 查詢去執行主機作業系統層級的命令。
直接 SQL 指令注入就是攻擊者常用的一種創建或修改已有 SQL 語句的技術,從而達到取得隱藏數據,或覆蓋關鍵的值,甚至執行資料庫主機作業系統命令的目的。這是透過應用程式取得使用者輸入並與靜態參數組合成 SQL 查詢來實現的。下面將會給出一些真實的例子。
由於在缺乏對輸入的資料進行驗證,並且使用了超級用戶或其它有權創建新用戶的資料庫帳號來連接,攻擊者可以在資料庫中新建一個超級用戶。
Example #1 一段實現資料分頁顯示的程式碼…也可以被用來作為建立一個超級使用者(PostgreSQL系統)。
<?php $offset = $argv[0]; // 注意,没有输入验证! $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; $result = pg_query($conn, $query); ?>
一般的使用者會點選 $offset 已被斌值的「上一頁」、「下一頁」的連結。原本程式碼只會認為 $offset 是一個數值。然而,如果有人嘗試把以下語句先經過 urlencode() 處理,然後再加入URL中的話:
0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; --
那麼他就可以創建一個超級用戶了。注意那個 0; 只不過是為了提供一個正確的偏移量以便補充完整原來的查詢,使它不要出錯而已。
Note:
-- 是 SQL 的註解標記,一般可以用來它告訴 SQL 解譯器忽略後面的語句。
對顯示搜尋結果的頁面下手是一個能得到密碼的可行辦法。攻擊者所要做的只不過是找出哪些提交上去的變數是用於 SQL 語句並且處理不當的。而這類的變數通常都被用於SELECT 查詢中的條件語句,如 WHERE, ORDER BY, LIMIT 和 OFFSET。如果資料庫支援 UNION 建構的話,攻擊者也可能會把一個完整的 SQL 查詢附加到原來的語句上以便從任何資料表中得到密碼。因此,對密碼欄位加密是很重要的。
Example #2 顯示文章…以及一些密碼(任何資料庫系統)
<?php $query = "SELECT id, name, inserted, size FROM products WHERE size = '$size' ORDER BY $order LIMIT $limit, $offset;"; $result = odbc_exec($conn, $query); ?>
可以在原來的查詢的基礎上添加另一個 SELECT 查詢來獲得密碼:
' union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable; --
假如上述語句(使用假 ' 和 -- 和 -- 被加入 $query 中的任一個變數的話,那就麻煩了。
SQL 中的 UPDATE 也會受到攻擊。這種查詢也可能像上面的例子一樣被插入或附加上另一個完整的請求。但是攻擊者更願意對 SET 子句下手,這樣他們就可以更改資料表中的一些資料。這種情況必須要知道資料庫的結構才能修改查詢成功進行。可以透過表單上的變數名稱對欄位進行猜測,或是進行暴力破解。對於存放使用者名稱和密碼的字段,命名的方法並不多。
Example #3 從重置密碼…到獲得更多權限(任何資料庫系統)
<?php $query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';"; ?>
但是惡意的使用者會把 ' or uid like'%admin%'; -- 作為變數的值提交給 $uid 來改變admin 的密碼,或把 $pwd 的值提交為 "hehehe', admin='yes', trusted=100 "(後面有個空格)去獲得更多的權限。這樣做的話,查詢語句其實變成了:
<?php // $uid == ' or uid like'%admin%'; -- $query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --"; // $pwd == "hehehe', admin='yes', trusted=100 " $query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...;"; ?>
下面這個可怕的例子將會示範如何在某些資料庫上執行系統指令。
Example #4 攻擊資料庫所在主機的作業系統(MSSQL Server)
<?php $query = "SELECT * FROM products WHERE id LIKE '%$prod%'"; $result = mssql_query($query); ?>
如果攻擊提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作為變數$prod的值,那麼 query將會變成
<?php $query = "SELECT * FROM products WHERE id LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--"; $result = mssql_query($query); ?>
MSSQL 伺服器會執行這條SQL 語句,包括它後面那個用來新增使用者給系統的指令。如果這個程式是以 sa 運作而 MSSQLSERVER 服務又有足夠的權限的話,攻擊者就可以獲得一個系統帳號來存取主機了。
Note:
雖然以上的例子是針對某一特定的資料庫系統的,但是這並不代表不能對其它資料庫系統實施類似的攻擊。使用不同的方法,各種資料庫都有可能遭殃。
預防措施
也許有人會自我安慰,說攻擊者要知道資料庫結構的資訊才能實施上面的攻擊。沒錯,確實如此。但沒人能保證攻擊者一定得不到這些訊息,一但他們得到了,資料庫有外洩的危險。如果你在用開放原始碼的軟體包來存取資料庫,例如論壇程序,攻擊者就很容地得到相關的程式碼。如果這些程式碼設計不良的話,風險就更大了。
这些攻击总是建立在发掘安全意识不强的代码上的。所以,永远不要信任外界输入的数据,特别是来自于客户端的,包括选择框、表单隐藏域和 cookie。就如上面的第一个例子那样,就算是正常的查询也有可能造成灾难。
永远不要使用超级用户或所有者帐号去连接数据库。要用权限被严格限制的帐号。
检查输入的数据是否具有所期望的数据格式。PHP 有很多可以用于检查输入的函数,从简单的变量函数和字符类型函数(比如 is_numeric(), ctype_digit())到复杂的Perl 兼容正则表达式函数都可以完成这个工作。
如果程序等待输入一个数字,可以考虑使用 is_numeric() 来检查,或者直接使用 settype() 来转换它的类型,也可以用 sprintf() 把它格式化为数字。
Example #5 一个实现分页更安全的方法
<?php settype($offset, 'integer'); $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; // 请注意格式字符串中的 %d,如果用 %s 就毫无意义了 $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", $offset); ?>
使用数据库特定的敏感字符转义函数(比如 mysql_escape_string() 和 sql_escape_string())把用户提交上来的非数字数据进行转义。如果数据库没有专门的敏感字符转义功能的话 addslashes() 和 str_replace() 可以代替完成这个工作。看看第一个例子,此例显示仅在查询的静态部分加上引号是不够的,查询很容易被攻破。
要不择手段避免显示出任何有关数据库的信心,尤其是数据库结构。
也可以选择使用数据库的存储过程和预定义指针等特性来抽象数库访问,使用户不能直接访问数据表和视图。但这个办法又有别的影响。
除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但利用它可以跟踪到哪个程序曾经被尝试攻击过。日志本身没用,要查阅其中包含的信息才行。毕竟,更多的信息总比没有要好。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
