如何跟踪表单的请求路径


How to trace the request path of the form?

简单地说,我想跟踪$_POST的url请求路径。如果你有一个脚本在http://example.com/myscript.php我想只从http://example.com/myfrom.html接受请求,因为如果我从我的电脑上写一个表单,并把链接从网站(),他接受请求。我只是不想接受来自其他服务器的请求。这怎么可能?

不是试图跟踪请求的来源,而是更经常地通过使用表单生成随机值并将其存储在隐藏的输入字段中来处理。当您收到带有script.php的表单时,您验证表单提交的随机值是否与您存储在$_SESSION中的值匹配。这确保了访问用户必须先加载表单。

您的表单目前是。html,但您需要将其改为PHP脚本

form.php:

// Create a random token in $_SESSION
session_start();
$_SESSION['token'] = md5(time() . rand());
<input type='hidden' value='<?php echo $_SESSION['token']; ?>' name='token' />

script.php

// Verify a valid token was submitted
session_start();
if ($_POST['token'] !== $_SESSION['token']) {
  // invalid post
}

你可以看看$_SERVER['HTTP_REFERER'];,但这是可以伪造的。你想做的听起来像是防止CSRF。为了做到这一点,您在myform.html中包含一个唯一生成的键作为隐藏字段(必须是myform.php),并检查myscript.php是否正确的键。因此,您可以确定请求是否已通过您的表单提交。

如果您想阻止一些临时用户从别人的网站发布到您的网站,您可能可以检查$_SERVER['HTTP_REFERER']。在大多数请求中,浏览器会发送一个"引用者",在很多情况下,这是用户点击到那里的页面。不过,这绝对不是万无一失的——浏览器(或机器人)可以随意篡改它,有些浏览器(或此类浏览器的插件)会故意这样做。这些浏览器的用户通常都很注重隐私,你也没有那么特别。他们可能更愿意去其他地方,而不是为你禁用他们的隐私功能。

您可能需要设置会话变量以便发布,但这也是相当琐碎的。<img src="http://your.site/yourForm.php" width="1" height="1">将足以获得会话变量集。

一个隐藏的表单字段听起来可行,但我可以写一个脚本来获取您的表单,抓取隐藏字段,并将其插入到我的表单。它只有在与会话变量结合使用时才有用,该变量表示期望的ID…如果人们以某种方式使用后退按钮,那就会变得很奇怪。它也会失败,如果我代理请求(即:用户与我的服务器交谈,它从你请求一个表单(并获得一个会话ID),然后当用户发布到我的网站,我发布到你使用会话ID和隐藏的值,你发送给我)。解决这个问题的唯一方法是HTTPS,如果用户希望表单来自我而不是您,那么即使HTTPS也没用。

基本上,没有办法缺少上述内容的组合加上一个体面的CAPTCHA来防止其他网站发布到您的表单。即使这样也有它的弱点。你能做的最好的事情就是让它成为一种痛苦……这也会让你的一部分用户感到痛苦。最好的方法是确保接受post的脚本验证其内容,而不关心请求来自何处。