我正在尝试在我正在构建的可安装的Web应用程序中实现尽可能简单的许可系统(用户下载并上传到他们的服务器)。在得知会话无法跨域设置(这是我的第一选择)之后,我现在考虑在我的服务器上包含一个外部文件,其中包含一个名为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
或用户的?{/ p>
答案 0 :(得分:1)
您的预计流量:
用户在其网站上输入许可证密钥(发生在他的服务器上)
许可证密钥发布到文件/validate.php ... (发生在他的服务器上)
...包含来自我的服务器的文件(不起作用)
您的实际流量将是:
用户在其网站上输入许可证密钥(发生在他的服务器上)
许可证密钥已发布到文件yoursite.com/validate.php ... (发生在他的服务器上)
...在您的服务器上运行脚本。
您的服务器会检查数据库中是否包含许可证密钥。
如果是,请在您的服务器上为该用户设置会话,然后重定向到您服务器上的admin部分 如果不是,请重定向到服务器上的登录页面,并显示错误消息。
设置它的正确方法是在服务器上放置一个文件,该文件采用许可证密钥的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
}
现在,另一台服务器上的某人可以将action
上的<form>
设置为http://yourserver.com/validate.php
,您的服务器将从那里接管。
当您添加脚本时,包含脚本中的所有变量都将在包含脚本中内联运行,就像它们内联一样。
基本上,想象一下所有代码都在validate.php
内,它会像它一样运行。
这里有一个值得注意的问题 - 如果function.php
与validate.php
位于不同的目录中,include
内validate.php
请求db_conn.php
将失败 - 您需要更改此页面以匹配包含文件中的路径。