繁体   English   中英

php用htmlentities()在源代码中混淆mailto

[英]php obfuscating mailto in source with htmlentities()

我试图在可在浏览器中正常运行的页面上显示电子邮件地址,但在代码中将其混淆,以希望至少使一些垃圾邮件程序忽略它们。

我有以下测试代码:

<?php
$email = "fake@test.com";
$mailto = "mailto:" . $email;
?>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<p>PHP: <a href="<?php echo htmlentities($mailto); ?>"><?php echo htmlentities($email); ?></a></p>
<p>&nbsp;</p>
<p>MANUAL: <a href="&#109;&#x61;&#105;&#108;&#116;&#x6f;&#58;&#102;&#x61;&#x6b;&#101;&#x40;&#x74;&#101;&#x73;&#x74;&#46;&#x63;&#111;&#x6d;">&#x66;&#97;&#107;&#x65;&#64;&#116;&#x65;&#x73;&#116;&#46;&#99;&#x6f;&#x6d;</a></p>
</body>
</html>

这两个链接在页面上看起来都可以正常工作,但是只有“手动”链接被编码。

我从php.net获得有关htmlentities如何工作的冲突信息。

http://php.net/manual/zh/function.htmlentities.php

该文档指出“具有HTML字符实体等效项的所有字符都将转换为这些实体”。 由于字母表中的所有字母都具有等效功能,因此我希望每个字符都可以转换。 但是在该页面上的示例中,它演示了基本字母没有被转换。

此外,当我在该页面上查看源代码时,似乎根本没有显示php代码。 我的期望是两个链接在代码中显示相同。 这是“查看源代码”的结果。

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<p>PHP: <a href="mailto:fake@test.com">fake@test.com</a></p>
<p>&nbsp;</p>
<p>MANUAL: <a href="&#109;&#x61;&#105;&#108;&#116;&#x6f;&#58;&#102;&#x61;&#x6b;&#101;&#x40;&#x74;&#101;&#x73;&#x74;&#46;&#x63;&#111;&#x6d;">&#x66;&#97;&#107;&#x65;&#64;&#116;&#x65;&#x73;&#116;&#46;&#99;&#x6f;&#x6d;</a></p>
</body>
</html>

因此,看来htmlentities()根本没有做任何事情。 甚至没有编码“ @”。

我应该添加一些标志吗? 有一个更好的方法吗? 如果我成功了,这甚至可以对抗机器人,还是我在浪费时间?

误解可能来自http://php.net/manual/en/function.htmlentities.php

除了htmlentities()之外,此函数在所有方面均与htmlspecialchars()相同,所有具有HTML字符实体等效项的字符都将转换为这些实体。

它的真正含义来自http://php.net/manual/en/function.htmlspecialchars.php

某些字符在HTML中具有特殊意义,如果要保留其含义,则应由HTML实体表示。

htmlspecialchars()编码为: &"'<>

print_r(get_html_translation_table(HTML_SPECIALCHARS));

htmlentities()编码更多字符,但是只能编码在HTML具有特殊意义的 字符 校验:

print_r(get_html_translation_table(HTML_ENTITIES));

您可能会看到类似这样的内容。 我在一个链接中检查了它,并按预期工作:

$result = preg_replace_callback('/./', function($m) {
                                           return '&#'.ord($m[0]).';';
                                       },
                                       'mailto:fake@test.com');

这会用&#替换字符串中的每个字符,然后是字符的ASCII值,然后是;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM