我有一个html表单,当它被提交时,它调用一个JavaScript函数,通过使用Ajax从一个PHP文件中使用post获取信息并将其显示回页面。
问题是,是否可以在使用上述方法时使PHP文件可访问,而不是用户能够直接访问它,如果他们通过JS方法并找到它的位置?
编辑:添加更多信息以帮助人们。 Ajax正在调用外部php文件,以便根据php文件返回的内容更新网站内容。由于所有的Ajax调用都是在JavaScript中进行的,所以有人可以很容易地找到函数正在使用的位置和参数,并且基本上直接调用php文件,这就是我想要避免的。
在这种情况下使用PHP会话有点困难,因为我使用Ajax一旦外部PHP文件完成就无法破坏会话,因为如果我执行会话永远不会更新因为我正在使用Ajax来更新没有刷新网站的内容。
答案 0 :(得分:3)
我同意limscoder。
以下是我在提交表单时如何使用令牌。
1)初始化它并将其保存在服务器上(当在客户端加载页面时)
$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));
2)将其添加到表格
<input type="hidden" name="token" value="<?php echo $token;?>" />
3)提交时我使用
检查令牌if(isset($_SESSION['token'], $_POST['token']) && $_SESSION['token'] == $_POST['token'])
{
//code goes here
}
答案 1 :(得分:2)
听起来你正在描述一种cross site request forgery。防止这种情况的正常方法是将服务器生成的令牌包含为表单值,然后在提交表单时根据存储在用户会话中的值对其进行验证。查看链接以获取有关如何正确生成和验证令牌的说明。
答案 2 :(得分:0)
您可以通过检查HTTP_REFERER(http://php.net/manual/en/reserved.variables.server.php)来测试哪个页面称为您的脚本
但是......它可能是欺骗性的,因此只会阻止偶然尝试获取您的数据
答案 3 :(得分:0)
html页面是否受到保护?如果任何人都可以访问html页面来调用你的ajax页面,为什么还要花时间去尝试保护它。 :)
但是,如果您确实需要这样做,则可能需要将html页面转换为php页面,以便您可以生成要放置在表单中的令牌。一个好的标记是附加年,月,日和小时的秘密字符串。当令牌被发回时,使用相同的方式生成测试令牌并比较两者。这使得令牌仅在1小时内有效。当然,在ajax中,你可能需要针对最后一小时的令牌进行测试,以防用户在一小时的最后一刻获得表格并在一小时后提交。
编辑--- 如果您主要关注的是机器人,那么只需使用验证码测试。