Overview
如果沒有適當(dāng)?shù)?access control,mysql_query執(zhí)行一個(gè) SQL 指令時(shí),如果該指令包含一個(gè)受攻擊者控制的主鍵,從而允許攻擊者訪問(wèn)未經(jīng)授權(quán)的記錄。
Details
Database access control 錯(cuò)誤在以下情況下發(fā)生: 1. 數(shù)據(jù)從一個(gè)不可信賴的數(shù)據(jù)源進(jìn)入程序。 2. 這個(gè)數(shù)據(jù)用來(lái)指定 SQL 查詢中主鍵的值。?
例 1:以下代碼用到一個(gè)參數(shù)化指令,這個(gè)指令轉(zhuǎn)義了元字符,以防止 SQL injection 漏洞,并構(gòu)建和執(zhí)行一個(gè) SQL 查詢。該 SQL 查詢指令可以搜索與指定標(biāo)識(shí)符 [1] 相匹配的清單。您可以從與當(dāng)前被授權(quán)用戶有關(guān)的所有清單中選擇這些標(biāo)識(shí)符。 ...
$id = $_POST['id']; $query = "SELECT * FROM invoices WHERE id = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('ss',$id); $stmt->execute(); ...
問(wèn)題在于開發(fā)者沒有考慮到所有可能出現(xiàn)的 id 值。雖然界面生成了屬于當(dāng)前用戶的清單標(biāo)識(shí)符列表,但是攻擊者可以繞過(guò)這個(gè)界面,從而獲取所需的任何清單。由于此示例中的代碼沒有執(zhí)行檢查以確保用戶具有訪問(wèn)所請(qǐng)求清單的權(quán)限,因此它會(huì)顯示任何清單,即使此清單不屬于當(dāng)前用戶。 許多現(xiàn)代 Web 框架都會(huì)提供對(duì)用戶輸入執(zhí)行驗(yàn)證的機(jī)制(包括 Struts 和 Struts 2)。為了突出顯示未經(jīng)驗(yàn)證的輸入源,F(xiàn)ortify 安全編碼規(guī)則包會(huì)對(duì) Fortify Static Code Analyzer(Fortify 靜態(tài)代碼分析器)報(bào)告的問(wèn)題動(dòng)態(tài)重新調(diào)整優(yōu)先級(jí),即在采用框架驗(yàn)證機(jī)制時(shí)降低這些問(wèn)題被利用的幾率并提供指向相應(yīng)證據(jù)的指針。我們將這種功能稱之為上下文敏感排序。為了進(jìn)一步幫助 Fortify 用戶執(zhí)行審計(jì)過(guò)程,F(xiàn)ortify 軟件安全研究團(tuán)隊(duì)開發(fā)了 Data Validation(數(shù)據(jù)驗(yàn)證)項(xiàng)目模板,該模板根據(jù)應(yīng)用于輸入源的驗(yàn)證機(jī)制按文件夾對(duì)問(wèn)題進(jìn)行了分組。
Recommendations
與其靠表示層來(lái)限制用戶輸入的值,還不如在應(yīng)用程序和數(shù)據(jù)庫(kù)層上進(jìn)行 access control。任何情況下都不允許用戶在沒有取得相應(yīng)權(quán)限的情況下獲取或修改數(shù)據(jù)庫(kù)中的記錄。每個(gè)涉及數(shù)據(jù)庫(kù)的查詢都必須遵守這個(gè)原則,這可以通過(guò)把當(dāng)前被授權(quán)的用戶名作為查詢語(yǔ)句的一部分來(lái)實(shí)現(xiàn)。
示例 2:以下代碼實(shí)現(xiàn)的功能與Example 1 相同,但是附加了一個(gè)限制,以驗(yàn)證清單是否屬于當(dāng)前經(jīng)過(guò)身份驗(yàn)證的用戶。
$mysqli = new mysqli($host,$dbuser, $dbpass, $db);
$userName = getAuthenticated($_SESSION['userName']);
$id = $_POST['id'];
$query = "SELECT * FROM invoices WHERE id = ? AND user = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('ss',$id,$userName);文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-810942.html
$stmt->execute(); ...文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-810942.html
到了這里,關(guān)于開發(fā)安全之:Access Control: Database的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!