Enkel HTML scrambler

Dette er en servercontrol som scrambler html. En slik kontrol er nyttig hvis man ønsker å legge ut mailto-linker uten at spam-roboter kan lese mailadressen din. Kontrollen er skrevet i C# og den kan scramble på to ulike måter, javascript eller html.

For å ta den i bruk legger du bare kontrollen rundt den teksten du vil scramble på denne måten

<%@ 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>

Kontrollen er veldig enkel og inneholder kun et par funksjoner for å få dette til å fungere.

// 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 + ";";
}

I tillegg er det selve scramble funksjonen som ser slik ut:

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;
    }
}

Som du ser kan den scramble på to ulike måter. Med javascript eller html. Begge gjør samme nytten, men det er jo ikke alle som støtter javascript og derfor bør man kanskje ta hensyn til det.

I tillegg er det en render-metode som skriver ut resultatet til klienten. Selve kontrollen arver fra en Literal-control. Literal er en kontrol som rett og slett viser ren tekst.

Du kan laste ned prosjektet med full kildekode fra min artikkel på codeproject.com, eller direkte her