Я пытаюсь реализовать как можно более простую систему лицензирования в устанавливаемом веб-приложении, которое я создаю (загрузка и загрузка пользователей на их сервер). После изучения того, что сеансы не могут быть установлены в междоменном пространстве (это был мой первый выбор), я теперь подумал о включении внешнего файла на свой сервер, содержащего функцию под названием validate()
которая проверяет, существует ли лицензия в моя база данных.
Поток событий: Пользователь вводит лицензионный ключ на своем сайте -> Лицензионный ключ, отправленный в файл /validate.php
который включает в себя файл с моего сервера -> Сервер проверяет, включен ли в базу лицензионный ключ -> Если да, задает сеанс в домене пользователей и перенаправление на раздел администратора -> Если нет, перенаправляется на страницу входа в систему с сообщением об ошибке.
Вот мой код (теоретический – могут быть проблемы):
validate.php
include("http://www.example.com/function.php"); validate($_POST['license']);
в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"); } );
в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
с моего сервера или пользователя?
Проецируемый поток:
Пользователь вводит лицензионный ключ на свой сайт (происходит на его сервере)
Лицензионный ключ, отправленный в файл /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 }
в<?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
, и он будет работать, как если бы он был.
Для этого нужно db_conn.php
если db_conn.php
находится в другом каталоге validate.php
, include
внутри validate.php
которое запрашивает db_conn.php
не удастся – вам нужно будет изменить эту страницу, чтобы она соответствовала путь из включенного файла.