Click here to Skip to main content
Licence CPOL
First Posted 19 Dec 2007
Views 13,202
Downloads 50
Bookmarked 23 times

Simple HTML Scrambler

By | 19 Dec 2007 | Article
A server control for scrambling HTML code/

Screenshot -

Introduction

This server-control was developed for hiding mail-links. If you put your email-address in a mailto-link, you will receive spam-mail, but you can use simple JavaScript to avoid this. This server-control can wrap your HTML and scramble it with simple JavaScript. The control inherits from a Literal control which is used for plain-text rendering.

Using the code

HTMLScrambler is easy to use. Just put the control around your HTML, and it's ready to go.

<%@ Register Assembly="Serverside.HTMLScrambler" 
    Namespace="Serverside.HTMLScrambler" TagPrefix="uc1" %>

......

<uc1:HTMLScrambler runat="server" id="HTMLScrambler1" Mode="HTML">
  this text/html will be scrambled with HTML.
</uc1:HTMLScrambler>

<hr />

<uc1:HTMLScrambler runat="server" id="HTMLScrambler2" Mode="Javascript">
  this text/html will be scrambled with Javascript.
</uc1:HTMLScrambler>

The control supports two ways to scramble: JavaScript or HTML. It's basically four small functions to get this working.

// Used for javascript scramble
private string GetHex(string character)
{
    String[] hex = { "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", 
         "0A", "0B", "0C", "0D", "0E", "0F", "10", "11", "12", "13", 
         "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", 
         "1E", "1F", "20", "21", "22", "23", "24", "25", "26", "27", 
         "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31", 
         "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", 
         "3C", "3D", "3E", "3F", "40", "41", "42", "43", "44", "45", 
         "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", 
         "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", 
         "5A", "5B", "5C", "5D", "5E", "5F", "60", "61", "62", "63", 
         "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", 
         "6E", "6F", "70", "71", "72", "73", "74", "75", "76", "77", 
         "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", "80", "81", 
         "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", 
         "8C", "8D", "8E", "8F", "90", "91", "92", "93", "94", "95", 
         "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", 
         "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", 
         "AA", "AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3", 
         "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", 
         "BE", "BF", "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", 
         "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", "D0", "D1", 
         "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", 
         "DC", "DD", "DE", "DF", "E0", "E1", "E2", "E3", "E4", "E5", 
         "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", 
         "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", 
         "FA", "FB", "FC", "FD", "FE", "FF" };
    char[] chrBuffer = { Convert.ToChar(character) };
    byte[] bytBuffer = Encoding.Default.GetBytes(chrBuffer);
    int chrIndex = (int)bytBuffer[0];
    return hex[chrIndex];
}


// Used for html-scramble
private string GetCharcode(string character)
{
    char[] chrBuffer = { Convert.ToChar(character) };
    byte[] bytBuffer = Encoding.Default.GetBytes(chrBuffer);
    int chrIndex = (int)bytBuffer[0];
    return "&#" + chrIndex + ";";
}

The scramble-function:

private string Scramble(string HTML)
{
    try
    {
        StringBuilder js = new StringBuilder();
        if (Mode == ScrambleMode.Javascript)
        {
            js.Append("<script type=\"text/javascript\">");
            js.Append("var i,y,x=");
            js.Append("\"");
            for (int i = 0; i < HTML.Length; i++)
            {
                js.Append(this.GetHex(HTML.Substring(i, 1)));
            }
            js.Append("\";");
            js.Append("y='';");
            js.Append("for(i=0;i<x.length;i+=2)");
            js.Append("{");
            js.Append("y+=unescape('%'+x.substr(i,2));");
            js.Append("}");
            js.Append("document.write(y);");
            js.Append("</script>");
        }
        else if (Mode == ScrambleMode.HTML)
        {
            for (int i = 0; i < HTML.Length; i++)
            {
                js.Append(this.GetCharcode(HTML.Substring(i, 1)));
            }
        }
        return js.ToString();
    }
    catch
    {
        return HTML;
    }
}

The control needs a Render method which scrambles all the text in the control.

protected override void Render(HtmlTextWriter writer)
{
    writer.Write(Scramble(this.Text.Trim()));
}

Enums and a rpoperty for making it easier to use in code

private ScrambleMode _mode = ScrambleMode.Javascript;
// Default is javascript

public new ScrambleMode Mode
{
    get { return _mode; }
    set { _mode = value; }
}

public enum ScrambleMode
{
    HTML = 1,
    Javascript = 2
}

And, that's it.

License

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

About the Author

stian.net

Software Developer (Senior)
Novanet AS
Norway Norway

Member

Follow on Twitter Follow on Twitter


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Layout  Per page   
  Refresh
GeneralNice control - minor improvements PinmemberMichael B. Hansen22:15 19 Dec '07  
AnswerRe: Nice control - minor improvements PinmemberServerside2:47 20 Dec '07  
GeneralRe: Nice control - minor improvements PinmemberAndrew Rissing8:15 5 Nov '09  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 19 Dec 2007
Article Copyright 2007 by stian.net
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid