簡體   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