2

首先,这是我在 Stack Overflow 上的第一篇文章,我正在尝试为我正在从事的个人项目学习 PHP/MySql。我想我会花很多时间在这里问一堆问题,所以如果我问了太多你可能觉得微不足道的问题,请原谅我。

继续这个问题。

我正在使用 ajax 和 PHP 的组合来处理服务器端脚本。我想要做的是有一个 PHP 模块,它将接受输入、处理某些内容并提供输出。很像一个函数。

我想弄清楚的是如何使 PHP 像一个黑盒进程模块,像一个函数,而不是一个页面。

例如,我有一个 login.html 页面,它使用 AJAX 向 login.php 页面发送请求。login.php 接受输入,处理输入,并输出一个 json 对象,该对象告诉调用页面是否成功,如果不成功,将列出它在此过程中遇到的错误。

问题就在这里。我不希望用户能够直接访问 login.php。事实上,我什至不希望 login.php 对公众可见。login.php只是一个进程,所以如果你去它,它将是空白的。让用户看到空白页似乎不是一个好习惯。

我考虑将 login.php 放在公用文件夹之外,但这意味着 ajax 也无法向它发出请求。

为了解决这个问题,我将 login.html 放在 login.php 中。它将向自己发出请求,然后根据请求的类型,php 将执行不同的操作。这将解决“空白页”问题。但我不禁想知道是否有一种方法可以制作一个独立的 PHP 模块,而不必让它像页面一样工作。

对此的任何想法将不胜感激。谢谢。

4

2 回答 2

1

根据 AJAX 的性质,您发送 AJAX 请求的任何内容也可以直接导航到。您所能做的就是不向用户提供该页面存在的任何指示。

您可以选择通过include让一个 PHP 文件调用另一个文件。这样,您可以请求 login.php 根据请求更改行为,但登录处理实际上由不可公开访问的文件处理:

if($_POST) {include '../login-handler.php'; die();}
于 2012-07-27T00:42:44.177 回答
1

如果 AJAX 可以请求该页面,那么任何用户都可以使用他们的浏览器导航到该页面。你真的不应该关心这个,因为除非他们窥探,否则他们不会发生在 PHP 页面上。如果你想要一点点验证请求是由 AJAX 发出的,你可以查找X-Requested-Withheader,但这并不总是有效,因为每个浏览器都不会发送这个:

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    // Ajax Request
} else {
    // Not AJAX, redirect to login page
    header('Location: login.html');
    exit();
}

为了使这项工作在每个浏览器上可靠地工作,您需要在客户端设置此标头:

xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");

然而,这仍然不是完全证明,因为任何人都可以使用 Tamperdata 之类的程序发送标头,但这应该足以防止懒惰的窥探。不过,再次允许用户查看此页面(如果他们窥探)不会是一个大问题。它不会造成安全漏洞,如果用户偶然发现该login.php页面,他们将被重定向回login.html.

于 2012-07-27T00:39:11.100 回答