本節包括原始程式碼之外的所有內容,但對於建立中產品的安全性仍至關重要。由於此領域所涵蓋的問題與原始程式碼沒有直接關係,因此我們將其與其他領域分開。
{}
包含到敏感操作的 security
定義中。這會覆寫全域定義的安全要求,並使 createUsers
操作容易遭受未經授權和未經驗證的存取。
{
"openapi": "3.0.0",
"info": {
...
},
"paths": {
"/users": {
"post": {
"security": [
{},
{
"my_auth": [
"write:users"
]
}
],
"summary": "Create a user",
"operationId": "createUsers",
...
}
...
}
}
{}
包含到敏感操作的 security
定義中。這會覆寫全域定義的安全要求,並使 createUsers
操作容易遭受未經授權和未經驗證的存取。
openapi: 3.0.0
info:
...
paths:
/users:
post:
operationId: createUsers
security:
- {}
- oauth_auth:
- write:users
- read:users
responses:
'201':
...
allow_url_fopen
選項,便可使用 HTTP 或 FTP URL 在遠端檔案上執行接受檔案名稱的 PHP 函數。該選項是在 PHP 4.0.4 中增加的,在預設情況下是開啟的,因為它可能會讓攻擊者將惡意內容引入至應用程式中。最理想的情況是,攻擊者改變遠端檔案以引入惡意的內容,因此對遠端檔案進行操作使得應用程式易受攻擊。最差的情況是,攻擊者控制執行應用程式的 URL,則他們可以將 URL 提供至遠端伺服器,將任意的惡意內容插入至應用程式。 $file
的值由要求參數控制,所以攻擊者可違反程式設計師的假設,提供 URL 給遠端檔案。
<?php
$file = fopen ($_GET["file"], "r");
if (!$file) {
// handle errors
}
while (!feof ($file)) {
$line = fgets ($file, 1024);
// operate on file content
}
fclose($file);
?>
allow_url_include
選項,會導致用於指定在目前頁面包含某個檔案的 PHP 函數 (例如include()
和 require()
) 接受指向遠端檔案的 HTTP 或 FTP URL。該選是在 PHP 5.2.0 中增加的,且預設情況下為停用,因為它可能會讓攻擊者將惡意內容引入至應用程式中。最理想的情況是,攻擊者改變遠端檔案以引入惡意的內容,因此包含遠端檔案會使應用程式易受攻擊。最糟糕的情況是,攻擊者控制應用程序用來指定要包含的遠端檔案的 URL,則他們可以將 URL 提供至遠端伺服器,將任意的惡意內容插入至應用程式。cgi.force_redirect
(該選項在預設情況下為啟用),則擁有/cgi-bin/php 存取權的攻擊者可以使用 PHP 解譯器的權限來存取任意的 Web 文件,便可略過任何由伺服器所執行的 access control 檢查。dl
的動態載入可用於規避 open_basedir
限制。enable_dl
組態允許動態載入程式庫。這些可能潛在允許攻擊者規避使用 open_basedir 組態設定的限制,並且潛在允許存取系統上的任何檔案。enable_dl
可能更便於攻擊者利用其他弱點。file_uploads
選項,會讓 PHP 使用者上傳任意的檔案到伺服器中。允許使用者上傳檔案這個功能本身並不代表一種安全性弱點。不過,這個功能可能導致許多的攻擊行為,因為它提供途徑給惡意的使用者將資料引入伺服器環境。
<?php
$udir = 'upload/'; // Relative path under Web root
$ufile = $udir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $ufile)) {
echo "Valid upload received\n";
} else {
echo "Invalid upload rejected\n";
} ?>
open_basedir
組態選項,該選項會試圖阻止 PHP 程式對 php.ini 中所指定的目錄結構以外的檔案執行操作。如果沒有使用 open_basedir
選項指定任何目錄,則在 PHP 下執行的程式將被授予擁有本地 file system 上所有檔案的完整存取權,這會使攻擊者可讀取、寫入或建立他們原本不該擁有存取權的檔案。open_basedir
指定限制的目錄集,可能會讓攻擊者更容易發動其他盜取攻擊。open_basedir
選項可保證系統的安全性,但其執行方式卻受到 race condition 的不利影響,這可能會讓攻擊者在某些情況下略過該選項所定義的限制[2]。PHP 執行存取權限檢查和開啟檔案間,會存在 time-of-check、time-of-use (TOCTOU) race condition。與其他語言中 file system 的 race condition 相同,此種情況會讓攻擊者將指向透過 access control 檢查的 symlink 替換成另一個原來不能通過測試的檔案,以取得受保護檔案的存取權。safe_mode
,safe_mode_exec_dir
選項會限制 PHP 只從指定的目錄執行指令。雖然停用 safe_mode_exec_dir
項目這個作法本身並不是一種安全性弱點,但此新增的方法可能會與其他的弱點一併被攻擊者利用,產生更大的危險。open_basedir
配置指定可以變更的工作目錄。open_basedir
配置選項,該選項會試圖阻止 PHP 程式對 php.ini 中所指定的目錄結構以外的檔案執行操作。如果使用 .
指定工作目錄,攻擊者可使用 chdir()
予以變更。open_basedir
選項可保證系統的安全性,但其執行方式卻受到 race condition 的不利影響,這可能會讓攻擊者在某些情況下略過該選項所定義的限制[2]。PHP 執行存取權限檢查和開啟檔案間,會存在 time-of-check、time-of-use (TOCTOU) race condition。與其他語言中 file system 的 race condition 相同,此種情況會讓攻擊者將指向透過 access control 檢查的 symlink 替換成另一個原來不能通過測試的檔案,以取得受保護檔案的存取權。register_globals
選項,會造成 PHP 對所有的 EGPCS (Environment、GET、POST、Cookie 和 Server) 變數進行全域註冊,使得任何使用者在任何 PHP 程式中都可存取這些變數。如果程式設計師在撰寫程式時啟用此選項,或多或少都會導致察覺不到它們所依賴的原始值,這會導致在正常的環境中產生非預期的運作方式,使程式容易遭受惡意環境中的攻擊者攻擊。由於知道 register_globals
所隱含的安全問題,在 PHP 4.2.0 中該選項的預設為關閉,且在 PHP 6 中捨棄且移除該選項。$username
的值來自伺服器控制的階段作業,但是攻擊者可能會為 $username
提供惡意值來取代要求參數。如果啟用 register_globals
,此程式碼會在其所產生的動態 HTML 內容中包含由攻擊者傳遞的惡意值。
<?php
if (isset($username)) {
echo "Hello <b>$username</b>";
} else {
echo "Hello <b>Guest</b><br />";
echo "Would you like to login?";
}
?>
safe_mode
選項是 PHP 中最重要的 Security Features 之一。若停用 safe_mode
,PHP 會以呼叫它的使用者所擁有的權限對檔案進行操作,而使用者通常為具有特定權限的使用者。雖然將 PHP 配置為停用 safe_mode
,這個作法本身並不會產生安全性弱點,此無意義的作法可能會與其他的弱點一併被攻擊者利用,產生更大的危險。session.use_trans_sid
,會使 PHP 透過 URL 傳送階段作業識別碼,這會使攻擊者更容易劫持目前的階段作業,或是欺騙使用者使用已受攻擊者控制的現有階段作業。 open_basedir
存在一個設計缺陷,使其容易發生檔案存取 race condition,這可能使攻擊者繞過 file system 上的 access control 檢查。open_basedir
配置選項,該選項會試圖阻止 PHP 程式對 php.ini 中所指定的目錄結構以外的檔案執行操作。雖然 open_basedir
選項可保證系統的安全性,但其執行方式卻受到 race condition 的不利影響,這可能會讓攻擊者在某些情況下略過該選項所定義的限制[2]。PHP 執行存取權限檢查和開啟檔案間,會存在 time-of-check、time-of-use (TOCTOU) race condition。與其他語言中 file system 的 race condition 相同,此弱點會讓攻擊者將指向透過 access control 檢查的 symlink 替換成另一個原來不能通過測試的檔案,以取得受保護檔案的存取權。form-bean
項目使用相同名稱。相同的 form-bean
名稱通常表示沒有被除錯的程式碼或拼字錯誤。form-bean
名稱並沒有意義,因為相同的名稱在多個 <form-bean>
標籤中使用,只會註冊最後一項項目。form-bean
項目。
<form-beans>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="name" type="java.lang.String" />
<form-property name="password" type="java.lang.String" />
</form-bean>
<form-bean name="loginForm" type="org.apache.struts.validator.DynaActionForm">
<form-property name="favoriteColor" type="java.lang.String" />
</form-bean>
</form-beans>
path
屬性來尋找處理要求所需的資源。因為路徑為相對模式的位置,如果路徑不是以「/」字元開頭則視為錯誤。範例 2:以下組態使用不是以「/」字元開頭的路徑。
<global-exceptions>
<exception key="global.error.invalidLogin" path="" scope="request" type="InvalidLoginException" />
</global-exceptions>
<global-forwards>
<forward name="login" path="Login.jsp" />
</global-forwards>
input
屬性視為錯誤。input
屬性。發生驗證錯誤時,input
屬性會指定顯示錯誤訊息的頁面。input
屬性。
<action-mappings>
<action path="/Login"
type="com.LoginAction"
name="LoginForm"
scope="request"
validate="true" />
</action-mappings>
type
屬性的 <exception>
。<exception>
標籤要求定義例外類型。缺少或空白的 type
屬性表示有多餘的異常處理器或是意外的省略。如果開發人員想要處理異常,但忘記定義異常類型,應用程式就可能洩露系統的敏感資訊。<exception>
標籤的類型。
<global-exceptions>
<exception
key="error.key"
handler="com.mybank.ExceptionHandler"/>
</global-exceptions>