ASP.NET Tips: Careful Use of Static's
Not sure how many people realize it, but when you start dealing with multiple users access a system (in this case a web server), you have to be very careful what you store in static's (global variables). This is because all the users will have access to this data and so if you create a page, you could allow them to see data that they shouldn't.
The main place this comes into play is with SQL data. We recommend that you cache data from the database so you don't have to query for it on each request. But if that data is sensitive, then you need to make sure you do not store it in cache or some other global.
Comments
Anonymous
September 18, 2008
Static methods should be OK, right?Anonymous
September 18, 2008
Another thing to keep in mind is how often static constructors fire on web applications. I was bitten by that a few days ago. http://hectorcorrea.com/blog/Static-constructors-and-ASP.NET-applications.aspxAnonymous
September 18, 2008
Not really sure what you're trying to say. Declaring something as static does not turn it into a global variable and nobody would ever refer to a global variable as a static becuase they're obviously not. I'm also not sure why you've put the apostrophe in "statics"? The static's what?Anonymous
September 18, 2008
Absolutely rite Torn.....we faced that kinna prblm in past because of static global variables in a multiple server environment.Anonymous
September 18, 2008
Nick, the ' was just cause of spellcheck. And I didn't catch it to change it back. It depends on what you mean by global, but if you mean that other can access that bit of memory, that it is global. If you mean any part of the application can access it, then you are right, it is not.Anonymous
September 18, 2008
Yes this is a good point talk about, last month someone raised a post regarding this in ASP.NET Forums http://forums.asp.net/t/1302762.aspx thanks for sharingAnonymous
September 18, 2008
The scope of a static variable is limited to an Application Domain.Anonymous
September 18, 2008
So what would the solution be to persist data for only the current user? Store it in the session?Anonymous
September 18, 2008
If my data layer has static functions such as update and two requests come in at the same time could this potentially cause problems?Anonymous
September 19, 2008
bobh, Yes, if the data is private to each user, session is a good place to store it.Anonymous
September 19, 2008
rtpHarry, No that shouldn't cause any problems. The application is meant to handle multiple threads all calling a static function at the same time. No problem with that.Anonymous
September 19, 2008
Just to underscore some things (Tom already answered a few):
- User-specific values should really be stored in Session. You could use client-side cookies if there is not any security sensitive info in there (e.g. username, password, etc.). Also, client-side cookies are limited to 4K in length. ASP.NET Personalization and WebParts is an option for WebPart kind of things. If the values are meant only to be held for the life of the ASP.NET page, you could also use Viewstate (again don't place security-sensitive info here since ViewState is only Base64 Encoded and not encrypted). <b>As a security note, you should not store password in Session or in Cookies in case the Session or Cookie is hijacked (which is trivial to do).</b>
- Application-wide or "shared" values should really be stored in the Cache. These values can be seen and accessed by anyone in the AppDomain, so be careful not to put sensitive or user-specific values in there. Another option is to use Application variables. However, it is recommended to use the Cache.
- Initialization of Static variables in Thread-safe in all versions of .NET. This is why the Singleton Pattern uses static variables for its implementation.
- The use of Static Constructors should be carefully considered. You should use Static Initializers (or inline initialization of a static variable - i.e. inline where it is declared) when possible. The CLR is able to optimize the performance of types that have not explicitly defined a static constructor. One case of this is with the use of NGEN. The biggest difference of use of a static constructor vs. inline static variable initialization is the <b>timing</b> of when each happens. The majority of the time you shouldn't, and don't, care about when your static variables are initialized. However, if it is of importance, the CLR will initialiaize inline static vars. whenever it wants to. On the other hand, the firing ofa static constructor is guaranteed to happen right <b>before the first static member is accessed.</b> Note that all static members who are not explicitly initialized inline are initialized once the static constructor fires. Obviously if you needed to do additional things with a static variable after it has been initialized, you would need to use a static constructor instead of inline initialization. HTH
- Anonymous
March 02, 2009
Here is a sample webpage that shows the dangers of using static variables in an ASP.Net website without understanding its consequences: http://www.aggregatedintelligence.com/Samples/StaticsDemo/default.aspx And my explanation: http://blog.aggregatedintelligence.com/2009/01/static-variables-and-their-implications.html