PHP页面作为一个函数/过程模块


PHP page as a function/process module

首先,这是我在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模块,而不必让它像页面一样工作。

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

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

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

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

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

if($_POST) {include '../login-handler.php'; die();}