首页 > 解决方案 > 如何在我的垃圾邮件蜜罐中执行 PHP

问题描述

我想在我的网站上放置一个蜜罐,以阻止垃圾邮件机器人填写我的表格。

我发现这个答案似乎很有用。它建议在您的页面上包含一个不可见的复选框:

<input
  type="checkbox"
  name="contact_me_by_fax_only"
  value="1"
  style="display:none !important"
  tabindex="-1"
  autocomplete="off"
>

但是,建议 PHP 测试复选框是否已被选中:

$honeypot = FALSE;
if (!empty($_REQUEST['contact_me_by_fax_only']) && (bool) 
$_REQUEST['contact_me_by_fax_only'] == TRUE) {
    $honeypot = TRUE;
    log_spambot($_REQUEST);
    # treat as spambot
} else {
    # process as normal
}

我以前没有使用太多 PHP。我的问题:

  1. 我可以把这个 PHP 和周围的<?php ?>标签放在我的 html 代码中吗?
  2. 如果是这样,我把 PHP 放在哪里有关系吗?它必须在表格之后(例如)吗?
  3. 在 PHP 部分说#process as normal,我需要在这里放什么吗?
  4. 还是我应该将 PHP 放在我创建的 post.php 文件中以发布我的表单?

如果有帮助,我的 html 代码的表单部分:

<form action="post.php" method="post">
   </br>
   <label for="email"></label>
   <input type="email" placeholder="Enter your email address..."
             name="email" required>
    <button type="submit" class="signupbtn">Sign Up</button>
    <input type="checkbox" name="contact_me_by_fax_only"
      value="1" style="display:none !important" tabindex="-1" autocomplete="off">
</form>

我正在尝试遵循这个答案。我仍然不确定一切应该去哪里。我不明白我什么时候告诉代码当它是人类响应时去做我希望它提交表单,但我不知道它如何与 php.ini 结合在一起。

<html>

  <head>

    <title>Page Title</title>
    <link href="https://fonts.googleapis.com/css?family=Quicksand"
          rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="style.css">
    <link rel="shortcut icon" href="fav.ico" >
    <meta name="description" content="">
  </head>

  <body>

    <div class="home_pic">
      <img border="0" style="border-color: black" src="pic1.png"
           height="700px">
    </div>
    <div class="home_text">
        Some words for the website
    </div>

    <?php
    if (isset($_REQUEST['contact_me_by_fax_only']) && (bool)
    $_REQUEST['contact_me_by_fax_only'] == TRUE) {
       $honeypot = TRUE;
       log_spambot($_REQUEST);
       // treat as spambot  -- I don't need it to *do* anything if spambot
    ?>

    <?php
        exit();  // all done if a spambot
    } else {
        // process as normal -- here we will use a function, note that in PHP
        // scope rules will hide most global variables from the function!
        process_human_response();
    }
    function process_human_response()
    {

    <!--DOES THE FORM GO IN HERE NOW?-->

    <form action="post.php" method="post">
          </br>SIGN UP:
          <label for="email"></label>
          <input type="email" placeholder="Enter your email address..."
                 name="email" required>
          <button type="submit" class="signupbtn">Sign Up</button>
          <input type="checkbox" name="contact_me_by_fax_only"
          value="1" style="display:none !important" tabindex="-1" autocomplete="off">
    </form>

    ?>

  </body>

</html>

对不起,我很困惑。

标签: phphtmlforms

解决方案


更好的蜜罐实施(表单反垃圾邮件)的公认答案中

那是您的表单提交到的处理页面的 PHP。

从 Nicholas Summers 的帖子中复制代码,我将添加一些示例 HTML 来澄清它。

<?php
$honeypot = FALSE;
if (!empty($_REQUEST['contact_me_by_fax_only']) && (bool) 
$_REQUEST['contact_me_by_fax_only'] == TRUE) {
    $honeypot = TRUE;
    log_spambot($_REQUEST);
    // treat as spambot  -- here we will place the HTML "inline"
?>
<html>
<body>
<p>Tasty spam, thanks!</p>
</body>
</html>
<?php
    exit();  // all done if a spambot
} else {
    // process as normal -- here we will use a function, note that in PHP
    // scope rules will hide most global variables from the function!
    process_human_response();
}

function process_human_response()
{
   //... get data from $_REQUEST
   //... process data
?>
<html>
<body>
<p>Thank you good human!</p>
</body>
</html> 

这表明将您的代码和 HTML“内联”放置在第一种情况(垃圾邮件)的全局级别,并在人类函数中显示另一种方式。


正如所指出的,如果您不复制任何共享 HTML,代码通常更短且更易于维护,如下所示:

共享页面开头:

<html>
<head> <!-- and shared CSS, JS files here --> </head>
<body>

一些 PHP 逻辑来确定它是否是垃圾邮件机器人

<?php
if (isset($_REQUEST['contact_me_by_fax_only']) && (bool) 
$_REQUEST['contact_me_by_fax_only'] == TRUE) {
    $honeypot = TRUE;
    log_spambot($_REQUEST);
    // treat as spambot  -- here we will place the HTML "inline"
?>

包含垃圾邮件机器人的响应 HTML,“内联”完成。因为这是 PHP 代码的“if”情况,所以只有当 if 测试为真(= spambot)时,才会将这个 HTML 发送到浏览器

<p>Tasty spam, thanks!</p>

继续为if案例编写 PHP 代码,然后切换到else案例。

<?php
    exit();  // all done if a spambot
} else {
    // process as normal -- here we will use a function, note that in PHP
    // scope rules will hide most global variables from the function!
    process_human_response();
}
?>

页面末尾的共享 HTML

</body>
</html>

调用即将处理人类响应的函数

function process_human_response()
{
   //... get data from $_REQUEST
   //... process data
?>

此 HTML 在函数内部,因此仅在调用此函数时才发送

<p>Thank you good human!</p>

完成功能

<?php
}
?>

推荐阅读