2011-10-11 23 views
2

我並不十分熟悉PHP的mysql_connect的工作方式,但可以編寫非常基本的腳本。我參加了論壇管理員論壇,我們已經由託管公司提供了合作伙伴關係。使用PHP從外部服務器驗證MySQL數據庫中的信息

這種夥伴關係涉及我們的活動成員從該服務託管包的折扣。託管所有者建議他爲這個特定的軟件包設置一個「隱藏的URL」,但是如果他們發現了這個URL,我認爲這可能會被我們論壇的非成員濫用。

所以我建議我們在主機網站上安裝一個腳本,該腳本需要用戶(用戶名和密碼)輸入憑據,並與我們的數據庫(顯然是在單獨的服務器上)交叉引用該信息以查找匹配,以及檢查用戶是否已激活並且至少有100個帖子,並且只有當所有if語句返回true時,纔會對用戶進行身份驗證並授予託管程序包的訪問權限。

我知道如何驗證數據,但我不知道如何訪問服務器外部的數據庫,並且我做了一些Google搜索,但是我發現的信息沒有做任何事情,只是讓我感到困惑。

回答

1

MySQL能連接到外部服務器以相同的方式,因爲它連接到本地主機服務器:

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

外部服務器必須允許MySQL連接通過其防火牆從web服務器發出請求,和它必須具有用戶[email protected]才能訪問需要查詢的數據庫。

在外部服務器,假設你只需要讀(SELECT)訪問表:

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

而且,GRANT只是一個常規的SQL查詢,直接輸入數據庫? – Schwing

+0

@Schwing是的,這是正確的。 –

+0

非常感謝你,邁克爾。你的帖子非常有幫助! – Schwing

0

這似乎是最簡單的解決辦法是託管公司單獨的電子郵件,你長的每一個,唯一的URL一樣

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

點擊此鏈接將帶您到他們的註冊/購買頁面,您將收到特殊折扣,然後購買,則之後,該鏈接成爲死或無效所以沒有其他人可以使用它。有人可能隨機猜測網址是極不可能的。

這比試圖讓系統管理員直接訪問他們的數據庫要容易得多。唯一的另一種選擇是數據庫/論壇sysadmin編寫一個PHP API腳本,宿主服務可以安全地使用它來檢查數據庫的憑據,而不需要數據庫sysadmin需要顯示有關數據庫的重要安全細節。

+0

謝謝你的回覆。論壇上的數據庫信息存儲在變量中,因此託管公司在任何情況下都無法看到這些信息,除非他們重寫了一個腳本來獲取這些信息,但是我想有一個可用的解決方法。我記下你的獨特的URL的想法,但我也會提出。 – Schwing

+0

請記住,如果託管公司直接訪問數據庫並直接進行數據庫調用,那麼您將泄露您的表名稱和表格佈局,這是一個很大的潛在安全問題。 –

+0

您是否可以通過任何方式知道以何種方式掩蓋此信息,以致託管公司無法訪問此信息?我一直在做這方面的一些研究,到目前爲止沒有運氣 – Schwing

0

您應該能夠從主機到主機遠程訪問任何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代碼,我已經與//意見一併扔進來引導你:

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

上面的代碼沒有經過測試,幾乎沒有任何安全機制,也沒有驗證。

但它會符合您建議保護您的表單的標準。

+0

哈哈感謝基本上編碼我的整個腳本,即使我只問如何連接到外部數據庫:P您的帖子仍然對我有幫助,即使我已經編碼了一半。我會編輯我的代碼來包含一些這樣的內容並添加一些安全機制。非常感謝:) – Schwing

+0

@Swing我在最後一秒意識到你只是真的想知道關於遠程mysql ...但是保持安靜!哈哈。如何壓制所有的編碼:(如果你使用任何代碼,那就是它本身投票的原因:)。 – Luke

+0

我對stackoverflow很新,所以我不知道如何投票,除非它與「這篇文章對你有用嗎?是/否」有任何關係,那麼這已經完成了。 :) – Schwing

相關問題