65.9K
CodeProject 正在变化。 阅读更多。
Home

发布无法抓取的文本的技巧

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (3投票s)

2015年4月16日

CPOL

3分钟阅读

viewsIcon

14128

介绍 TuringFonts,一种制作不可抓取和不可复制文本的方法

引言

将敏感信息(例如电子邮件地址、电话号码、个人信息等)发布到公共网站一直是一项复杂的任务,要么是因为搜索引擎通常会索引它们找到的一切(即使我们使用“nofollow”和“noindex”指令),要么是因为总有一些黑客愿意构建网络爬虫,其唯一目标是收集我们想要保护的精确信息。

在思考这个问题时(并且在观看《模仿游戏》之后),我提出了一种简单的解决方案,使文本对计算机可理解但对人类可读。

基本原理

在开发这个解决方案时,我考虑了两个事实

  • 搜索引擎和网络爬虫只关心页面的 HTML 代码。通常,它们不会考虑颜色、大小或字体。因此,即使文本不可读,如果我们将白色文本放在白色背景上,它仍然会被索引或抓取。
  • 在编写文本时(在网站或文字处理器中),我们可以使用任何想要的字体,而且字体非常灵活。例如,有些字体是符号字体,它们故意完全不可读,因为它们绘制的是图标或符号,而不是字母和数字。

这个想法很简单

  1. 首先,我们使用简单的替换密码(例如 ROT13)对要保护的文本进行编码。

    因此,例如,如果我们想发布我们的电子邮件,而不是编写 johndoe@awesome.com,我们将编写 wbuaqbr@njrfbzr.pbz。 这样,我们的电子邮件就可以免受搜索引擎和网络爬虫的保护,因为它们会错误地认为 wbuaqbr@njrfbzr.pbz 是我们的地址。

  2. 其次,我们将一种特殊的字体应用于该编码文本,该字体的字母已被打乱,以反转编码文本时进行的替换。

    因此,在我们的先前示例中,我们应该使用一种在遇到 'w' 时绘制 'j'、在遇到 'b' 时绘制 'o'、在遇到 'u' 时绘制 'e' 等的字体。 这样,电子邮件地址对人类来说将清晰可读,但对计算机来说将不可读,因为它们不会考虑使用的字体。

    请注意,此技术不仅限于网页,它也可以用于 PDF 文件(因为 PDF 文件可以嵌入其中使用的字体),并且它也使文本不可复制(至少在使用剪贴板时)。

Using the Code

为了简化此技术的使用,我在 GitHub 上创建了一个项目,名为 TuringFonts,您可以在其中使用 在线编码器 使用简单的替换密码对文本进行编码,并且可以在 下载一些字体 以“解码”编码文本。

假设您想使用 ROT13 对文本进行编码,并且要将其发布到您的网站。

首先,您必须在 CSS 文件中声明将用于解码文本的字体。

@font-face {
    font-family: 'arial_rot13';
    src: url('fonts/arial/arial_rot13.eot');
    src: url('fonts/arial/arial_rot13.eot?#iefix') format('embedded-opentype'),
        url('fonts/arial/arial_rot13.woff2') format('woff2'),
        url('fonts/arial/arial_rot13.woff') format('woff'),
        url('fonts/arial/arial_rot13.ttf') format('truetype'),
        url('fonts/arial/arial_rot13.svg#arialregular') format('svg');
    font-weight: normal;
    font-style: normal;
}

然后,您将此字体应用于编码文本。

<h2>Encoded text (illegible for both humans and computers)</h2>
<p style="font-family: Arial">Hlnv hvmhrgrev gvcg gszg lmob sfnzmh nfhg yv zyov gl ivzw</p>
<h2>Decoded text (illegible only for computers, readable for humans)</h2>
<p style="font-family: arial_rot13">Hlnv hvmhrgrev gvcg gszg lmob sfnzmh nfhg yv zyov gl ivzw</p>

就这样。它简单、容易且有效。

您可以在 JSFiddle 上查看此示例

© . All rights reserved.