Javascript 简单加密防止公布在网页上的邮箱被收集
2012-02-23 16:35 chris-shao 阅读(2618) 评论(5) 编辑 收藏 举报需求描述:
由于业务需求,很多企业网站都需要在自己网站上公布邮箱, 但是,却经常被一些自动的邮箱收集工具收集之后,受到垃圾邮件的困扰。
一般邮箱收集工具主要就是通过蜘蛛的方式,扫描网页,然后通过正则表达式获取邮箱地址,比如匹配:mailto, 或者 @ 符号,这样在网页中出现的<a href='mailto:xxxx@sss.com'>xxxx</a> 这样的邮箱都难逃脱被收集的厄运。有网站不得不将@符号替换为#号,然后再提醒用户自行替换。
技术方案:
首先考虑可以使用脚本来创建这样的链接:
<script>document.write('<a href="mailto:xxx@sss.com"></a>')</script>
然后只要对write中的内容稍作改动,即可轻松避免收集工具。
于是,改进如下:
这样,是不是就可以避免一部分工具呢?
然后再考虑复杂一些,这里加入一个简单的加密处理:
<script>
var s='amlioti:fn@osaaiansblotu.eocu.k';
var r='';
for(var i=0;i<s.length;i++,i++)
{
r=r+s.substring(i+1,i+2)+s.substring(i,i+1);
}
document.write('<a href="'+r+'"</a>');
</script>
仔细看一下很简单,无非就是把邮箱的字母位置进行颠倒,0和1颠倒,2和3颠倒……
然后为了让肉眼再无法辨识,使用script 的eval 方法,并且将这段脚本htmlEncoding
即变成:
如此一来,抓取工具就傻眼了。
附上生成处理脚本的C#代码:通过这个代码,就可以直接创建类似的脚本了 :
string r = "";
string lastchar = s.Length % 2 == 1 ? s[s.Length - 1].ToString() : "";
for (int i = 0; i < s.Length; i=i+2)
{
if(i<s.Length-1)
r = r + s.Substring(i+1 , 1) + s.Substring(i, 1);
}
r = r + lastchar;
string js = "var s='" + r + "';var r='';for(var i=0;i<s.length;i++,i++){r=r+s.substring(i+1,i+2)+s.substring(i,i+1)}document.write('<a href=\"'+r+'\">info@asianabsolute.co.uk</a>');";
Console.WriteLine(js);
Console.WriteLine(UrlEncode(js));
另外,将字符串保存为16进制显示的编码方法:
{
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str);
for (int i = 0; i < byStr.Length; i++)
{
sb.Append(@"%" + Convert.ToString(byStr[i], 16));
}
return (sb.ToString());
}
遗留问题:
这个方案是建立在收集工具未进行DOM检查的基础上的。如果收集工具在获取HTML 后又进行了页面脚本调用显示后,还是会在DOM中创建连接,这种情况下,就还是能够捕获了。
不过只要是破解的收益高于成本,应该是没有不能破解的加密的吧,所以,在做网站时,适当的使用这样的方式加密敏感信息,还是能够起一定作用的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库