NoSpamEmailHyperlink: 6.自定义

分享于 

13分钟阅读

Web开发

  繁體

A control derived from NoSpamemailHyperlink renders differently but produces the same result

介绍

这是系列六篇文章中最后一篇,在设计。开发和实际使用一个功能完备的ASP.NET 自定义控件之后。

全文的完整 List 如下所示:

这些文章不是对自定义控制开发( 有 700页的网页书几乎没有覆盖它)的全面看法,但它们覆盖了很多基本的基础。

目的是在一个完全可以重用和可以自定义的控制( 与许多虚构的例子相反) 上进行这样的操作。

本文将研究自定义 NoSpamEmailHyperlink的技术,使它的不会直接下载和编辑代码,从而难以将它的改进。

它至少具备 C# 和类继承的基本知识。

自定义 NoSpamEmailHyperlink

通过一些简单的替代,可以完全改变 NoSpamEmailHyperlink的性质,使每个实现该控件的站点都不可以能使用电子邮件。 甚至可以在同一页( 就像上面的截图所示) 上使用多个派生控件,但不建议这样做。

控件的目的是强制收集软件以任何浏览器的效率来处理 JavaScript,从而降低收益率。 如果他们只需要检测链接 array,或者代码密钥,或者使用它,这不会导致太多问题。

另一方面,如果控件在某些网站上有点不同,那么电子邮件收取器就会更加困难。

NoSpamEmailHyperlink 提供六个属性和三个方法,可以重写它们以创建一个完全不同的控件,它的原理相同。

自定义编码密钥

只要遵循几个简单的规则,替换编码字符串就很简单了。 创建一个从 NoSpamEmailHyperlink 派生的新控件,并重写 protected .CodeKey 属性。

publicclass NoSpamEmailHyperlinkEx : NoSpamEmailHyperlink
{
 protectedoverridestring CodeKey
 {
 get {
 return"QpWlEmR5ToY4UkInO0PiAjS19DbFuGhHvJ2KyLgZc3XtCxVf6BNrdMeszawq78";
 }
 }
}

千万不要把同样的字符包含两次。 这将使解码算法混乱。 如果找到重复字符,则不可能知道它从哪个字符转换为。

除非你还重写编码/解码功能,否则还必须重写字母数字字符。 任何它的他字符可以将有效的电子邮件地址转换为无效的(。例如如果第一个字符成为连字符)。

关键字中不包括每个字母数字字符。 漏掉一个或者两个字符实际上会使解码变得更困难。 例如,如果键字符串中缺少"a"和"a"字符,则除了以下内容之外,所有它的他字符都将被替换。 一旦你意识到字符串是使用替换进行编码的,你所期望的最后一个字符就是一些字符。 然而,解码算法将正确处理丢失的字符。

自定义变量名称

如果 NoSpamEmailHyperlink 过于流行,收集器可以识别编码的超链接,或者不使用JavaScript解码它们。

由于 NoSpamEmailHyperlink 使用 GetType().Name 来构建 array 名称。函数名和全局级别变量名,因此从它派生的任何控件都将自动使用不同的名称来避免冲突。

然而,收割机可以轻松查找名称为 _LinkArray的数组,并在那些数组中找到与IDs的链接。 如果没有更多的努力,它可以找到 _SeedArrayky 变量并尝试解码它们。

但是,如果只在几页上更改这些变量的名称,那么检测它们的过程就会变得更加困难。

publicclass NoSpamEmailHyperlinkEx : NoSpamEmailHyperlink
{
 protectedoverridestring CallScriptName {
 get {
 return GetType().Name + "Elephant";
 }
 }
 protectedoverridestring FuncScriptName {
 get {
 return GetType().Name + "SilverFish";
 }
 }
 protectedoverridestring SeedArrayName {
 get {
 return GetType().Name + "TexasHoldem";
 }
 }
 protectedoverridestring LinkArrayName {
 get {
 return GetType().Name + "Leichtenstein";
 }
 }
 protectedoverridestring CodeKeyName {
 get {
 return"ck";
 }
 }
}

如你所见,这些字符串并不完全必须与它的函数相关联。 例如 上面 代码更改种子 array 定义的NAME,使它的类似于以下内容:

var NoSpamEmailHyperlinkExTexasHoldem = new Array("23");

You script,calling会自动调整 array,但是harvester不再寻找,只需搜索 _SeedArray

注意,除了 CodeKeyName 之外的所有 上面 属性都在全局级别的JavaScript中使用。 总是建议在定义中使用 GetType().Name,以允许进一步从你的控件派生并覆盖这些属性。

自定义编码算法

对于更加冒险的tinkerer,也可以覆盖 .Encode().GetFuncScript() 方法,从而提供一种全新的编码和解码电子邮件地址的算法。

新算法可能简单或者复杂,如你所想。 你喜欢的算法很简单,不要认为这是件坏事。 只要它不同,那么收集器就会更加混乱。

也许你想要做一个简单的改变,比如加速基数( 最初是种子) 中的更改速率。 简单地复制 NoSpamEmailHyperlink中描述的代码: 3。电子邮件编码和解码到你的导出控件中,但是你可以修改它。

例如:

publicclass NoSpamEmailHyperlinkEx : NoSpamEmailHyperlink
{
 protectedoverridestring GetFuncScript()
 {#if DEBUG// Formatted script text in debug version JavaScriptBuilder jsb = new JavaScriptBuilder(true);#else// Compress script text in release version JavaScriptBuilder jsb = new JavaScriptBuilder();#endif jsb.AddLine("function", FuncScriptName, "(link, seed)");
 jsb.OpenBlock(); // function() jsb.AddCommentLine("This is the decoding key for all",
 LinkArrayName, " objects");
 jsb.AddLine("var", CodeKeyName, " ="", CodeKey, "";");
 jsb.AddLine();
 jsb.AddCommentLine("Store the innerText so that it doesn't get");
 jsb.AddCommentLine("distorted when updating the href later");
 jsb.AddLine("var storeText = link.innerText;");
 jsb.AddLine();
 jsb.AddCommentLine("Initialize variables");
 jsb.AddLine("var baseNum = parseInt(seed);");
 jsb.AddLine("var atSym = link.href.indexOf("@");");
 jsb.AddLine("if (atSym == -1) atSym = 0;");
 jsb.AddLine("var dotidx = link.href.indexOf(".", atSym);");
 jsb.AddLine("if (dotidx == -1) dotidx = link.href.length;");
 jsb.AddLine("var scramble = link.href.substring(7, dotidx);");
 jsb.AddLine("var unscramble ="";");
 jsb.AddLine("var su = true;");
 jsb.AddLine();
 jsb.AddCommentLine("Go through the scrambled section of the address");
 jsb.AddLine("for (i=0; i <scramble.length; i++)");
 jsb.OpenBlock(); // for (i = 0; i <scramble.length; i++) jsb.AddCommentLine("Find each character in the scramble key string");
 jsb.AddLine("var ch = scramble.substring(i,i + 1);");
 jsb.AddLine("var idx =", CodeKeyName, ".indexOf(ch);");
 jsb.AddLine();
 jsb.AddCommentLine("If it isn't there then add the character");
 jsb.AddCommentLine("directly to the unscrambled email address");
 jsb.AddLine("if (idx <0)");
 jsb.OpenBlock(); // if (idx <0) jsb.AddLine("unscramble = unscramble + ch;");
 jsb.AddLine("continue;");
 jsb.CloseBlock(); // if (idx <0) jsb.AddLine();
 jsb.AddCommentLine("Decode the character");
 jsb.AddLine("idx -= (su? -baseNum : baseNum);");
 jsb.AddLine("baseNum -= (su? -Math.pow(i, 2) : Math.pow(i, 2));");
 jsb.AddLine("while (idx <0) idx +=", CodeKeyName, ".length;");
 jsb.AddLine("idx %=", CodeKeyName, ".length;");
 jsb.AddLine();
 jsb.AddCommentLine("... and add it to the unscrambled email address");
 jsb.AddLine("unscramble = unscramble +",
 CodeKeyName, ".substring(idx,idx + 1);");
 jsb.AddLine("su =!su;");
 jsb.CloseBlock(); // for (i = 0; i <scramble.length; i++) jsb.AddLine();
 jsb.AddCommentLine("Adjust the href property of the link");
 jsb.AddLine("var emAdd = unscramble +",
 "link.href.substring(dotidx, link.href.length + 1);");
 jsb.AddLine("link.href ="mailto:" + emAdd;");
 jsb.AddLine();
 jsb.AddCommentLine("If the scrambled email address is also in the text");
 jsb.AddCommentLine("of the hyperlink, replace it");
 jsb.AddLine("var findEm = storeText.indexOf(scramble);");
 jsb.AddLine("while (findEm> -1)");
 jsb.OpenBlock(); // while (findEm> -1) jsb.AddLine("storeText = storeText.substring(0, findEm) + emAdd",
 "+ storeText.substring(findEm + emAdd.length, storeText.length);");
 jsb.AddLine("findEm = storeText.indexOf(scramble);");
 jsb.CloseBlock(); // while (findEm> -1) jsb.AddLine();
 jsb.AddLine("link.innerText = storeText;");
 jsb.CloseBlock(); // function()return jsb.ToString();
 }
 protectedoverridestring Encode (string Unencoded)
 {
 // Convert string to char[] char[] scramble = Email.ToCharArray();
 // Initialize variablesint baseNum = ScrambleSeed;
 bool subtract = true;
 // Find the @ symbol and the following. // if either don't exist then we don't have a// valid email address and should return it unencodedint atSymbol = Array.IndexOf(scramble, '@');
 if (atSymbol == -1) atSymbol = 0;
 int stopAt = Array.IndexOf(scramble, '.', atSymbol);
 if (stopAt == -1) stopAt = scramble.Length;
 // Go through the section of the address to be scrambledfor (int i=0; i < stopAt; i++)
 {
 // Find each character in the scramble key stringchar ch = scramble[i];
 int idx = CodeKey.IndexOf(ch);
 // If it isn't there then ignore the characterif (idx <0) continue;
 // Encode the character idx += (subtract? -baseNum : baseNum);
 baseNum -= (subtract
? -(int)Math.Pow(i, 2) : (int)Math.Pow(i, 2));
 while (idx <0) idx += CodeKey.Length;
 idx %= CodeKey.Length;
 scramble[i] = CodeKey[idx];
 subtract =!subtract;
 }
 // Return the encoded stringreturnnewstring(scramble);
 }
}

只有突出显示的行已经更改,但这是对编码算法和一个额外JavaScript命令的大量更改。

结束语

这个主题的变化仅受你的想象力的限制。 可以使用多个键,可能是一个大写键,也可以使用一个 lowercase 键。 可能要替换下划线和连字符,用随机字母前缀以保持地址有效。

你可以模拟世界第二"一次性 pad"系统,通过"添加"的第一个字母到第一个字母,电子邮件地址的第二个字母。

你不需要把自己限制在替代算法上。 你可以反转电子邮件地址的用户和域段中的字符( 比如。 pdriley@santt.com 变成 yelirdp@ttnas.com) 或者使用更复杂的换位算法。

它实际上没有什么区别,那么增加他们自己的个人触摸对 NoSpamEmailHyperlink 来说更加痛苦。

让你的想象力狂野。


相关文章