Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不允许直接访问PHP文件_Php_Javascript_Ajax - Fatal编程技术网

不允许直接访问PHP文件

不允许直接访问PHP文件,php,javascript,ajax,Php,Javascript,Ajax,我有一个html表单,当它被提交时,它调用一个JavaScript函数,该函数使用Ajax从PHP文件中使用post获取信息,并将其显示回页面 问题是,如果用户通过JS方法找到PHP文件的位置,是否可以使PHP文件仅在使用上述方法时才可访问,而不是直接访问它 编辑:添加更多信息以帮助人们摆脱困境。Ajax调用外部php文件,以便根据php文件返回的内容更新网站内容。由于所有Ajax调用都是在JavaScript中进行的,因此有人可以很容易地找到函数使用的位置和参数,基本上直接调用php文件,这正

我有一个html表单,当它被提交时,它调用一个JavaScript函数,该函数使用Ajax从PHP文件中使用post获取信息,并将其显示回页面

问题是,如果用户通过JS方法找到PHP文件的位置,是否可以使PHP文件仅在使用上述方法时才可访问,而不是直接访问它

编辑:添加更多信息以帮助人们摆脱困境。Ajax调用外部php文件,以便根据php文件返回的内容更新网站内容。由于所有Ajax调用都是在JavaScript中进行的,因此有人可以很容易地找到函数使用的位置和参数,基本上直接调用php文件,这正是我试图避免的


在这种情况下,使用PHP会话有点困难,因为我使用的是Ajax,一旦外部PHP文件完成,我就无法销毁会话,因为如果我这样做,会话将永远不会更新,因为我使用Ajax更新网站内容而不刷新它。

您可以通过检查HTTP\u REFERER来测试什么页面称为脚本(http://php.net/manual/en/reserved.variables.server.php)


但是…它可能会被欺骗,因此只会阻止随意获取数据的尝试

您可以通过检查HTTP\u REFERER来测试哪个页面称为您的脚本(http://php.net/manual/en/reserved.variables.server.php)


但是…它可能会被欺骗,因此只会阻止偶然尝试获取您的数据。

听起来您在描述一种类型的。防止这种情况的正常方法是将服务器生成的令牌作为表单值,然后在提交表单时根据存储在用户会话中的值对其进行验证。请查看链接获取有关如何正确生成和验证令牌的说明。

听起来像是在描述一种类型的令牌。防止这种情况发生的正常方法是将服务器生成的令牌作为表单值,然后在提交表单时根据存储在用户会话中的值对其进行验证。有关h的说明,请查看链接如何正确生成和验证令牌。

html页面是否受保护?如果有人可以访问html页面调用ajax页面,为什么还要费心花时间来保护它呢

但是,如果确实需要这样做,则可能需要将html页面转换为php页面,以便生成要放置在表单中的令牌。一个好的代币应该是一个秘密字符串的sha,它附加了年、月、日和小时。当令牌被发回时,使用相同的方法生成测试令牌并比较两者。这使得令牌仅在1小时内有效。当然,在ajax中,您可能需要针对最后一个小时的令牌进行测试,以防用户在最后一分钟获得表单并在一小时后提交

编辑---
如果您主要关注的是机器人,那么只需使用验证码测试。

html页面安全吗?如果有人可以访问html页面来调用ajax页面,为什么还要费心花时间来保护它呢

但是,如果确实需要这样做,则可能需要将html页面转换为php页面,以便生成要放置在表单中的令牌。一个好的代币应该是一个秘密字符串的sha,它附加了年、月、日和小时。当令牌被发回时,使用相同的方法生成测试令牌并比较两者。这使得令牌仅在1小时内有效。当然,在ajax中,您可能需要针对最后一个小时的令牌进行测试,以防用户在最后一分钟获得表单并在一小时后提交

编辑---
如果你主要关心的是机器人,那么就使用验证码测试。

我同意limscoder的观点

下面是我如何在提交表单时使用令牌

1) 初始化它并将其保存在服务器上(在客户端加载页面时)

2) 将其添加到表单中

<input type="hidden" name="token" value="<?php echo $token;?>" />

我同意林斯科德的观点

下面是我如何在提交表单时使用令牌

1) 初始化它并将其保存在服务器上(在客户端加载页面时)

2) 将其添加到表单中

<input type="hidden" name="token" value="<?php echo $token;?>" />

不。服务器不会知道区别,除非您仅在登录会话后调用它,并在开始时使用PHP的
session\u start()
。使用PHP会话或其他东西难道不可能让它变得更难吗?我不希望它完全是傻瓜式的,只是需要一个额外的保护层。我想你可以检查用户代理。但说真的,这并没有让事情变得更难。(正如其他人所说:不可能)大多数人提到使用php会话,只是不确定使用上述方法是否可行。用户代理可以很容易地更改,所以我不想这样做。使用随机变量的会话听起来更好,因为它会迫使人们通过源代码查找随机生成的部分以添加到url。@denied66,实际上您不需要随机变量。只需要有一个登录页面来验证用户并启动会话。然后在您想要保护的页面上,执行一个
会话\u start()
并查看它们是否已登录(通过检查您在
$\u会话
数组中设置的一些值)。如果该值存在,则它们已登录,您可以执行。否则,结束脚本。否。服务器不会知道区别,除非您仅在登录会话后调用它,并在开始时使用PHP的
session\u start()
。使用PHP会话或其他东西难道不可能让它变得更难吗?我不希望它完全是傻瓜式的,只是需要一个额外的保护层。我想你可以检查用户代理。但说真的,这并没有让事情变得更难。(正如其他人所说:不可能)大多数人提到使用php会话,只是不确定使用上述方法是否可行。用户代理可以很容易地更改,所以我不想这样做。使用随机变量的会话听起来更好,因为它会迫使人们通过源代码查找
if(isset($_SESSION['token'], $_POST['token']) && $_SESSION['token'] == $_POST['token'])
{
//code goes here
}