为了账号安全,请及时绑定邮箱和手机立即绑定

SEO:Html注入和Nofollow的用处

标签:
Html/CSS

黑帽(black hat)SEO主要是指采取“不怎么道德”(暂时就这么形容吧!)的方式进行搜索引擎优化。


1. 注入攻击,包括Sql注入和Html注入。我经常能看到对Sql注入防范的谈论,但对于Html注入,很多人并没有引起足够的重视。为了展示Html注入的效果,我们模仿了一个常见的留言本功能。
首先,在页面声明中添加两个属性设置EnableEventValidation="false" ValidateRequest="false" ,这很关键,读者可以试一下如果不这样设置会有什么效果。

然后,前台页面和后台代码段分别如下:

 protected void btnSubmit_Click(object sender, EventArgs e)

    {

        this.lblShow.Text = this.txtInput.Text;

    }

程序很简单,将用户输入的内容再显示出来而已。运行代码,然后输入我们的恶意代码,提交。

<p>Sanitizing <img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original=""INVALID-IMAGE" onerror='location.href="http://xxx/"'>!</p>


我们会发现页面自动跳转到http://xxx/页面!这就是所谓的“Html注入”。当page页面render到客户端后,浏览器会按一个普通的html页面进行解析;当解析到上面的js代码时……


为了避免这种入侵,在asp.net中,我们最简单的处理方式就是对输入的内容进行“Html编码”。将后台代码改为:

    protected void btnSubmit_Click(object sender, EventArgs e)

    {

        this.lblShow.Text = this.Server.HtmlEncode(this.txtInput.Text);

    }

现在我们再运行代码,发现源代码被原样输出显示在页面,并没有运行。为什么呢?查看输出页面的源代码:

   <span id="lblShow">&lt;p&gt;Sanitizing &lt;img src=&quot;&quot;INVALID-IMAGE&quot; onerror='location.href=&quot;http://xxx/&quot;'&gt;!&lt;/p&gt;</span>

整理后,我们发现如下的映射转换:

<  --  &lt;  (less than)

>  --  &gt;  (greater than)

"  --  &quot;   (quota)

所以js无法执行,但在页面显示时,我们确能看到“原汁原味”的js内容。


但问题并没有结束,现实世界中,输入的内容除了恶意代码以外,还可能有如下的内容:

<span style=" color:blue">黑帽</span>(black hat)SEO主要是指采取<span style=" color:blue">“不怎么道德”</span>(暂时就这么形容吧!)的方式进行搜索引擎优化。


我们希望显示蓝色的文字,但经过编码后,显然无法达到我们的效果。为此,我们还需要进行更精确的过滤。这也是为什么之前我们要设置EnableEventValidation="false" ValidateRequest="false"的现实原因。

其实我最先想到的方案是:首先对整个内容进行编码,然后把我们允许使用的html标签再替换回来。这样是相当保险的,但是在具体的操作中,遇到了很多问题,这个郁闷啊~~~(如果有谁有这种方式的实现代码,千万要拿出来大家分享一下呀)。

我先介绍另一种方案:

首先要取出标签,如,<span style=" color:blue">、</span>和<script  >,我们的替换范围仅局限于标签 < > 之间的内容。

然后获取所有的标签名称、属性的名称和值,如果有禁止出现的内容,就替换掉。可能的恶意代码形式如下所示:

标签的名称: <script  </script               

标签里的属性:<span onclick

属性的值:<img onerror="javascript:"

最后,我们对所有的“恶意单词”进行替换:

代码

注意代码中两处正则表达式的高级用法,贪婪模式和正向预查,详细可参考贪婪模式和正向预查

这里我们就可以看到正则表达式说起到的强大作用——操作字符串的无上利器啊!


2. 除了注入攻击,另一种必须使用的技术是nofollow。因为Google的链接价值算法,我们都希望能有高价值的链接能指向我们的网站,以提高我们网站的等级。一种简单的方式就是到其他网站(如新浪)申请一个博客,然后在博客里添加一条链接,指向自己的网站即可。但如果我们自己是新浪,我们当然不愿意有其他人这样做(毕竟我们不知道其他人链接指向的网站究竟是好是坏,如果是一个垃圾网站,会牵连到我们自己的)。但是呢,我们也不愿意完全禁止掉链接的使用(比如简单的对链接进行编码,让链接失去作用),因为毕竟很多链接或许只是内部链接,而且一个能直接点击的链接能带来更好的用户体验。

为了解决这个问题,Google给出了一个方法,在链接中加上关键字nofollow,如下所示:

<a rel="nofollow" href="xxx">cool link</a>

这样,链接能直接点击,但不会带来链接价值——即Google不会认为你认可或推荐了该链接指向的网站。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消