<?xml-stylesheet type="text/xsl" href="/rss.xsl" media="screen"?><rss version="2.0"><channel><title>softlogger Latest Articles ::Web-Security</title><link>http://softlogger.com</link><description>softlogger Latest Articles ::Web-Security</description><ttl>180</ttl><item><title>Finding Data in Client Certificates</title><link>http://softlogger.com/18608/Web-Security/finding-data-in-client-certificates.aspx</link><description>&lt;p&gt;&lt;i&gt;
Can I pass additional user data, such as identity information, in a message secured with a client certificate?&lt;/i&gt;
&lt;/p&gt;&lt;p&gt;
This question looks like an earlier one about &lt;a href="http://blogs.msdn.com/drnick/archive/2008/01/16/flowing-additional-identity-information.aspx" mce_href="http://blogs.msdn.com/drnick/archive/2008/01/16/flowing-additional-identity-information.aspx"&gt;Windows credentials&lt;/a&gt; but has some subtle differences that make it come out with a different answer.  The two key differences are:
&lt;/p&gt;&lt;p&gt;
We're talking about securing messages rather than transport connections.  Message security headers provide a means of tunneling additional information about the caller.
&lt;/p&gt;&lt;p&gt;
We're talking about passing identity information together with a certificate rather than with Windows credentials.  Independent of the particular security protocol, the certificate infrastructure is a way to sign and encrypt data streams so that additional client information can be safely included.
&lt;/p&gt;&lt;p&gt;
With either approach, client information can be included as supporting tokens on the message (typically as either incoming supporting tokens with the message or with the transport token).  The &lt;a href="http://msdn2.microsoft.com/en-us/library/ms751480.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms751480.aspx"&gt;supporting tokens sample&lt;/a&gt; gives a rundown of supporting tokens for message security.
&lt;/p&gt;&lt;p&gt;
Next time: Differences in Guid Serialization
&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7302963" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=18608"&gt;</description><author>Nicholas Allens Indigo Blog</author><pubDate>2008-01-29T00:00:00</pubDate><category>Web Security</category></item><item><title>Custom Password Validation for HTTP</title><link>http://softlogger.com/18192/Web-Security/custom-password-validation-for-http.aspx</link><description>Phil Henning has written about &lt;a href="http://blogs.msdn.com/phenning/archive/2008/01/11/custom-usernamepassword-validators-in-net-framework-3-5.aspx" mce_href="http://blogs.msdn.com/phenning/archive/2008/01/11/custom-usernamepassword-validators-in-net-framework-3-5.aspx"&gt;creating a custom username/password validator for HTTP&lt;/a&gt;, which is another new feature in Orcas.  Like &lt;a href="http://blogs.msdn.com/drnick/archive/2007/09/10/more-about-client-ip-addresses.aspx" mce_href="http://blogs.msdn.com/drnick/archive/2007/09/10/more-about-client-ip-addresses.aspx"&gt;getting access to client IP addresses&lt;/a&gt;, creating a custom password validator is a feature added as a result of direct customer feedback.  In fact, the two features were added during the same week and were among the last features we did in Orcas for messaging.  Before Orcas you could only create a custom password validator if you were using message security.
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7105894" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=18192"&gt;</description><author>Nicholas Allens Indigo Blog</author><pubDate>2008-01-14T00:00:00</pubDate><category>Web Security</category></item><item><title>Accessing the Query String</title><link>http://softlogger.com/16197/Web-Security/accessing-the-query-string.aspx</link><description>&lt;p&gt;&lt;i&gt;
How do I get access to the query string of an HTTP request when processing a message?&lt;/i&gt;
&lt;/p&gt;&lt;p&gt;
The query string isn't one of the properties available on the new WebOperationContext but you can still get access to it through the HTTP request message property.
&lt;/p&gt;&lt;pre class="csharpcode"&gt;MessageProperties properties = OperationContext.Current.IncomingMessageProperties;&lt;br&gt;HttpRequestMessageProperty requestProperty = (HttpRequestMessageProperty)properties[HttpRequestMessageProperty.Name];&lt;br&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; queryString = requestProperty.QueryString;&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;
Next time: Taking Action on Client Close
&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6975688" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=16197"&gt;</description><author>Nicholas Allens Indigo Blog</author><pubDate>2008-01-04T00:00:00</pubDate><category>Web Security</category></item><item><title>Hack Google (Maps) URLs for Quick Searching [URL Hacking]</title><link>http://softlogger.com/14857/Web-Security/hack-google-maps-urls-for-quick-searching-url-hacking.aspx</link><description>&lt;p&gt;&lt;img alt="URLHacking.png" src="http://lifehacker.com/assets/resources/2007/12/URLHacking.png" width="463" height="42" class="postimg" align="center"/&gt;Frequently using Google Maps for directions? Reader Pham writes in with a simple but interesting way to save time when looking up directions.&lt;blockquote&gt;Basically, the multi-step process of going to Google [Maps], typing in an address, clicking submit, etc., can be avoided by just putting all your info directly into the URL. For example typing this works:&lt;br /&gt;
http://maps.google.com/maps?q=1683 Mass Ave, Cambridge, MA&lt;/blockquote&gt;This simple observation can be coupled with &lt;a href="http://lifehacker.com/software/texter/lifehacker-code-texter-windows-238306.php"&gt;Texter&lt;/a&gt; to speed up your searching.  This kind of URL hacking isn't specific to Google Maps. You can also roll your own AutoHotkey applications to search Google, Google Maps, or any other site that allows robust URL searching.  Hit the jump for the AHK code syntax.&lt;/p&gt;&lt;p&gt;To search Google Maps using an AutoHotkey application (start the application with ALT + 1), use the following code:&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;!1::&lt;br /&gt;
InputBox, OutputVar , Enter your location:,&lt;br /&gt;
if ErrorLevel&lt;br /&gt;
    MsgBox, CANCEL was pressed.&lt;br /&gt;
else&lt;br /&gt;
	Run http://maps.google.com/maps?q=%OutputVar%&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;
To search standard Google  (start the application with ALT + 2),  use the following code:&lt;br /&gt;
&lt;blockquote&gt;&lt;code&gt;!2::&lt;br /&gt;
InputBox, OutputVar , Enter your search criteria:,&lt;br /&gt;
if ErrorLevel&lt;br /&gt;
    MsgBox, CANCEL was pressed.&lt;br /&gt;
else&lt;br /&gt;
	Run http://www.google.com/search?q=%OutputVar%&lt;/code&gt;&lt;/blockquote&gt;&lt;div class="related"&gt;&lt;a href="http://blog.seven29.com/post/22037266"&gt;"Command-Line" Hacking Google Maps&lt;/a&gt; [Broken Home for Lost Passwords]&lt;/div&gt;&lt;/p&gt;&lt;br style="clear: both;"/&gt;
  &lt;img alt=" " style="border: 0; height:1px; width:1px;" border="0" src="http://www.pheedo.com/img.phdo?i=de0804befb7931c0e35dd482be5d1592" height="1" width="1"/&gt;
&lt;img src="http://www.pheedo.com/feeds/tracker.php?i=de0804befb7931c0e35dd482be5d1592" style="display: none;" border="0" height="1" width="1" alt=" "/&gt;
&lt;p&gt;&lt;a href="http://feeds.gawker.com/~a/lifehacker/full?a=UJHqfx"&gt;&lt;img src="http://feeds.gawker.com/~a/lifehacker/full?i=UJHqfx" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.gawker.com/~f/lifehacker/full?a=rME7VjC"&gt;&lt;img src="http://feeds.gawker.com/~f/lifehacker/full?i=rME7VjC" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.gawker.com/~r/lifehacker/full/~4/204639511" height="1" width="1"/&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=14857"&gt;</description><author>Lifehacker</author><pubDate>2007-12-22T00:00:00</pubDate><category>Web Security</category></item><item><title>iPhone serial access tutorial</title><link>http://softlogger.com/13727/Web-Security/iphone-serial-access-tutorial.aspx</link><description>&lt;p&gt;Filed under: &lt;a href="http://www.hackaday.com/category/cellphones-hacks/" rel="tag"&gt;cellphones hacks&lt;/a&gt;&lt;/p&gt;&lt;img width="400" vspace="4" hspace="4" height="325" border="0" alt=" " src="http://www.blogsmithmedia.com/www.hackaday.com/media/2007/12/iphone-serial.jpg" /&gt;&lt;br /&gt;[TheRain] sent in &lt;a href="http://devdot.wikispaces.com/Iphone+Serial+Port+Tutorial"&gt;his tutorial&lt;/a&gt; on using the iPhone's serial port. Apparently there's a hardware trick required to enable two way communication. Whatever device is attached to the iPhone needs a secret handshake to get things talking both ways. Once the serial ground has been strobed high to low in the proper order, things will work like normal.&lt;h6 style="clear: both; padding: 8px 0 0 0; height: 2px; font-size: 1px; border: 0; margin: 0; padding: 0;"&gt;&lt;/h6&gt;&lt;a href=http://devdot.wikispaces.com/Iphone+Serial+Port+Tutorial&gt;Read&lt;/a&gt; | &lt;a href="http://www.hackaday.com/2007/12/11/iphone-serial-access-tutorial/" rel="bookmark" title="Permanent link to this entry"&gt;Permalink&lt;/a&gt; | &lt;a href="http://www.hackaday.com/forward/1060735/" title="Send this entry to a friend via email"&gt;Email this&lt;/a&gt; | &lt;a href="http://www.technorati.com/cosmos/search.html?rank=&amp;fc=1&amp;url=http://www.hackaday.com/2007/12/11/iphone-serial-access-tutorial/" title="Linking Blogs"&gt;Linking Blogs&lt;/a&gt; | &lt;a href="http://www.hackaday.com/2007/12/11/iphone-serial-access-tutorial/#comments" title="View reader comments on this entry"&gt;Comments&lt;/a&gt;&lt;br /&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=13727"&gt;</description><author>Hack a Day</author><pubDate>2007-12-11T00:00:00</pubDate><category>Web Security</category></item><item><title>Silent Security Failures</title><link>http://softlogger.com/13329/Web-Security/silent-security-failures.aspx</link><description>&lt;p&gt;&lt;i&gt;
I'm using reliable messaging and getting an exception that the reliable session has faulted.  It's the first exception that I see so I don't know why the session faulted.  How do I know what went wrong?  Here's the full error message:
&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;
The underlying secure session has faulted before the reliable session fully completed. The reliable session was faulted.&lt;/i&gt;
&lt;/p&gt;&lt;p&gt;
The reliable messaging channel threw an exception because the reliable session was broken.  The reliable session was broken because the security session was broken.  In this case, you know that the security session was broken without seeing any other exceptions being thrown.  That means the security channel must have faulted without encountering an exceptional event, which triggered all of the other visible results.
&lt;/p&gt;&lt;p&gt;
The easiest way to debug a situation like this is to start removing extraneous pieces.  Try removing the reliable messaging channel and see if that allows whatever went wrong with the security session to bubble up.  If things immediately fail at startup, then try removing both the reliable messaging and security channels.  There may be something basic about your configuration that's incorrect and removing protocol layers will help you find that faster.
&lt;/p&gt;&lt;p&gt;
Next time: Localhost Common Name
&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6677673" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=13329"&gt;</description><author>Nicholas Allens Indigo Blog</author><pubDate>2007-12-06T00:00:00</pubDate><category>Web Security</category></item><item><title>Security Software Moves to Consoles - Web Filtering for PS3</title><link>http://softlogger.com/13051/Web-Security/security-software-moves-to-consoles--web-filtering-for-ps3.aspx</link><description>Ah it seems some companies are having the same idea as me, consoles might well be the next infection vector for zombie style botnets, they have good processing power, the current generation has ample hard-drive space and they are network connected.
The difference with consoles is they tend to be turned off when not in use [...]&lt;br/&gt;
&lt;br/&gt;
Read the full post at darknet.org.uk
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/darknethackers?a=yURuvo"&gt;&lt;img src="http://feeds.feedburner.com/~a/darknethackers?i=yURuvo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/darknethackers?a=gT8VpcB"&gt;&lt;img src="http://feeds.feedburner.com/~f/darknethackers?i=gT8VpcB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/darknethackers?a=ZV4hZKB"&gt;&lt;img src="http://feeds.feedburner.com/~f/darknethackers?i=ZV4hZKB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/darknethackers?a=FhhH5Ob"&gt;&lt;img src="http://feeds.feedburner.com/~f/darknethackers?i=FhhH5Ob" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=13051"&gt;</description><author>Darknet - The Darkside</author><pubDate>2007-11-29T00:00:00</pubDate><category>Web Security</category></item><item><title>[Security] Microsoft unveils Code Protection suite of tools</title><link>http://softlogger.com/10239/Web-Security/security-microsoft-unveils-code-protection-suite-of-tools.aspx</link><description>&lt;p&gt;about a year ago &lt;a href="http://microsoft.blognewschannel.com/archives/2007/01/17/microsoft-buys-israeli-data-protection-firm-secured-dimensions/"&gt;Microsoft bought a small Israeli Company&lt;/a&gt; called Secured Dimensions. They had an interesting solution to the problem of protecting your .NET code. Basically they would help you choose which parts of the code you'd like to protect and then run those parts of hte code in a special virtual machine encrypted environment (in memory). &lt;/p&gt;  &lt;p&gt;Recently &lt;a href="http://www.microsoft.com/SLPS/products.aspx"&gt;Microsoft released a set of products that seems to be based on SD's technology&lt;/a&gt;, and that's a good thing. There aren't many good solutions to protect .NET code. SD's solution is closer to protecting real IP as it gets as far as I can see.&lt;/p&gt;  &lt;p&gt;&amp;#xA0;&lt;/p&gt;  &lt;p&gt;[via &lt;a href="http://vitalygorn.com/blog/"&gt;vitaly&lt;/a&gt;] - (BTW, Vitaly- you have a configuration bug in your blog. just try accessing a specific &lt;a href="http://vitalygorn.com/blog/post/2007/11/New-code-protection-and-licensing-solution-from-Microsoft.aspx"&gt;post by url and you get a nasty error&lt;/a&gt;)&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=5241848" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/Iserializable?a=g29HcB"&gt;&lt;img src="http://feeds.feedburner.com/~a/Iserializable?i=g29HcB" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=Z1DBWzB"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=Z1DBWzB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=dbuSNWB"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=dbuSNWB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Iserializable?a=vCpOL1b"&gt;&lt;img src="http://feeds.feedburner.com/~f/Iserializable?i=vCpOL1b" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Iserializable/~4/185511112" height="1" width="1"/&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=10239"&gt;</description><author>ISerializable - Roy Osheroves Blog</author><pubDate>2007-11-16T00:00:00</pubDate><category>Web Security</category></item><item><title>VMware Web Management and IIS7 on Windows Server 2008</title><link>http://softlogger.com/12503/Web-Security/vmware-web-management-and-iis7-on-windows-server-2008.aspx</link><description>&lt;p&gt;As I pointed out in a previous &lt;a href="http://blog.angrypets.com/2007/11/google-hosed.html"&gt;post&lt;/a&gt;, I wasn't able to find any love on teh intarwebs about how to get the VMware Web Management Interface to work on Windows Longhorn Server/IIS7. &lt;/p&gt; &lt;p&gt;Then I remembered: One of the cool things about IIS7 on Windows Server 2008 is that it provides you with the ability to 'emulate' IIS6's metabase and scripting interfaces. &lt;/p&gt; &lt;p&gt;So, I just made sure to install those components using the &lt;/p&gt; &lt;p&gt;Having installed VMware Server already on Win2k8, I knew that it crashed and burned (unsurprisingly) while trying to create the web site that would be used to allow HTTP management (over ports 8222 and 8333) of VMs and such. &lt;/p&gt; &lt;p&gt;So I added the IIS 6 Management compatability components:&lt;/p&gt; &lt;p&gt;&lt;img height="152" alt="iis6compat" src="http://blog.angrypets.com/WindowsLiveWriter/iis6compat.gif" width="349"&gt; &lt;/p&gt; &lt;p&gt;And then proceeded with the install normally. &lt;/p&gt; &lt;p&gt;And, that did it. By giving VMware Server a suitable set of scripting interfaces to manage IIS and create a new site, everything worked flawlessly. (Of course, I had to go into the firewall and open up traffic on 8222, and 8333 for HTTP and HTTPs (as well as for port 902 for authorization/normal VMware traffic).)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Running VMware Server on Windows Server 2008 RC0 - x64&lt;/strong&gt;&lt;br&gt;Sadly, I couldn't get VMware server to run on the x64 version of RC0. &lt;/p&gt; &lt;p&gt;During the x32 installation, I got a prompt telling me that some unsigned drivers were detected - should I let them through? I let them on. &lt;/p&gt; &lt;p&gt;With the installation on x64 Windows Server 2008, there was no such warning/prompt. And I simply couldn't log into VMware's Web Interface or via the normal console - as I kept being told that the server "actively refused" the connection. Checking out all of the VMware services on my box, I could see that the Auth Service wasn't running. Starting it just resulted in errors. Happily in the Security Log I could see audit failures at roughly the same time:&lt;/p&gt; &lt;p&gt;Code integrity determined that the image hash of a file is not valid. The file could be corrupt due to unauthorized modification or the invalid hash could indicate a potential disk device error.&lt;/p&gt; &lt;p&gt;That's a spiffy error, and it also listed the file in question: vmx86.sys - the same file/component that the VMware Authentication service depended upon. &lt;/p&gt; &lt;p&gt;I tried supressing those warnings/issues by using bcdedit /SET nointegritychecks ON, but there was no love (even after a reboot). &lt;/p&gt; &lt;p&gt;So.. that's when I decided to bail and just switch to Windows Server 2008 Enterprise (to take advantage of my 8GB of RAM). Maybe by the time Longhorn RTMs there will be a good work-around, or someone else will figure out how to pull it off, but I wasted about 2 hours on it and decided that enough was enough... &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/Angrypets?a=nH5aCyB"&gt;&lt;img src="http://feeds.feedburner.com/~f/Angrypets?i=nH5aCyB" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/Angrypets?a=4965qGb"&gt;&lt;img src="http://feeds.feedburner.com/~f/Angrypets?i=4965qGb" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=12503"&gt;</description><author>AngryPets Blog</author><pubDate>2007-11-06T00:00:00</pubDate><category>Web Security</category></item><item><title>Ideal Log Management Tool?</title><link>http://softlogger.com/12137/Web-Security/ideal-log-management-tool.aspx</link><description>
&lt;p&gt;The idea came from Jeremiah Grossman (&lt;strong&gt;&lt;a href="http://jeremiahgrossman.blogspot.com/2007/10/best-web-application-vulnerability.html"&gt;here&lt;/a&gt;&lt;/strong&gt;) when he described &amp;#8220;The Best Web Application Vulnerability Scanner in the World&amp;#8221; thus: &amp;#8220;&lt;em&gt;Within a few moments of pressing the scan button it&amp;#8217;ll find every vulnerability, with zero false positives, generate a pretty looking report, and voila you&amp;#8217;re compliant with GLBA, HIPAA, and PCI-DSS. Of course, we all know such a web application scanner is &lt;strong&gt;simply not possible&lt;/strong&gt; to create for a variety of reasons&lt;/em&gt;.&amp;#8221;&lt;/p&gt;
&lt;p&gt;So, let&amp;#8217;s imagine the idea &lt;a href="http://www.loglogic.com/"&gt;log management&lt;/a&gt; application. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Logging configuration&lt;/strong&gt;: the ideal log app will go and find all possible log sources (systems, devices, applications, etc) &lt;strong&gt;and then &lt;/strong&gt;enable the right kind of logging on them according to a high level policy given to it (&lt;strong&gt;required&lt;/strong&gt;: God-like powers)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log collection&lt;/strong&gt;: it will collect all the above logs securely (and without using any risky super-user access ) and with little to no impact to networks and systems (&lt;strong&gt;required&lt;/strong&gt;: God-like powers)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log storage&lt;/strong&gt;: it can security store the above logs in the original format for as long as needed and in a manner allowing quick access to them  - in both raw and summarized/enriched form (&lt;strong&gt;required&lt;/strong&gt;: plenty of hardware)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log analysis&lt;/strong&gt;: this ideal application will be able to look at all kinds of logs, known to it and previously unseen, from standard and custom log sources, and tell the user what they need to know about their environment and based on their needs: what is broken? what is hacked? where? what is in violation of regulations/policies? what will break soon? who is doing this stuff? The analysis will power all of the following: automated actions, real-time notifications, long-term historical analysis as well as compliance relevance analysis (&lt;strong&gt;required&lt;/strong&gt;: AI)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Information presentation&lt;/strong&gt;: this tool will distill the above data, information and conclusions generated by the analytic components and present then in a manner consistent with the user&amp;#8217;s role: from operator to analyst to engineer to executive. Interactive visual and drillable text-based data presentation across all log sources. The users can also customize the data presentation based on their wishes and job needs, as well as information perception styles (&lt;strong&gt;required&lt;/strong&gt;: nothing more than a bunch of daring UI designers)  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation:&lt;/strong&gt; the ideal log management tool will be able to take limited automated actions to resolve discovered and confirmed issues as well as generate guidance to users so that they know what actions to take, when full-auto mode is not appropriate. The responses will range from full-auto actions to assisted actions (&amp;#8217;click here to fix it&amp;#8217;) to issuing detailed remediation guidance. The output will include a TODO-list of discovered items complete with actions suggested, ordered by priority  (&lt;strong&gt;required&lt;/strong&gt;: AI + some luck + some user stupidity :-))  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance:&lt;/strong&gt; this tool can also be used directly by auditors to validate or prove compliance with relevant regulations  by using regulation-specific content and all the collected data. The tool will also point at gaps in data collection as it applies to specific regulations that the user is interested in complying (&lt;strong&gt;required&lt;/strong&gt;: God-like powers) &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In other words, this magic black box will have crap shoveled from one side and will have answers to questions about the meaning of Life :-) coming out the other side&amp;#8230;&lt;/p&gt;
&lt;p&gt;What? :-) Am I nuts?  Well, can I dream for a second? :-)&lt;/p&gt;
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:160b650e-9f4f-4517-b5c2-eadcfb6b1f95" contenteditable="false" style="margin: 0px; padding: 0px; display: inline; float: none;"&gt;Technorati tags: &lt;a href="http://technorati.com/tags/logs" rel="tag"&gt;logs&lt;/a&gt;, &lt;a href="http://technorati.com/tags/log%20management" rel="tag"&gt;log management&lt;/a&gt;, &lt;a href="http://technorati.com/tags/logging" rel="tag"&gt;logging&lt;/a&gt;, &lt;a href="http://technorati.com/tags/future" rel="tag"&gt;future&lt;/a&gt;, &lt;a href="http://technorati.com/tags/vision" rel="tag"&gt;vision&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;&lt;br /&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;script type="text/javascript"&gt;&lt;br /&gt;
_uacct = "UA-101395-8";&lt;br /&gt;
urchinTracker();&lt;br /&gt;
&lt;/script&gt;&lt;/p&gt;
&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=12137"&gt;</description><author>OReilly Sysadmin</author><pubDate>2007-11-05T00:00:00</pubDate><category>Web Security</category></item><item><title>SOA in the Unification Model</title><link>http://softlogger.com/10491/Web-Security/soa-in-the-unification-model.aspx</link><description>&lt;P&gt;This is third in a series on the impact of the business operating model on Service Oriented Architecture.&amp;nbsp; (see &lt;A href="http://blogs.msdn.com/nickmalik/archive/2007/10/12/soa-and-the-cisr-operating-models.aspx" target=_blank mce_href="http://blogs.msdn.com/nickmalik/archive/2007/10/12/soa-and-the-cisr-operating-models.aspx"&gt;overview&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What can you get from this series?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;My prior post raised a bit of ire with one of my readers, a fellow whom I respect.&amp;nbsp; He felt that my posts were not telling a positive story about SOA.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I believe that SOA is a highly valuable paradigm for enterprise integration.&amp;nbsp; I also believe that the ability to apply SOA to a problem is not uniform.&amp;nbsp; Some problems can be solved with SOA.&amp;nbsp; Others cannot.&amp;nbsp; There is no magic bullet.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I am hopeful that this series helps folks to &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;identify which situations they are in, 
&lt;LI&gt;understand the challenges they will face when applying SOA to their situation, and 
&lt;LI&gt;improve their odds of successfully providing value to their business.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;I am not attempting to sell SOA to anyone.&amp;nbsp; I make no money from "Selling SOA."&amp;nbsp; I have no personal or professional stake in the success of the SOA paradigm.&amp;nbsp; That said, I believe strongly that SOA has a value, and if we do a good job of avoiding mistakes, we can demonstrate that value to our respective businesses.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;The Unification Operating Model&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;"When organizational units are tightly integrated around a standardized set of processes, companies benefit from a Unification model.&amp;nbsp; Companies applying this model find little benefit in business unit autonomy.&amp;nbsp; They maximize efficiencies and customer services by presenting integrated data and driving variability out of business processes." (Enterprise Architecture As Strategy, by Ross, Weill, and Robertson)&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I illustrate this model as follows.&amp;nbsp; (I described how to read these images in a &lt;A class=" " href="http://blogs.msdn.com/nickmalik/archive/2007/10/19/soa-in-the-coordination-model.aspx" target=_blank mce_href="http://blogs.msdn.com/nickmalik/archive/2007/10/19/soa-in-the-coordination-model.aspx"&gt;prior post&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/nickmalik/WindowsLiveWriter/SOAintheUnificationModel_9400/operational%20models%20-%20Unification.jpg" atomicselection="true"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=240 alt="operational models - Unification" src="http://blogs.msdn.com/blogfiles/nickmalik/WindowsLiveWriter/SOAintheUnificationModel_9400/operational%20models%20-%20Unification_thumb.jpg" width=174 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Companies that use a Unification model work very hard to wring out every drop of waste from often-complex processes.&amp;nbsp;&amp;nbsp; Some attributes:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Highly centralized management environment 
&lt;LI&gt;Company grows through leveraging economies of scale 
&lt;LI&gt;Process standardization seen as a key element of corporate success 
&lt;LI&gt;Frequently found in commodity businesses&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;One example that Ross uses is the core chemicals manufacturing business of Dow Chemical.&amp;nbsp; &lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;IT in the Unification Operating model &lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;As I said before, the operating model is the single largest driver of decisions in your SOA.&amp;nbsp; The impact of the model starts with the business, extends through business funding of IT, and into the architecture, design, and complexity of the IT ecosystem.&amp;nbsp; In a company based on the unification model, the following situations are typical:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Shared enterprise systems &lt;/STRONG&gt;- Large IT systems are often used to reinforce the centralized nature of these companies.&amp;nbsp; It is not uncommon to see an ERP system managing a wide array of core functions, including HR, manufacturing, customer relationship management, and financial management.&amp;nbsp; It is also common to see a best-of-breed approach, where large systems from different vendors are implemented to support each function separately.&amp;nbsp; Integration is key to success.&amp;nbsp; However, the data models for the information typically is defined by these applications themselves.&lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Process owners&lt;/STRONG&gt;&amp;nbsp;- In order to get process consistency among the various operating units, a single person is identified to own each key process and they, along with their team, is responsible for insuring that the process is efficient, cost-effective, and productive.&amp;nbsp; &lt;BR&gt;
&lt;LI&gt;&lt;STRONG&gt;Central IT decision making&lt;/STRONG&gt;&amp;nbsp;- Decisions in the IT organization are central.&amp;nbsp; Systems are purchased, and deployed, with the goal of improving the cost effectiveness and efficiency of the company's core business processes.&amp;nbsp; These companies tend to have very tight IT budgets, as IT is frequently not seen as a core contributor to process innovation.&amp;nbsp; Data masters are often centrally mandated.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Note&amp;nbsp;that, in the unification model, variation between business units is kept to a minimum.&amp;nbsp;&amp;nbsp;It is common to see the CIO report to the Finance Director or Chief Financial Officer.&amp;nbsp; 
&lt;H4&gt;&lt;STRONG&gt;SOA and BPM in the Unification Model&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;The Unification Model is interesting because (a) SOA is expensive and may take years to reap full benefits, and (b) this IT environment is very cost conscious.&amp;nbsp; That said, the environment is already familiar with purchasing large software systems and taking a long period of time to implement them.&amp;nbsp; If you work in an environment like this one, and there is no SOA in place, you may make some traction by framing SOA as a single software package.&amp;nbsp; (Not as large as ERP, but larger than a shipping management system, for example.)&amp;nbsp; On the other hand, you could also get traction by tying SOA to a large system upgrade (see below). 
&lt;P&gt;&lt;STRONG&gt;The common data model&lt;/STRONG&gt; 
&lt;P&gt;Once again, the key to implementing Enterprise SOA is the common data model.&amp;nbsp; While the cost of creating a common data model is far less in this model, the benefit may be difficult to explain.&amp;nbsp; That is because the data model is driven by the central systems that produce or consume the data.&amp;nbsp; The urgency for creating a common data model may not be high. 
&lt;P&gt;In this model, SOA provides two benefits.&amp;nbsp; Both require the common data model: 
&lt;P&gt;1) &lt;STRONG&gt;Protection from Vendor Lock-in&lt;/STRONG&gt;: If the company has taken a "best of breed" approach to technology acquisition, then they have likely purchased different systems from different vendors for key business functions.&amp;nbsp; Integrating these systems is expensive, and there are scars to prove it.&amp;nbsp; This creates a "high barrier to entry and high barrier to exit" for these companies.&amp;nbsp; It costs a lot to put in a system, but even more to leave.&amp;nbsp; SOA can help lower those barriers by creating an abstract layer that processes abstract transactions in a standardized way.&amp;nbsp; 
&lt;P&gt;This allows a company to purchase a new Financial system (Microsoft Dynamics AX, for example), and instead of integrating each of the other systems to it, the IT department would simply write adapters to connect the new system to the abstract services layer.&amp;nbsp; Other systems can now directly consume the new system without substantial modification&amp;nbsp; (in theory, anyway.&amp;nbsp; Nothing is perfect.) 
&lt;P&gt;2) &lt;STRONG&gt;Process Composition across systems&lt;/STRONG&gt;:&amp;nbsp; It can be difficult to track a single transaction, through a complex process, across many systems.&amp;nbsp; The customer doesn't care.&amp;nbsp; You can directly impact customer satisfaction if it is difficult to figure out which system has the information that your customer needs to know, or to make it difficult to retrieve that information readily.&amp;nbsp; 
&lt;P&gt;So, if customer satisfaction is important, process composition across many systems&amp;nbsp;is a key capability of your IT infrastructure.&amp;nbsp; To solve for this problem, you need&amp;nbsp;four things: SOA as an integration mechanism,&amp;nbsp;a common information model as a unifier, an enterprise&amp;nbsp;identifier scheme to allow the transaction to be traced from start to finish, and tools to inspect each system for the information related to a unique transaction (using SOA, of course). 
&lt;P&gt;&lt;STRONG&gt;Funding SOA&lt;/STRONG&gt; 
&lt;P&gt;If you get your information model in place, you could implement SOA as a combination of a package install and software adapters that is tied to a larger project, like an ERP replacement.&amp;nbsp; On the other hand, with this operating model, it is possible to build a bottom-up SOA, where the services are produced as part of IT projects without architectural coordination,&amp;nbsp;primarily in areas where the information model is well-understood.&amp;nbsp; 
&lt;P&gt;&lt;STRONG&gt;Direct Impacts of the Unification Model on SOA Operations&lt;/STRONG&gt; 
&lt;P&gt;The following effects would be typical for SOA+BPM in a Coordination model: 
&lt;P&gt;&lt;STRONG&gt;Centralized&amp;nbsp;Process Management&lt;/STRONG&gt; - Process owners manage a subset of the processes.&amp;nbsp; Processes are&amp;nbsp;often coordinated.&amp;nbsp; Using the same BPM tool and repository is a best-practice, and one that will make immediate sense to the business.&amp;nbsp; The tool must be able to support a wide array of BPM needs, and must leverage standards.&amp;nbsp;&amp;nbsp; 
&lt;P&gt;&lt;STRONG&gt;Centralized Governance Model&lt;/STRONG&gt; - SOA Governance tools are quite useful in this model, and they should be used.&amp;nbsp; (SOA Software and Amberpoint are two Microsoft partners that I would suggest, for readers interested in this space.)&amp;nbsp; 
&lt;P&gt;&lt;STRONG&gt;SOA Service&amp;nbsp;Adoption&lt;/STRONG&gt; - Due to centralized decision-making, the decision to consume a service can be tied to project funding.&amp;nbsp; This bit of overhead should pay for itself quite easily, since you would end up with a greater amount of service reuse, and therefore, less code to maintain in the long run.&amp;nbsp; Some organizations have even gone all out, and implemented a set of core SOA services as a single project, then turning to governance to require all new projects to adopt them.&amp;nbsp; (Top-down SOA).&amp;nbsp; 
&lt;P&gt;&lt;STRONG&gt;Cross-system process concerns&lt;/STRONG&gt;&amp;nbsp;-&amp;nbsp;Getting SOA benefits out of processes that look to a single enterprise system is a fairly quick win.&amp;nbsp;&amp;nbsp;I like quick-wins.&amp;nbsp; You can build credibility for SOA by rolling out a few of these "low-hanging fruit" projects.&amp;nbsp;&amp;nbsp;However, to get&amp;nbsp;real enterprise benefit out of SOA, you need to be able to compose a process across many systems.&amp;nbsp; This can be easy, or this can be hard.&amp;nbsp; 
&lt;P&gt;To make it&amp;nbsp;simple, repeatable, and adaptable, you need to create your&amp;nbsp;common information model.&amp;nbsp; That model must contain not only information entities, but also a notion of what business documents you will communicate with, and what events occur on each&amp;nbsp;document.&amp;nbsp; 
&lt;P&gt;&lt;STRONG&gt;SOA Readiness&lt;/STRONG&gt;&amp;nbsp;- While a central group may decide to implement SOA, each of the IT teams that surround the major systems will have different levels of understanding of the concept of event-driven services.&amp;nbsp; You will need to build a common understanding, and common standards, to make sure that these different groups, using different technologies, can reduce the friction that could occur when a process consumes many different services. 
&lt;P&gt;&lt;STRONG&gt;Centralized&amp;nbsp;Service Catalog&lt;/STRONG&gt; - You are likely to end up with a single catalog, but it may be a good idea to consider splitting the catalog into layers, with&amp;nbsp;the upper layer&amp;nbsp;of services oriented towards the business process areas that the organization cares about, and&amp;nbsp;the lower&amp;nbsp;layer of services&amp;nbsp;to makes the information available.&amp;nbsp; Services in the&amp;nbsp;upper layer&amp;nbsp;consume services in the lower one.&amp;nbsp;By separating services in this manner, you can&amp;nbsp;simplify the&amp;nbsp;SOA composition process.&amp;nbsp; 
&lt;H4&gt;&lt;STRONG&gt;Conclusion&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;The Service Oriented Architecture for&amp;nbsp;the unification operating model should take a cost-focused approach to delivering business value, orienting the services towards both process and information.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5717580" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=10491"&gt;</description><author>Inside Architecture</author><pubDate>2007-10-27T00:00:00</pubDate><category>Web Security</category></item><item><title>Best Practice: Always open WCF client proxy explicitly when it is shared</title><link>http://softlogger.com/10307/Web-Security/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared.aspx</link><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;In order to provide symmetric programming model for the client-side as for the server-side, WCF leverages .NET Remoting transparent proxy technique so that the service contract interface can be used seamlessly as on the server-side. The svcutil.exe tool can generate WCF client proxy code for you. If you take a closer look at the generated code, you will find out that the proxy class is a subclass of ClientBase&amp;lt;T&amp;gt;. By using ChannelFactory&amp;lt;T&amp;gt;, you can create your proxy (or called channel) directly without going through ClientBase&amp;lt;T&amp;gt;.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;Creating a WCF proxy is quite a heavy-weighted operation. So sometimes, you would want to create a single proxy and let multiple threads to use it. This works quite well if you don’t want the proxy to keep specific context (such as security credential) on each call.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;The best practice in this case is that: you should always open WCF client proxy explicitly before you are making any calls. Here is the sample code if you use auto-generated proxy from svcutil.exe:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;MyHelloServiceClient&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; proxy = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: #2b91af"&gt;MyHelloServiceClient&lt;/SPAN&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;proxy.Open();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;// Make a call with the proxy&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;proxy.Hello(&lt;SPAN style="COLOR: #a31515"&gt;"Hello world!"&lt;/SPAN&gt;);&lt;SPAN style="COLOR: green"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin; mso-bidi-font-family: 'Courier New'"&gt;&lt;FONT size=3&gt;Here is the sample code if you use ChannelFactory&amp;lt;T&amp;gt; to create a proxy:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #2b91af; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;ISimpleContract&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; proxy = factory.CreateChannel();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;((&lt;SPAN style="COLOR: #2b91af"&gt;IClientChannel&lt;/SPAN&gt;)proxy).Open();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;// Make a call with the proxy&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.5in; LINE-HEIGHT: normal; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;proxy.Hello(&lt;SPAN style="COLOR: #a31515"&gt;"Hello world!"&lt;/SPAN&gt;);&lt;SPAN style="COLOR: green"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;If you don’t call the “Open” method first, the proxy would be opened internally when the first call is made on the proxy. This is called auto-open.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;Why? When the first message is sent through the auto-opened proxy, it will cause the proxy to be opened automatically. You can use .NET Reflector to open the method System.ServiceModel.Channels.ServiceChannel.Call and see the following code:&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Segoe UI','sans-serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #1000a0"&gt;if&lt;/SPAN&gt; (!&lt;SPAN style="COLOR: #1000a0"&gt;this&lt;/SPAN&gt;.&lt;A title="bool System.ServiceModel.Channels.ServiceChannel.explicitlyOpened;" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Channels.ServiceChannel/explicitlyOpened:Boolean" mce_href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Channels.ServiceChannel/explicitlyOpened:Boolean"&gt;&lt;SPAN style="COLOR: #006018; TEXT-DECORATION: none; text-underline: none"&gt;explicitlyOpened&lt;/SPAN&gt;&lt;/A&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Segoe UI','sans-serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Segoe UI','sans-serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #1000a0"&gt;this&lt;/SPAN&gt;.&lt;A title="void System.ServiceModel.Channels.ServiceChannel.EnsureDisplayUI();" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Channels.ServiceChannel/EnsureDisplayUI()" mce_href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Channels.ServiceChannel/EnsureDisplayUI()"&gt;&lt;SPAN style="COLOR: #006018; TEXT-DECORATION: none; text-underline: none"&gt;EnsureDisplayUI&lt;/SPAN&gt;&lt;/A&gt;();&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Segoe UI','sans-serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: #1000a0"&gt;this&lt;/SPAN&gt;.&lt;A title="void System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout);" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Channels.ServiceChannel/EnsureOpened(System.TimeSpan)" mce_href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Channels.ServiceChannel/EnsureOpened(System.TimeSpan)"&gt;&lt;SPAN style="COLOR: #006018; TEXT-DECORATION: none; text-underline: none"&gt;EnsureOpened&lt;/SPAN&gt;&lt;/A&gt;(rpc.&lt;A title="TimeoutHelper System.ServiceModel.Dispatcher.ProxyRpc.TimeoutHelper;" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Dispatcher.ProxyRpc/TimeoutHelper:System.ServiceModel.TimeoutHelper" mce_href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.Dispatcher.ProxyRpc/TimeoutHelper:System.ServiceModel.TimeoutHelper"&gt;&lt;SPAN style="COLOR: #006018; TEXT-DECORATION: none; text-underline: none"&gt;TimeoutHelper&lt;/SPAN&gt;&lt;/A&gt;.&lt;A title="TimeSpan System.ServiceModel.TimeoutHelper.RemainingTime();" href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.TimeoutHelper/RemainingTime():System.TimeSpan" mce_href="http://www.aisto.com/roeder/dotnet/Default.aspx?Target=code://System.ServiceModel:3.0.0.0:b77a5c561934e089/System.ServiceModel.TimeoutHelper/RemainingTime():System.TimeSpan"&gt;&lt;SPAN style="COLOR: #006018; TEXT-DECORATION: none; text-underline: none"&gt;RemainingTime&lt;/SPAN&gt;&lt;/A&gt;());&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"&gt;&lt;SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Segoe UI','sans-serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;When you drill down into EnsureOpened, you will see that it calls CallOnceManager.CallOnce. For non-first calls, you would hit SyncWait.Wait which waits for the first request to complete. This mechanism is to ensure that all requests wait for the proxy to be opened and it also ensures the correct execution order. Thus all requests are serialized into a single execution sequence until all requests are drained out from the queue. This is not a desired behavior in&amp;nbsp;most cases.&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;To avoid such “serializing” artifact, the best practice is to open the proxy explicitly as above. Once you get to this point, you will be able to share the same proxy object among multiple threads.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Cambria','serif'; mso-ascii-theme-font: major-latin; mso-hansi-theme-font: major-latin"&gt;&lt;FONT size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5684281" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=10307"&gt;</description><author>Wenlong Dongs Blog</author><pubDate>2007-10-26T00:00:00</pubDate><category>Web Security</category></item><item><title>XSSDETECT: Analyzing Large Applications</title><link>http://softlogger.com/8511/Web-Security/xssdetect-analyzing-large-applications.aspx</link><description>&lt;P&gt;&lt;FONT face=verdana,geneva&gt;XSSDetect is a static binary analysis tool. In the first step of analysis it reads target binaries to create a directed graph where nodes represent statements while the edges represent flow of data. This graph can get huge for large applications and users can sometimes run into the “out of memory exception.” Read this blog if you are experiencing this issue&amp;nbsp;and would like to resolve it. &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;First of all, having lots of RAM and swap space does not help in this particular scenario. In a 32 bit Windows operating system, a process can address only 4GB of memory address space, 2GB of which is used by the kernel. In practice, a process will throw an out of memory exception after having used a little over 1GB because it fails to allocate anymore contiguous memory. In the case of XSSDetect, we found two successful ways of overcoming this limitation. &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;One solution is to analyze the large application on a 64bit Windows OS. A version of XSSDetect especially compiled for this platform is also required. The XSSDetect Beta 1.0 that is available on the Internet, however, does not currently support 64bit processing. Please look for support for analyzing large applications to become available very soon. &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;The other solution is to choose the target analysis binaries intelligently. When you open a solution, XSSDetect adds all managed binaries built by the solution to the targets list by default. However, a user can choose to run analysis on only one or few projects at a time. In order to remove some of the binaries from this list, hit the ‘Target Assemblies’ button in the XSSDetect toolbar and then click Add/Remove button to go to Advanced Targets Settings.&amp;nbsp; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; WIDTH: 244px; HEIGHT: 299px; BORDER-RIGHT-WIDTH: 0px" height=299 src="http://blogs.msdn.com/photos/ace_team/images/5652641/original.aspx" width=244 align=middle border=0 mce_src="http://blogs.msdn.com/photos/ace_team/images/5652641/original.aspx"&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=verdana,geneva&gt; &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;In the Advanced targets Settings dialog box, a user can select each target and click ‘Read’ assembly to view the approximate memory required for analysis and also view its dependencies. Using this information a user can decide which projects to analyze in one go. It is important to realize that if data flows from one project assembly to another and the two assemblies are not analyzed together then vulnerabilities can get missed. Therefore, while it is not necessary to add .NET framework dependencies like mscorelib.dll to the target assemblies list, a user should attempt to select solution projects that reference each other and then keep repeating the process until all binaries have been analyzed. &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;64Bit machines are still not very common in Microsoft which is why the last work around is used extensively by all our application teams. However, if the target assemblies are chosen carefully the results can be as accurate as running the analysis on the entire solution&amp;nbsp; together. XSSDetect's UI is especially designed to make this step easier. &lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=verdana,geneva&gt;Please keep using this tool and giving us feedback.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5652740" width="1" height="1"&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=8511"&gt;</description><author>ACE Team - Security, Performance &amp;amp; Privacy</author><pubDate>2007-10-24T00:00:00</pubDate><category>Web Security</category></item><item><title>Create Custom RoleProvider for ASP.NET Role Permissions and Security</title><link>http://softlogger.com/8206/Web-Security/create-custom-roleprovider-for-asp-net-role-permissions-and-security.aspx</link><description>Just as with a Custom MembershipProvider, one can create a Custom RoleProvider in ASP.NET to handle role-based permissions and security. In this 5 minute tutorial I am going to create a custom roleprovider, called SimpleRoleProvider, that only allows users in the "Admin" role to view a page. Read more...&lt;img src ="http://davidhayden.com/blog/dave/aggbug/3365.aspx" width = "1" height = "1" /&gt;&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=8206"&gt;</description><author>David Hayden - Florida .NET Developer - C# and SQL Server</author><pubDate>2007-10-17T00:00:00</pubDate><category>Web Security</category></item><item><title>Re-enable request validation in ASP.NET</title><link>http://softlogger.com/7657/Web-Security/re-enable-request-validation-in-asp-net.aspx</link><description>&lt;p&gt;
&lt;a href="http://www.asp.net/learn/whitepapers/request-validation/"&gt;Request validation&lt;/a&gt; is enabled by default in ASP.NET and it basically stops people from submitting a form with HTML in any of the input fields. It&amp;rsquo;s a little more sophisticated than that, but basically it just looks for HTML tags and if it finds any, it throws an &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.httprequestvalidationexception.aspx"&gt;exception&lt;/a&gt; and the form is prevented from being posted. 
&lt;/p&gt;
&lt;p&gt;
However, you often want people to be able to write HTML tags in your forms. That&amp;rsquo;s why most people turn it off either globally in web.config or on the individual pages hosting a form and then just HTML encodes the values. I&amp;rsquo;ve done it reluctantly myself many times, but there is a smarter way to allow HTML input without turning request validation off. 
&lt;/p&gt;
&lt;p&gt;
What if we could just HTML encode all input fields just before the form is submitted? That way we could benefit from request validation and the security it offers out of the box. By having request validation enabled, you also make it impossible for spambots to post links in your form. 
&lt;/p&gt;
&lt;p&gt;
The easiest way of doing this is to create a custom server control that inherits from &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.textbox.aspx"&gt;&lt;em&gt;System.Web.UI.WebControls.TextBox&lt;/em&gt;&lt;/a&gt; and add a little JavaScript magic. I&amp;rsquo;ve written a &lt;em&gt;SafeTextBox&lt;/em&gt; class that HTML encodes its value client-side and then HTML decodes the value again server-side. That way it can be treated just like a normal &lt;em&gt;TextBox&lt;/em&gt;. 
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SafeTextBox : System.Web.UI.WebControls.TextBox&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoad(System.EventArgs e)&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;base&lt;/span&gt;.OnLoad(e);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!Page.ClientScript.IsClientScriptBlockRegistered(Page.GetType(), &amp;quot;TextBoxEncode&amp;quot;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Text.StringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Text.StringBuilder();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(&amp;quot;function TextBoxEncode(id)&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(&amp;quot;{&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(&amp;quot;var tb = document.getElementById(id);&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(&amp;quot;tb.&lt;span class="kwrd"&gt;value&lt;/span&gt; = tb.&lt;span class="kwrd"&gt;value&lt;/span&gt;.replace(&lt;span class="kwrd"&gt;new&lt;/span&gt; RegExp(&amp;#39;&amp;lt;&amp;#39;, &amp;#39;g&amp;#39;), &amp;#39;&amp;amp;lt;&amp;#39;);&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(&amp;quot;tb.&lt;span class="kwrd"&gt;value&lt;/span&gt; = tb.&lt;span class="kwrd"&gt;value&lt;/span&gt;.replace(&lt;span class="kwrd"&gt;new&lt;/span&gt; RegExp(&amp;#39;&amp;gt;&amp;#39;, &amp;#39;g&amp;#39;), &amp;#39;&amp;amp;gt;&amp;#39;);&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(&amp;quot;}&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), &amp;quot;TextBoxEncode&amp;quot;, sb.ToString(), &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;} 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="rem"&gt;// Adds the function call after the form validation is called.&lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!Page.IsPostBack)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Page.Form.Attributes[&amp;quot;onsubmit&amp;quot;] += &amp;quot;TextBoxEncode(&amp;#39;&amp;quot; + ClientID + &amp;quot;&amp;#39;);&amp;quot;;&lt;br /&gt;
&amp;nbsp;} 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Text&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;base&lt;/span&gt;.Text; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;set&lt;br /&gt;
&amp;nbsp;&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(&lt;span class="kwrd"&gt;value&lt;/span&gt;))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;base&lt;/span&gt;.Text = &lt;span class="kwrd"&gt;value&lt;/span&gt;.Replace(&amp;quot;&amp;amp;lt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;).Replace(&amp;quot;&amp;amp;gt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kwrd"&gt;base&lt;/span&gt;.Text = &lt;span class="kwrd"&gt;value&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
} 
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
The way the &lt;em&gt;SafeTextBox&lt;/em&gt; HTML encodes/decodes is not very sophisticated but it works. You can add your own logic to the encoding/decoding if you feel the need. 
&lt;/p&gt;
&lt;p&gt;
To roll this out on your own website, just dump the &lt;em&gt;SafeTextBox&lt;/em&gt; class in the App_Code folder and hook it up using &lt;a href="http://blog.madskristensen.dk/post.aspx?id=faf67d07-ce7b-461d-ae24-e3980b1ecb0e"&gt;tag mapping&lt;/a&gt;. 
&lt;/p&gt;
&lt;img alt="via softlogger.com" src="http://softlogger.com/postview.aspx?ArticleID=7657"&gt;</description><author>.NET slave</author><pubDate>2007-10-14T00:00:00</pubDate><category>Web Security</category></item></channel></rss>