我有这样在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