【问题标题】:Including external php files and using functions from them?包括外部 php 文件并使用其中的函数?
【发布时间】:2011-09-12 02:56:07
【问题描述】:

我正在尝试在我正在构建的可安装网络应用程序中实现一个尽可能简单的许可系统(用户下载并上传到他们的服务器)。在得知无法跨域设置会话(这是我的第一选择)之后,我现在考虑在我的服务器上包含一个外部文件,其中包含一个名为 validate() 的函数,用于验证许可证是否存在于我的数据库。

事件流程: 用户在他的网站上输入许可证密钥 -> 许可证密钥发布到文件 /validate.php,其中包含我服务器中的文件 -> 服务器检查是否包含许可证密钥在数据库中 -> 如果是,则在用户域上设置会话并重定向到管理部分 -> 如果否,则重定向回登录页面,并显示错误消息。

这是我的代码(理论上 - 可能有问题):

validate.php

include("http://www.example.com/function.php");
validate($_POST['license']);

function.php

include("db_conn.php");

function validate($license)(
$conn = mysql_connect($db_host, $db_user, $db_pass); mysql_select_db($db_name);

$license = mysql_real_escape_string($license);

$query = "SELECT FROM licenses WHERE license = '$license'";
$result = mysql_query($query);

if(mysql_num_rows($result) == 1) {
    mysql_close($conn);
    session_set_cookie_params(60*60*24*30,"/","." . $_SERVER['SERVER_NAME']);
    session_start();
    $_SESSION['license_valid'] == "YES";
    header("Location:" . $_SERVER['SERVER_NAME'] . "/admin");
} else {
    mysql_close($conn);
    header("Location" . $_SERVER['SERVER_NAME'] . "/login/?error=1");
}
);

问题是,我不确定服务器将如何处理函数validate(),例如,会话是设置在我的服务器上还是用户的服务器上?它会使用我的$_SERVER['SERVER_NAME'] 还是用户的?它会包含来自我的服务器还是用户的db_conn.php

【问题讨论】:

  • 你想从文件系统中包含,否则当通过 http 包含时你会得到 php 解析的文件
  • @Dagon:你能说得更具体一点吗?你的意思是这样的东西在外部包含时不会起作用?

标签: php function include


【解决方案1】:

您的预计流量:
用户在他的网站上输入许可证密钥(发生在他的服务器上)
许可证密钥发布到文件 /validate.php ... (发生在他的服务器上)
...其中包括来自我的服务器的文件(不起作用)

您的实际流量将是:
用户在他的网站上输入许可证密钥(发生在他的服务器上)
许可证密钥发布到文件 yoursite.com/validate.php ... (发生在他的服务器上)
... 在您的服务器上运行脚本。

您的服务器会检查数据库中是否包含许可证密钥。

如果是,请在您的服务器上为该用户设置会话,并重定向到您服务器上的管理部分。
如果否,则重定向到您服务器上的登录页面,并显示错误消息。


设置它的正确方法是在您的服务器上有一个文件,该文件采用许可证密钥的 URL 参数,检查它是否有效,然后输出一些内容来表明它是否有效。

validate.php(在您的服务器上)

<?php
session_start();

$key = $_POST['license_key'];
// Please clean this variable, obvious SQL injection, blah blah

include('function.php'); // From your server, contains the validate() function
if (validate($key))
{
    // Log them in on your server
    $_SESSION['license_key'] = $key;
}
else
{
    // Say error and show the login form from your server
}

现在另一台服务器上的某人可以将其&lt;form&gt; 上的action 设置为http://yourserver.com/validate.php,您的服务器将从那里接管。


当您包含脚本时,included 脚本中的所有变量都将像内联一样在 included 脚本中运行。

基本上,想象一下所有代码都在validate.php 中,它会像原来一样运行。

这里有一个需要注意的问题 - 如果function.phpvalidate.php 位于不同的目录中,则validate.php 内的include 要求db_conn.php 将失败 - 您需要更改此页面以匹配 包括 文件中的路径。

【讨论】:

  • 啊,所以我想我应该将数据库连接详细信息包括更改为include("http://www.example.com/db_conn.php");。这样做有任何潜在的安全问题吗? (这些是我的数据库的凭据)。
  • 这行不通。如果您以绝对路径 (http...) 访问它,它将解析 PHP,然后将脚本的输出发送到 include 函数 - 这将是空的。您必须改用相对路径(例如path/from/here/to/db_conn.php/path/from/root/to/db_conn.php)。我建议从根目录开始的路径,然后不管哪个文件包含它,它总是从一个已知的地方到一个已知的地方,在一个已知的路径上,所以总是可以工作的(除非你改变一个文件夹名字,显然)。
  • 在您的回答中,在休息之前,您似乎在说它将使用用户的服务器(validate.php 所在的位置),而在休息之后,好像它会使用我的?
  • @Pixelatron - 它将是执行“包含”的服务器。你的问题在哪里是模棱两可的。此外,包含来自另一台服务器的数据库连接脚本不会神奇地让您访问数据库本身。
  • @乔。你的答案是我的第三个选择,信不信由你:)。最终的想法是,如果许可证有效,则在其服务器上为用户设置会话。我有点想,如果我有一个包含类似pastebin.com/ThFSq6EG 的文件,那么用户可能更容易发布“有效”并激活他们自己的会话。猜猜我必须找到一个体面的 PHP 混淆服务。感谢您的帮助和清理是什么:)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2019-08-09
  • 2019-02-10
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多