【问题标题】:Use PHP to authenticate information in a MySQL database from an external server使用 PHP 从外部服务器验证 MySQL 数据库中的信息
【发布时间】:2011-10-11 15:28:27
【问题描述】:

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

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

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

我知道如何验证数据,但我不知道如何访问服务器外部的数据库,并且我进行了几次 Google 搜索,但我发现的信息无济于事,只是让我感到困惑。

【问题讨论】:

    标签: php mysql database connection external


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 而 GRANT 只是直接输入数据库的常规 SQL 查询?
    • 非常感谢你,迈克尔。您的帖子很有帮助!
    【解决方案2】:

    似乎最简单的解决方案是托管公司分别通过电子邮件向你们每个人发送一个长而独特的 URL,例如

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

    单击此链接会将您带到他们的注册/购买页面,您将在该页面获得特别折扣,然后在购买后,该链接变为无效或无效,因此其他人无法使用它。别人随机猜到网址的可能性极小。

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

    【讨论】:

    • 感谢您的回复。论坛上的数据库信息存储在变量中,因此托管公司在任何情况下都无法看到这些信息,除非他们重写了一个脚本来获取这些信息,但我想有一个简单的解决方法可以解决这个问题。不过,我正在记下您独特的 URL 创意,我也会提出建议。
    • 请记住,如果托管公司直接访问数据库并进行直接数据库调用,那么您将泄露您的表名和表布局,这是一个很大的潜在安全问题。
    • 您是否有机会知道以某种方式掩盖此信息以使托管公司无法访问这些信息?我一直在对此事进行一些研究,但到目前为止没有运气
    • Coulton 的解决方案是我会采用的。这是一个基本的 PHP 脚本。你给它一个用户名和密码,然后它会告诉你这是否是一个有效的用户名/密码。所有重要/秘密的数据库信息都隐藏在脚本中。脚本需要做的就是在最后说“有效”或“无效”。这有一些轻微的安全问题,由于暴力攻击导致登录尝试限制不足,但大部分脚本都在那里。
    【解决方案3】:

    您应该能够从主机到主机远程访问任何 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>
    

    这里有一些用于 checklogin.php 的 PHP 代码,我与 //cmets 一起为您提供指导:

    // 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;
            }
        }
    }
    

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

    但它会满足您建议的保护表单的标准。

    【讨论】:

    • 哈哈感谢您基本上为我编写了整个脚本,尽管我只询问了如何连接到外部数据库:P 即使我已经编写了一半,您的帖子仍然对我有帮助。我将稍微编辑一下我的代码以包含其中的一些内容并添加一些安全机制。非常感谢:)
    • @Schwing 我在最后一秒意识到你只是真的想知道远程 mysql ......但是嘘保持安静!哈哈。在所有编码之后多么令人沮丧:(。如果您使用任何代码,这就是它本身投票赞成的原因:)。
    • 我对 stackoverflow 很陌生,所以我不知道如何投票,除非它与“这篇文章对你有用吗?是/否”有任何关系,那么这已经完成了. :)
    • 是的,就是这个,但我的具体答案旁边是数字和上/下箭头。无论如何,祝你好运!
    • 嗯,在那种情况下,我没有足够的声誉,因为我是新注册的 :)
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多