封裝是要劃定清楚的界限。在網頁瀏覽器中,這可能意味著確保您的行動程式碼不會被其他行動程式碼濫用。在伺服器上,這可能意味著區分經過驗證的資料與未經驗證的資料、區分一個使用者的資料與另一個使用者的資料,或區分允許使用者查看的資料與不允許查看的資料。
script
標籤。
<script src="http://www.example.com/js/fancyWidget.js"></script>
www.example.com
以外的網站上,則該網站依賴 www.example.com
提供正確且無惡意的程式碼。如果攻擊者能危害 www.example.com
,他們就能修改 fancyWidget.js
的內容來破壞網站的安全性。例如,他們可以新增程式碼至 fancyWidget.js
來竊取使用者的機密資料。
HtmlInputHidden hidden = new HtmlInputHidden();
Hidden hidden = new Hidden(element);
hidden
類型的 <input>
標籤表示使用隱藏欄位。
<input type="hidden">
...
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
...
'mydb'
的人都可以加以存取。script-src
、img-src
、object-src
、style_src
、font-src
、media-src
、frame-src
、connect-src
。*
來指示所有或部分來源。所有指令都不是強制性的。瀏覽器將允許未列示指令的所有來源,或從選用的 default-src
指令衍生值。此外,此表頭的規格隨著時間的推移而不斷演變。在第 23 版之前的 Firefox 和第 10 版之前的 IE 中,其實做為 X-Content-Security-Policy
,而在第 25 版之前的 Chrome 中,其實做為 X-Webkit-CSP
。兩個名稱都已棄用,取代為現在的標準名稱 Content Security Policy
。鑒於指令的數目、兩個棄用的替代名稱,以及對待多次出現之同一表頭和單一表頭中重複指令的方式,開發人員很可能會錯誤地配置此表頭。unsafe-inline
或 unsafe-eval
的指令違背了 CSP 的目的。script-src
指令,但未配置任何 Script nonce
。frame-src
,但未配置任何 sandbox
。django-csp
配置使用不安全的指令 unsafe-inline
和 unsafe-eval
,以便允許內嵌 Script 和程式碼評估:
...
MIDDLEWARE = (
...
'csp.middleware.CSPMiddleware',
...
)
...
CSP_DEFAULT_SRC = ("'self'", "'unsafe-inline'", "'unsafe-eval'", 'cdn.example.net')
...
X-Frame-Options
標頭,以指示瀏覽器是否應對應用程式進行框架處理。停用或未設定此標頭會導致跨框架相關弱點。X-Frame-Options
標頭:
<http auto-config="true">
...
<headers>
...
<frame-options disabled="true"/>
</headers>
</http>
script-src
、img-src
、object-src
、style_src
、font-src
、media-src
、frame-src
、connect-src
。這 8 個指令都將一個來源清單做為值,指定網站可存取的網域,以使用該指令所涵蓋的功能。開發人員可使用萬用字元 *
來指示所有或部分來源。其他來源清單關鍵字 (例如 'unsafe-inline'
和 'unsafe-eval'
) 提供更精細的方式來控制 script 執行,但這些是潛在有害的關鍵字。所有指令都不是強制性的。瀏覽器允許未列示指令的所有來源,或從選用的 default-src
指令衍生值。此外,此標頭的規格隨著時間的推移而不斷演變。在第 23 版之前的 Firefox 和第 10 版之前的 IE 中,其實作為 X-Content-Security-Policy
,而在第 25 版之前的 Chrome 中,則實作為 X-Webkit-CSP
。兩個名稱都已棄用,取代為現在的標準名稱 Content Security Policy
。鑒於指令的數目、兩個棄用的替代名稱,以及對待多次出現之同一標頭和單一標頭中重複指令的方式,開發人員很可能會錯誤地設定此標頭。default-src
指令:
<http auto-config="true">
...
<headers>
...
<content-security-policy policy-directives="default-src '*'" />
</headers>
</http>
script-src
、img-src
、object-src
、style_src
、font-src
、media-src
、frame-src
、connect-src
。這 8 個指令都將一個來源清單做為值,指定網站可存取的網域,以使用該指令所涵蓋的功能。開發人員可使用萬用字元 *
來指示所有或部分來源。其他來源清單關鍵字 (例如 'unsafe-inline'
和 'unsafe-eval'
) 提供更精細的方式來控制 script 執行,但這些是潛在有害的關鍵字。所有指令都不是強制性的。瀏覽器允許未列示指令的所有來源,或從選用的 default-src
指令衍生值。此外,此標頭的規格隨著時間的推移而不斷演變。在第 23 版之前的 Firefox 和第 10 版之前的 IE 中,其實作為 X-Content-Security-Policy
,而在第 25 版之前的 Chrome 中,則實作為 X-Webkit-CSP
。兩個名稱都已棄用,取代為現在的標準名稱 Content Security Policy
。鑒於指令的數目、兩個棄用的替代名稱,以及對待多次出現之同一標頭和單一標頭中重複指令的方式,開發人員很可能會錯誤地設定此標頭。*
) 來配置 *-src
指令。django-csp
設定會設定過度許可且不安全的 default-src
指令:
...
MIDDLEWARE = (
...
'csp.middleware.CSPMiddleware',
...
)
...
CSP_DEFAULT_SRC = ("'self'", '*')
...
Access-Control-Allow-Origin
的新 HTTP 標頭時,存取不同網域間的資料。Web 伺服器可使用此標頭,定義允許使用跨來源要求存取其網域的其他網域。但是,定義標頭時請謹慎小心,因為過度許可的 CORS 原則會允許惡意應用程式以不當方式與受害應用程式通訊,進行導致詐騙、資料竊取、轉送和其他攻擊。
Response.AppendHeader("Access-Control-Allow-Origin", "*");
*
做為 Access-Control-Allow-Origin
表頭的值,表示應用程式的資料可以讓在任何網域上執行的 JavaScript 存取。Access-Control-Allow-Origin
的新 HTTP 標頭時,存取不同網域間的資料。Web 伺服器可使用此標頭,定義允許使用跨來源要求存取其網域的其他網域。但是,定義標頭時請謹慎小心,因為過度許可的 CORS 原則會允許惡意應用程式以不當方式與受害應用程式通訊,進行導致詐騙、資料竊取、轉送和其他攻擊。
<websocket:handlers allowed-origins="*">
<websocket:mapping path="/myHandler" handler="myHandler" />
</websocket:handlers>
*
做為 Access-Control-Allow-Origin
表頭的值,表示應用程式的資料可以讓在任何網域上執行的 JavaScript 存取。Access-Control-Allow-Origin
的新 HTTP 標頭時,存取不同網域間的資料。Web 伺服器可使用此標頭,定義允許使用跨來源要求存取其網域的其他網域。但是,定義標頭時請謹慎小心,因為過度許可的 CORS 原則會允許惡意應用程式以不當方式與受害應用程式通訊,進行導致詐騙、資料竊取、轉送和其他攻擊。
<?php
header('Access-Control-Allow-Origin: *');
?>
*
做為 Access-Control-Allow-Origin
表頭的值,表示應用程式的資料可以讓在任何網域上執行的 JavaScript 存取。Access-Control-Allow-Origin
的新 HTTP 標頭時,存取不同網域間的資料。Web 伺服器可使用此標頭,定義允許使用跨來源要求存取其網域的其他網域。但是,定義標頭時請謹慎小心,因為過度許可的 CORS 原則會允許惡意應用程式以不當方式與受害應用程式通訊,進行導致詐騙、資料竊取、轉送和其他攻擊。
response.addHeader("Access-Control-Allow-Origin", "*")
*
作為 Access-Control-Allow-Origin
表頭的值,表示應用程式的資料可供在任何網域上執行的 JavaScript 存取。Access-Control-Allow-Origin
的新 HTTP 標頭時,存取不同網域間的資料。Web 伺服器可使用此標頭,定義允許使用跨來源要求存取其網域的其他網域。但是,定義標頭時請謹慎小心,因為過度許可的 CORS 原則會允許惡意應用程式以不當方式與受害應用程式通訊,進行導致詐騙、資料竊取、轉送和其他攻擊。
play.filters.cors {
pathPrefixes = ["/some/path", ...]
allowedOrigins = ["*"]
allowedHttpMethods = ["GET", "POST"]
allowedHttpHeaders = ["Accept"]
preflightMaxAge = 3 days
}
*
作為 Access-Control-Allow-Origin
標頭的值,表示應用程式的資料可供在任何網域上執行的 JavaScript 存取。Access-Control-Allow-Origin
的新 HTTP 標頭時,存取不同網域間的資料。Web 伺服器可使用此標頭,定義允許使用跨來源要求存取其網域的其他網域。但是,定義標頭時請謹慎小心,因為過度許可的 CORS 原則會允許惡意應用程式以不當方式與受害應用程式通訊,進行導致詐騙、資料竊取、轉送和其他攻擊。
Response.AddHeader "Access-Control-Allow-Origin", "*"
*
做為 Access-Control-Allow-Origin
表頭的值,表示應用程式的資料可以讓在任何網域上執行的 JavaScript 存取。
WebMessage message = new WebMessage(WEBVIEW_MESSAGE);
webview.postWebMessage(message, Uri.parse("*"));
*
作為目標來源值,代表指令碼會傳送訊息至視窗而不論其來源。
o.contentWindow.postMessage(message, '*');
*
做為目標來源值,代表 Script 會傳送訊息至視窗而不論其來源。Unsafe-URL
可能導致應用程式將敏感網站與使用者資料 (包括階段作業權杖、使用者名稱和密碼) 洩漏給第三方網站。Referrer-Policy
標頭可控制與參照標頭相關的瀏覽器行為。Unsafe-URL
選項會移除所有限制,並傳送包含每個要求的參照標頭。
<http auto-config="true">
...
<headers>
...
<referrer-policy policy="unsafe-url"/>
</headers>
</http>
Content-Security-Policy-Report-Only
標頭為 Web 應用程式作者和管理員提供了監視安全性原則的功能,而不是強制執行原則。此標頭通常在實驗和/或開發網站的安全性原則時使用。當某原則被視為有效時,您可透過改用 Content-Security-Policy
標頭欄位來強制執行此原則。Report-Only
模式中設定內容安全性原則:
<http auto-config="true">
...
<headers>
...
<content-security-policy report-only="true" policy-directives="default-src https://content.cdn.example.com" />
</headers>
</http>
Content-Security-Policy-Report-Only
標頭為 Web 應用程式作者和管理員提供了監視安全性原則的功能,而不是強制執行原則。此標頭通常在實驗和/或開發網站的安全性原則時使用。當某原則視為有效時,您可以透過改用 Content-Security-Policy
標頭來強制執行此原則。Report-Only
模式:
response.content_security_policy_report_only = "*"
SLComposeServiceViewController isContentValid
以在使用收到的不可信賴的資料前對其進行驗證。
#import <MobileCoreServices/MobileCoreServices.h>
@interface ShareViewController : SLComposeServiceViewController
...
@end
@interface ShareViewController ()
...
@end
@implementation ShareViewController
- (void)didSelectPost {
NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
NSItemProvider *itemProvider = item.attachments.firstObject;
...
// Use the received items
...
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
...
@end
SLComposeServiceViewController isContentValid
以在使用收到的不可信賴的資料前對其進行驗證。SLComposeServiceViewController isContentValid
回呼方法來進行驗證:
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
...
override func didSelectPost() {
let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
let itemProvider = extensionItem.attachments?.first as! NSItemProvider
...
// Use the received items
...
self.extensionContext?.completeRequestReturningItems([], completionHandler:nil)
}
...
}
webview
使用 URL 與您的應用程式通訊時,接收應用程式應確認傳送者為期望通訊之應用程式允許清單的成員。接收應用程式可以選擇在驗證呼叫 URL 來源時是使用 UIApplicationDelegate application:openURL:options:
還是 UIApplicationDelegate application:openURL:sourceApplication:annotation:
委派方法。UIApplicationDelegate application:openURL:options:
委派方法的以下實作無法確認 IPC 呼叫的傳送者,而是僅處理呼叫 URL:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
NSString *theQuery = [[url query] stringByRemovingPercentEncoding:NSUTF8StringEncoding];
NSArray *chunks = [theQuery componentsSeparatedByString:@"&"];
for (NSString* chunk in chunks) {
NSArray *keyval = [chunk componentsSeparatedByString:@"="]; NSString *key = [keyval objectAtIndex:0];
NSString *value = [keyval objectAtIndex:1];
// Do something with your key and value
}
return YES;
}
wewbview
使用 URL 與您的應用程式通訊時,接收應用程式應確認傳送者為期望通訊之應用程式允許清單的成員。接收應用程式可以選擇在驗證呼叫 URL 來源時是使用 UIApplicationDelegate application:openURL:options:
還是 UIApplicationDelegate application:openURL:sourceApplication:annotation:
委派方法。UIApplicationDelegate application:openURL:options:
委派方法的以下實作無法確認 IPC 呼叫的傳送者,而是僅處理呼叫 URL:
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
return processCall(url)
}
webview
使用某個 URL 與您的應用程式通訊時,接收應用程式應先驗證呼叫 URL,然後再執行進一步的動作。接收應用程式可以選擇是使用 UIApplicationDelegate application:didFinishLaunchingWithOptions:
還是 UIApplicationDelegate application:willFinishLaunchingWithOptions:
委派方法來開啟呼叫 URL。UIApplicationDelegate application:didFinishLaunchingWithOptions:
委派方法的以下實作無法驗證呼叫 URL 並且總是處理不可信賴的 URL:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS Dictionary *)launchOptions {
return YES;
}
webview
使用某個 URL 與您的應用程式通訊時,接收應用程式應先驗證呼叫 URL,然後再執行進一步的動作。接收應用程式可以選擇是使用 UIApplicationDelegate application:didFinishLaunchingWithOptions:
還是 UIApplicationDelegate application:willFinishLaunchingWithOptions:
委派方法來開啟呼叫 URL。UIApplicationDelegate application:didFinishLaunchingWithOptions:
委派方法的以下實作無法驗證呼叫 URL 並且總是處理不可信賴的 URL:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
return true
}
allowBackup
屬性設定為 true
(預設值) 並定義 <application>
標籤上的 backupAgent
屬性。Environment.getExternalStorageDirectory()
會將參照傳回 Android 裝置的外部儲存裝置。private void WriteToFile(String what_to_write) {
try{
File root = Environment.getExternalStorageDirectory();
if(root.canWrite()) {
File dir = new File(root + "write_to_the_SDcard");
File datafile = new File(dir, number + ".extension");
FileWriter datawriter = new FileWriter(datafile);
BufferedWriter out = new BufferedWriter(datawriter);
out.write(what_to_write);
out.close();
}
}
}
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:ThisDeviceOnly
的可存取性層級仍會備份至 iCloud 和 iTunes。這可能會導致隱私問題,具體視所儲存資料的敏感和隱私程度而定。
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure KeyChain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
[dict setObject:(__bridge id)kSecAttrAccessibleWhenUnlocked forKey:(__bridge id) kSecAttrAccessible];
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:kSecAttrAccessibleAlways
:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:kSecAttrAccessibleAlwaysThisDeviceOnly
:kSecAttrAccessibleWhenUnlocked
:kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:ThisDeviceOnly
的可存取性層級仍會備份至 iCloud 和 iTunes。這可能會導致隱私問題,具體視所儲存資料的敏感和隱私程度而定。
...
// Configure KeyChain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
...
query[kSecAttrAccessible as String] = kSecAttrAccessibleWhenUnlocked
SecItemAdd(query as CFDictionary, nil)
...