Click here to Skip to main content
6,295,667 members and growing! (9,611 online)
Email Password   helpLost your password?
Web Development » Web Security » Security     Intermediate License: The Code Project Open License (CPOL)

Query string encryption for ASP.NET

By Michael Ulmann

Clear text query strings are a potential security threat for your web application. Thus, query strings should always be encrypted.
C#, Javascript, CSS, HTML, ASP, ASP.NET, WebForms, Ajax, Dev
Posted:30 Apr 2008
Updated:7 May 2008
Views:29,869
Bookmarked:60 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
18 votes for this article.
Popularity: 4.05 Rating: 3.23 out of 5
1 vote, 5.6%
1
4 votes, 22.2%
2
3 votes, 16.7%
3
3 votes, 16.7%
4
7 votes, 38.9%
5

Introduction

Using query strings to send data from the browser to the server is a widespread approach. Giving the visitor of a web application the opportunity of modifying query strings by transmitting them in clear text, is certainly a potential security threat.

Thus, I encourage developers to encrypt query strings, even if they do not contain confidential data. However, I am aware that it is still possible to alternate an encrypted query string, but with an appropriate exception handling, this is harmless.

Background

To keep this article simple, I used a contradictable encryption (DES encoding), though any cutting-edge encryption can be easily applied to the samples given.

Using the code

So, let's get down to business. The main part of the presented solution consists of a HttpModule which decrypts the query string and hence provides the page request with the ordinary unencrypted query strings:

using System;
using System.Web;
using System.Web.Configuration;

namespace SmartSoft.QueryStringEncryption
{
    /// <summary>
    /// Http module that handles encrypted query strings.
    /// </summary>
    public class CryptoQueryStringUrlRemapper : IHttpModule
    {
        #region IHttpModule Members

        /// <summary>
        /// Initialize the http module.
        /// </summary>
        /// <param name="application">Application,
        ///           that called this module.</param>
        public void Init(HttpApplication application)
        {
            // Attach the acquire request state event
            // to catch the encrypted query string
            application.AcquireRequestState += application_AcquireRequestState;
        }

        public void Dispose()
        {}
    
        #endregion

        /// <summary>
        /// Event, that is called when the application acquires the request state.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void application_AcquireRequestState(object sender, EventArgs e)
        {
            // Get http context from the caller.
            HttpApplication application = (HttpApplication) sender;
            HttpContext context = application.Context;

            // Check for encrypted query string
            string encryptedQueryString = context.Request.QueryString["request"];
            if (!string.IsNullOrEmpty(encryptedQueryString))
            {
                // Decrypt query strings
                string cryptoKey = WebConfigurationManager.AppSettings["CryptoKey"];
                string decryptedQueryString = 
                  CryptoQueryStringHandler.DecryptQueryStrings(encryptedQueryString, 
                                                               cryptoKey);
                context.Server.Transfer(
                  context.Request.AppRelativeCurrentExecutionFilePath + 
                  "?" + decryptedQueryString);
            }
        }
    }
}

As you might have noticed, if there is an encrypted query string for the current request, the module automatically terminates the execution of the current page and internally starts execution of a new request on the server.

The next step is to register the HttpModule in the web.config file:

<httpModules>
    <add name="CryptoQueryStringUrlRemapper" 
      type="SmartSoft.QueryStringEncryption.CryptoQueryStringUrlRemapper"/>
</httpModules>

Last but not least, do not forget to encrypt query strings before sending them back to the server:

private void PrepareSendButton()
{
    NameValueCollection queryStrings = new NameValueCollection();
    queryStrings.Add("param1", "Test1");
    queryStrings.Add("param2", "Test2");
    queryStrings.Add("param3", "Test3");

    // Encrypt query strings
    string encryptedString = CryptoQueryStringHandler.EncryptQueryStrings(
      queryStrings, WebConfigurationManager.AppSettings["CryptoKey"]);
    btnSendParams.PostBackUrl = string.Concat("~/Default.aspx?", encryptedString);
}

As outlined earlier in this article, the encryption class can be easily replaced by any other encryption class. A full running sample can be downloaded above.

Important issue

The method DecryptQueryStrings in the CryptoQueryStringHandler contains the following line :

return Encryption64.Decrypt(encryptedStrings.Replace(" ", "+"), key); 

For unknown reasons, the request replaces every '+' character in the query with an empty character.

History

  • 30.04.2008 - First version (deleted -> was not possible to modify, why ever...).
  • 01.05.2008 - Re-released updated article.
  • 08.05.2008 - BeginRequest event in the HttpModule changed to AcquireRequestState in order to support Session data.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Michael Ulmann


Member
MCAD, MCPD Web Developer
Visit my Space: http://ukmichael.spaces.live.com
Company information: www.smart-soft.ch
Occupation: Software Developer (Senior)
Company: Smart-Soft
Location: Australia Australia

Other popular Web Security articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 20 of 20 (Total in Forum: 20) (Refresh)FirstPrevNext
GeneralSerious issue with encoding Pinmembersrouss0:57 3 Jun '09  
GeneralThere is a major problem with this approach PinmemberOrionDR6:44 20 Mar '09  
GeneralCan still alter query string and decryption goes through and returs invalid charactors PinmemberNimendra20:55 29 Sep '08  
GeneralAuto-Encrypting QueryStrings before Response PinmemberRuchit Surati10:51 8 May '08  
GeneralSession State PinmemberAllan Eagle5:14 7 May '08  
GeneralRe: Session State PinmemberMichael Ulmann18:47 7 May '08  
GeneralQuerystring decrypting on postback PinmemberLordGentle10:25 6 May '08  
GeneralRe: Querystring decrypting on postback PinmemberMichael Ulmann13:10 6 May '08  
RantCompletely unnecessary PinmemberTrumpi1:10 1 May '08  
GeneralRe: Completely unnecessary PinmemberAndyM777:52 2 May '08  
GeneralRe: Completely unnecessary PinmemberMR_SAM_PIPER15:33 7 May '08  
GeneralRe: Completely unnecessary PinmemberMichael Ulmann18:32 7 May '08  
GeneralRe: Completely unnecessary PinmemberMatt Sollars4:18 13 May '08  
GeneralRe: Completely unnecessary Pinmemberwk6335:29 13 May '08  
GeneralNo Completely Pinmember Clickok 12:50 2 May '08  
GeneralRe: No Completely PinmemberMichael Ulmann14:53 2 May '08  
GeneralRe: Completely unnecessary (really necessary) Pinmembersides_dale11:19 7 May '08  
GeneralRe: Completely unnecessary Pinmemberinetfly1232:59 8 May '08  
AnswerRe: Completely unnecessary Pinmembermeaningoflights19:48 7 Jan '09  
GeneralRe: Completely unnecessary PinmemberJonathan C Dickinson0:49 6 Jan '09  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 7 May 2008
Editor: Smitha Vijayan
Copyright 2008 by Michael Ulmann
Everything else Copyright © CodeProject, 1999-2009
Web17 | Advertise on the Code Project