【问题标题】:Prevent PHP form sending with direct access, allow with AJAX防止通过直接访问发送 PHP 表单,允许使用 AJAX
【发布时间】:2012-06-04 15:23:17
【问题描述】:

我有一个脚本,每次有人通过 Facebook 评论框访问时都会触发一封电子邮件。 Fb.event.subscribe 在我的服务器上触发对 mail.php 的 ajax 调用,它会向我的电子邮件地址发送一封电子邮件以通知新评论。我如何使这更安全并直接阻止对 mail.php 的访问?

        FB.Event.subscribe('comment.create', function (response) {
            var domain = "<?= $_SERVER['SERVER_NAME']; ?>";
            var url = "<?= $currentUrl ?>";
                alert("comment added");

                            var xmlhttp;
                            if (window.XMLHttpRequest)
                              {// code for IE7+, Firefox, Chrome, Opera, Safari
                              xmlhttp=new XMLHttpRequest();
                              }
                            else
                              {// code for IE6, IE5
                              xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                              }

                            xmlhttp.open("GET","http://" + domain + "/mail.php?url=" + url,true);
                            xmlhttp.send();

        });


** ---------- here is mail.php -------- **



<?php 
    $to = "MY EMAIL HERE";
    $subject = "New Comment Added";
    $message = "New Comment posted here: " . $_GET['url'] ;
    $from = "MY EMAIL HERE";
    $headers = "From:" . $from;
    //mail($to,$subject,$message,$headers);
    //echo  $_GET['accesstoken'] ;
?>

【问题讨论】:

    标签: php javascript ajax


    【解决方案1】:

    你不能这样做。如果您允许客户端使用客户端代码访问mail.php,那么任何人都可以使用脚本访问它。您可以尽可能多地混淆它,但如果有人真的想知道如何访问它,他们会的。

    编辑:基本规则是,如果它可以由人在浏览器中完成,那么它可以由计算机在脚本中完成。该规则唯一的半对立点是 CAPTCHA,但如今即使是这些也可以规避。

    【讨论】:

    • 嗯..有什么建议吗?
    • 是的。您可以使用 PHP 访问您的 cmets 的图形 API,graph.facebook.com/comments/?ids=<your_url> 解析其中的 JSON 并找出您尚未处理的任何新 cmets。由于一切都发生在服务器端,因此您不会遇到垃圾邮件问题。
    【解决方案2】:

    您可以像这样在 php 脚本中添加标头检查:

    <?php
      if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        //send email
      }
    ?>
    

    【讨论】:

    • 这可能不是一个完美或“适当”的解决方案,但我认为它会减少您应用中的少量洪水。
    • 只是一个额外的措施。但最好的办法是添加某种权限,这样不是每个人都可以访问 email.php
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2011-02-10
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多