輸入驗證和表示法問題是由中繼字元、替代編碼和數值表示法引起的。信任輸入會導致安全問題。問題包括:「Buffer Overflows」、「Cross-Site Scripting」攻擊、「SQL Injection」及其他許多問題。
<div id="myDiv">
Employee ID: <input type="text" id="eid"><br>
...
<button>Show results</button>
</div>
<div id="resultsDiv">
...
</div>
$(document).ready(function(){
$("#myDiv").on("click", "button", function(){
var eid = $("#eid").val();
$("resultsDiv").append(eid);
...
});
});
eid
) 只包含標準英數字元,這些程式碼便會正確地運作。如果 eid
中有包含中繼或來源程式碼中的值,那麼在使用者按一下按鈕後,程式碼就會被新增至 DOM 供瀏覽器執行。如果攻擊者可以說動使用者將惡意內容輸入文字輸入中,那麼這就只是 DOM 型 XSS。document.domain
)。document.domain
,並在頁面上執行指令碼,就像它們位於完全相同的網域中一樣。domain
,並將其作為頁面相同來源策略 (SOP) 的網域進行傳送。
<SCRIPT>
var pos = document.URL.indexOf("domain=")+7;
document.domain = document.URL.substring(pos,document.URL.length);
</SCRIPT>
document.domain
,因此,如果頁面位於「http://www.example.com」,則 document.domain
可設定為「www.example.com」或「example.com」,而不能設定為「com」或「example.org」。
...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...
Example 1
中,攻擊者可能透過提供 includedURL
的惡意值來完全控制動態包含陳述式,這會導致程式包含來自外部站台的檔案。web.config
,檔案可能會成為 HTML 輸出的一部分。更糟糕的是,如果攻擊者可能指定由攻擊者控制的遠端站台的路徑,則動態包含陳述式將執行攻擊者提供的任意惡意程式碼。
...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...
specialpage.jsp?template=/WEB-INF/database/passwordDB
/WEB-INF/database/passwordDB
檔案的內容,從而危害系統的安全性。c:import
標籤,將使用者指定的遠端檔案匯入目前的 JSP 頁面中。
...
<c:import url="<%= request.getParameter("privacy")%>">
...
policy.jsp?privacy=http://www.malicioushost.com/attackdata.js
register_globals
選項,這會讓攻擊者輕易地覆寫內部伺服器的變數。雖然停用 register_globals
可減少程式因為 File Inclusion 弱點受到攻擊的可能,但是這些問題仍存在現在的 PHP 應用程式中。 $server_root
的應用程式中。
...
<?php include($server_root . '/myapp_header.php'); ?$gt;
...
register_globals
設定為 on
,則攻擊者可能透過提供 $server_root
作為要求參數來覆寫 $server_root
值,從而部分控制動態包含陳述式。
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
中,攻擊者可能透過提供 headername
的惡意值來完全控制動態包含陳述式,這會導致程式包含來自外部站台的檔案。/etc/shadow
,檔案可能會成為 HTML 輸出的一部分。更糟糕的是,如果攻擊者可能指定由攻擊者控制的遠端站台的路徑,則動態包含陳述式將執行攻擊者提供的任意惡意程式碼。
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
HttpRequest.Files
、HttpRequest.Form
、HttpRequest.Cookies
、HttpRequest.QueryString
、HttpRequest.Headers
、HttpRequest.ServerVariables
) 大小限制為 1000,可使用組態設定檔案中的 aspnet:MaxHttpCollectionKeys
設定來增加或減少該大小。但是,將大小增加到更高的值會增加遭受 DoS 攻擊的可能性。aspnet:MaxHttpCollectionKeys
設定為 2147483647
。
...
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="2147483647" />
</appSettings>
...
unsigned int usrSleepTime = uatoi(usrInput);
sleep(usrSleepTime);
Sleep(url.duration);
Future
函數的執行時間。若指定較大的數字,攻擊者可能會無限期地佔用 Future
函數。
final duration = Platform.environment['DURATION'];
Future.delayed(Duration(seconds: int.parse(duration!)), () => ...);
範例 2:以下程式碼會從 zip 檔案讀取字串。因為它使用
int usrSleepTime = Integer.parseInt(usrInput);
Thread.sleep(usrSleepTime);
readLine()
方法,它會讀取大量的輸入。攻擊者可能利用此程式碼產生 OutOfMemoryException
或消耗大量記憶體,讓程式花費更多時間來執行記憶體回收或者在一些後續作業中耗盡記憶體。
InputStream zipInput = zipFile.getInputStream(zipEntry);
Reader zipReader = new InputStreamReader(zipInput);
BufferedReader br = new BufferedReader(zipReader);
String line = br.readLine();
範例 2:以下程式碼會寫入檔案。以下程式碼會寫入檔案。由於檔案可能會不斷地寫入和重新寫入,直到使用者代理程式將其關閉為止,因此可能需要分析檔案內容的磁碟配額、IO 頻寬以及處理序會受到影響。
var fsync = requestFileSystemSync(0, userInput);
function oninit(fs) {
fs.root.getFile('applog.txt', {create: false}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var bb = new BlobBuilder();
bb.append('Appending to a file');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, oninit, errorHandler);
procedure go_sleep (
usrSleepTime in NUMBER)
is
dbms_lock.sleep(usrSleepTime);
範例 2:以下程式碼會從檔案中讀取字串。因為它使用
Kernel.sleep(user_input)
readline()
方法,且無需指定限制,所以它會讀取大量的輸入。攻擊者可能利用此程式碼使程序暫停,同時耗用越來越多的記憶體,直到可能完全耗盡記憶體。
fd = File.new(myFile)
line = fd.readline
Formatter.format()
的 Format String 引數。
...
Formatter formatter = new Formatter(Locale.US);
String format = "The customer: %s %s has the balance %4$." + userInput + "f";
formatter.format(format, firstName, lastName, accountNo, balance);
...
java.util.MissingFormatArgumentException
,由於這不在 try 區塊中,所以可能導致應用程式失敗。 accountNo
包含到產生的字串中。java.lang.Double.parseDouble()
和相關方法的實作有一個弱點,可能會在解析 [2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]
範圍中的任何數字時造成執行緒暫停。這個瑕疵可以用來執行阻斷服務 (DoS) 攻擊。
Double d = Double.parseDouble(request.getParameter("d"));
d
是範圍中的數值時 (例如 "0.0222507385850720119e-00306"
) 傳送要求,以造成程式在處理要求時暫停。