我有這樣在ASP.net中使用靜態方法進行安全驗證是不明智的?
public static string DoSomethingToString(string UntrustedString)
{
//parse format and change string here.
return newString.
}
一個靜態方法,因爲我知道,多次調用:
static int myInt=0;
public static int AddNumber()
{
lock(someObject)
{
myInt++;
return myInt;
}
}
會返回一個數量不斷增加(即頁面之間共享),我不知道在DoSomethingToString()中如何處理變量的局部變量;
我想了解一個靜態方法可以安全/不安全地在ASP.net中使用的條件,只是爲了讓我的多線程大腦停留在這個主題上。
UPDATE:
大部分的討論一直圍繞價值類型。我如何知道何時可以安全地調用改變我的引用類型的方法(顯式或隱式)?查看MSDN文檔是否足夠,並且只使用表示「threadSafe」的方法?
一個例子,如果我所謂的隱式改變是使用String.Split(),因爲它是同一類的一部分。我認爲可能會分擔一些安全特徵,並且不需要擔心/盡職調查。 (?)
我打電話給一個明確的變化(因爲缺乏一個更好的詞)現在調用另一個方法來做工作......可以是靜態的或實例類。我認爲需要做更多的背景/研究工作來確保每個對象和方法都是ThreadSafe。
爲了討論起見假設我有這個簽名的方法:
ValidateStringAndContext(string untrustedString, Object myCustomUserContext)
,它有它引用了以下對象
public SecurityChecker
{
public static object CheckSecurityStatic(string DirtyData)
{
//do string.split
//maybe call a database, see if it's a token replay
//
//OR - alternate implementation
SecurityChecker sc = new SecurityChecker();
if (sc.CheckSecurity(DirtyData))
{
myCustomUserContext.Property1 = new GUID()
}
return myCustomUserContext;
}
public class bool CheckSecurity(string DirtyData)
{
//do string.split
//maybe call a database, see if it's a token replay
// return true if OK return false if not
}
}
經修訂的課題
一個靜態方法如果我創建的靜態「實用程序」類是否會遇到併發問題(變量相互覆蓋) e創建另一個對象的實例,然後調用方法--versus--直接簡單地調用靜態方法?
我不確定你的意思是「我不確定變量將如何處理」。你能澄清嗎? – Manfred 2010-08-06 02:32:42
這裏我使用「newstring」作爲一個非常有限的局部變量。假設該方法非常強大,需要5秒才能完成。如果有另一個請求進入,而我的方法正在運行,會不會發生數據碰撞/覆蓋?爲了更進一步,我的方法可能會創建一些對象的新實例(非靜態)並讓它們執行某些操作。如果碰撞沒有發生在我的方法中,它會發生在子對象中嗎? – LamonteCristo 2010-08-06 02:40:51
@ MakerOfThings7:我只是注意到你的評論在這裏,只要newString和其他對象在靜態方法中聲明,你沒事。舉例來說,如果你不得不向其他班級發出這些對象,而且他們是在別處創建的,那肯定會有問題。 – umbyersw 2010-08-06 06:09:40