PHP的网站安全问题? (也可能适用于ASP / Rails /等..)

时间:2009-06-10 14:55:34

标签: php javascript ajax

说,我有“index.htm”和“routines.php”。

“index.htm”将使用JS(AJAX)调用最终调用“routines.php”。

所以,我的问题是,“routines.php”如何验证请求来自同一本地服务器而不是外部?是否有可以在PHP级别或HTTP级别检查的全局变量?

编辑1:使用AJAX

6 个答案:

答案 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']

通过这个,您可以知道请求是否来自您想要的服务器。