说,我有“index.htm”和“routines.php”。
“index.htm”将使用JS(AJAX)调用最终调用“routines.php”。
所以,我的问题是,“routines.php”如何验证请求来自同一本地服务器而不是外部?是否有可以在PHP级别或HTTP级别检查的全局变量?
编辑1:使用AJAX
答案 0 :(得分:3)
你可能会忘记Ajax部分,因为它不是问题的真正部分。您应该阅读有关跨站点请求伪造(CSRF)和CSRF令牌的信息。一些链接:
答案 1 :(得分:2)
用另一个问题回答你的问题:你将如何使用浏览器调用getdata()?
(所以:不用担心。)
答案 2 :(得分:1)
如果调用是在JavaScript中进行的(即在客户端上),即使您检查Referer
(sic),您也无法做任何事情来绝对阻止某人模拟来自index.htm的请求。 )标题。
如果请求是在服务器端进行的,则可以使用某种密钥。
您当然也可以在客户端生成密钥,但任何人都可以模仿此安全措施来模拟来自index.htm的请求。
答案 3 :(得分:1)
您可以使用会话密钥:
的index.htm
<?php
$_SESSION['safe_key'] = true;
?>
javascript code here
routines.php
<?php
if (!isset($_SESSION['safe_key'])) {
die('from outside');
}
function getdata() { ... }
?>
基本上,当调用index.htm时会发生会话安全密钥。会话仅限服务器端。在routines.php中,如果安全密钥不存在,则不会从index.htm调用代码。如果确实存在,请运行代码。
答案 4 :(得分:0)
正如其他人指出的那样,鉴于您的原始规格,这将非常困难。但是,如果您可以将index.htm
更改为index.php
并输出与index.htm
相同的内容,您还可以为会话管理添加其他令牌(例如Cookie - 是的我知道它们也很容易欺骗:)如果令牌不匹配,则拒绝拨打getdata()
。
答案 5 :(得分:-2)
使用HTTP_REFERER服务器变量:
echo $_SERVER['HTTP_REFERER']
通过这个,您可以知道请求是否来自您想要的服务器。