使用PHP从外部服务器验证MySQL数据库中的信息


Use PHP to authenticate information in a MySQL database from an external server

我不太熟悉PHP的mysql_connect是如何工作的,但可以编写非常基本的脚本。我加入了一个论坛管理员论坛,一家托管公司向我们提供了合作伙伴关系。

这种合作关系涉及我们的活跃会员从该服务获得托管包的折扣。主机所有者建议他为这个特殊的包设置一个"隐藏URL",但我觉得如果我们论坛的非成员发现了这个URL,这可能会被滥用。

所以我建议我们安装一个脚本,通过用户(用户名和密码)在托管网站上输入凭据,并与我们的数据库(显然在单独的服务器上)交叉引用该信息以查找匹配,以及检查用户是否被激活并且至少有100个帖子,只有当所有if语句返回true时,用户才被验证并授予访问权限。

我知道如何验证数据,但我不知道如何访问服务器外部的数据库,我做了一些谷歌搜索,我发现的信息除了让我困惑之外什么都没有。

MySQL可以像连接本地服务器一样连接到外部服务器:

$conn = mysql_connect('external-server.hostname.example.com', $user, $password);
mysql_select_db($database_name);

外部服务器必须允许通过防火墙从web服务器发出请求的MySQL连接,并且它必须有一个访问需要查询的数据库的用户webserveruser@webserver-hostname

在外部服务器上,假设您只需要对表进行读(SELECT)访问:

GRANT SELECT ON databasename.tablename TO `webserveruser`@`webserver-hostname` IDENTIFIED BY 'thepassword';

似乎最简单的解决方案是让托管公司分别给你们每个人发一封长长的、唯一的URL,比如

http://www.myhostingservice.com/refer/80ddca50-f41e-11e0-be50-0800200c9a66/

点击这个链接会带你到他们的注册/购买页面,在那里你会收到一个特别的折扣,然后在购买后,链接变得无效或无效,所以没有人可以使用它。这是极不可能的,有人可以随机猜测url。

这比请求系统管理员直接访问他们的数据库要容易得多。唯一的其他替代方案是数据库/论坛系统管理员编写一个PHP API脚本,托管服务可以安全地使用该脚本检查数据库的凭据,而不需要数据库系统管理员透露关于数据库的重要安全细节。

您应该能够从主机到主机远程访问任何mysql数据库。我个人知道,我要求他们使远程连接可用,他们问我具体的IP地址,他们将允许访问它。

我已经拼凑了一些代码,以防你对如何实现你想要的表单/用户验证感到困惑——正如你所说的,你的PHP知识有限。

假设你有一个类似于这个的登录表单

<form action="post" method="checklogin.php">
<input type="username" name="username_input" />
<input type="password" name="password_input" />
<input type="submit" value="Validate Login" name="do_validation" />
</form>

这里是一些PHP代码的checklogin.php,我扔在一起的//注释来指导你:

// Get the form data
if ($_POST['do_validation'])
{
    // The correct form was posted, get the form data
    $username = mysql_real_escape_string($_POST['username_input']);
    $password = mysql_real_escape_string($_POST['password_input']);
    // Connect to the database
    mysql_connect ("http://91.0.0.1", "myUsername", "myPassword");
    // Select database
    mysql_select_db('remote_table_name');
    // Check the username and password against database
    $check_credentials = mysql_query("SELECT user_id FROM users WHERE username='$username' AND password='$password'");
    // Check that user exists
    if (mysql_num_rows($check_credentials) == 1)
    {
        $existing_user = mysql_fetch_assoc($check_credentials);
        $existing_user_id = $existing_user_id['user_id'];
        // The user exists, now get ID of posts from another table, using their 'user_id'
        $check_posts = mysql_query("SELECT post_id FROM posts WHERE user_id='$existing_user_id'");
        // Check the number of posts is at least 100
        if ($check_posts >= 100)
        {
            // The user has 100 posts OR MORE
            echo "You are a valid user";
            // Here you could start a session for the user (logging them in), and then show the data that you want
            session_start();
            // Store the user_id of the user in a SESSION
            $_SESSION['user_id'] = $existing_user_id;
        }
    }
}

上面的代码是未经测试的,几乎不包含任何安全机制,也没有验证。

但是它将满足您所建议的保护表单的标准。