2016-07-06 86 views
0

我有這個簡單的MySQL表,我把它叫做data_table使用PHP訪問MySQL數據庫中的某些數據的用戶權限?

/--------------+------------------+-------------------\ 
+ data_id + data_content + addition_content | 
+--------------+------------------+-------------------+ 
+ data_1 + data_content_1 + comment_for_1 | 
+ data_2 + data_content_2 + comment_for_2 | 
+ data_3 + data_content_3 + comment_for_3 | 
+    +     +     | 
+  ...  +  ...  +   ...  | 
+    +     +     | 
+ data_n + data_content_n + comment_for_n | 
\--------+-----+------------------+-------------------/ 

爲了幫助用戶可以將他們的數據提交給我的數據庫,我創建了一個簡單的HTML表單(用PHP核心),方便數據提交。


對於從該表(data_table)獲取數據,我已經使用這個查詢(從my_query.php):

// ... 

$var_get = $_GET['url']; 

$query_1 = mysql_query("SELECT * FROM `MyDB` WHERE `data_id` = '{$var_get}'"); 

while ($query_2 = mysql_fetch_array($query_1)) 

{ 

    echo $query_2['x_2']; 


} 

// ... 

任何人都可以看到任何結果(從echo $query_2['x_2'];),當他們訪問my_query.php頁用值爲$_GET[];


現在,我不想讓所有人都可以訪問我網站上的任何數據。因此,我決定只允許某些用戶的訪問權限;而且,我有一個想法:

  • 我將創建一個新的MySQL表(user_table):
/--------------+------------------+-------------------\ 
+ user_id +  user_name + user_password | 
+--------------+------------------+-------------------+ 
+ user_1 + user_name_1 +  password_1 | 
+ user_2 + user_name_2 +  password_2 | 
+ user_3 + user_name_3 +  password_3 | 
+    +     +     | 
+  ...  +  ...  +   ...  | 
+    +     +     | 
+ user_n + user_name_n +  password_n | 
\--------+-----+------------------+-------------------/
  • 然後,我將一個新的數據列(data_owner)添加到存在的表(data_table)。每條記錄(數據行)將有一個所有者;這所有者是已存在的用戶(在user_table)誰提交了他們的數據到我的網站。
  • 最後,我會添加一個新的數據列(allowed_user)到現有的表(data_table)。每條記錄(數據行)都會有一些允許的用戶;這些允許用戶是允許看到結果(來自echo $query_2['x_2'];)的已存在用戶(在user_table)。如果某人不是允許的用戶(來自某個記錄),他們將不會看到真實的數據。

我的想法是不是壞了?


對不起,編程不是我的工作;所以,我的編程技巧有一些限制。你能舉個例子嗎?

+0

如果擁有「允許的用戶」屬性集的用戶將可以訪問其數據和他的數據,那麼聲音OK。用戶無法訪問其他人的數據? – PaulH

+0

請務必在公共站點**防止SQL注入** http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1 – PaulH

+0

而不是在PHP中的while循環中進行過濾,可以考慮將過濾器添加到SQL語句的WHERE中,這樣會更有效。 – PaulH

回答

1

您所描述的是用戶的基本登錄/授權系統。 https://www.phpro.org/tutorials/Basic-Login-Authentication-with-PHP-and-MySQL.html

有了這個設置,用戶只能被允許更新他們自己的記錄。

如果您需要管理員用戶或管理員,您可以設置一個簡單的訪問控制列表。 如:

CREATE TABLE levels(
    id int not null primary key auto_increment' 
    name varchar(20) not null 
); 
INSERT INTO levels(id, name) values (1,'admin'); 
INSERT INTO levels(id, name) values (2, 'moderator'); 
INSERT INTO levels(id, name) values (3, 'guest'); 

當用戶登錄時,你可以檢查他們是否有版主,或管理員權限來看看其他用戶的數據。

如果您希望使用現有解決方案,還有ACL實施準備就緒。

千電子伏

+0

腳註:非常值得考慮的是,實際上這個*完整的應用程序「已經完成了死亡」......一個所謂的「CRUD =創建讀取更新刪除」的網站在某處的數據庫,必然包括一些概念用戶權限。 「已經有*超級*已經。」在任何人開始編寫另一個「今天」之前,他們應該花費一些嚴肅的時間,例如,在GitHub上尋找其他人已經完成的工作。 –

0

你需要創建一個多個領域被稱爲角色 例如:USER_ID,USER_NAME,USER_PASSWORD,USER_ROLE

而註冊,您需要通過角色類型(管理員,超級管理員(可選),出版商,客人),您可以在角色中添加您需要的任何內容。

根據您需要授予的角色。

0

不,我不這麼認爲!您的想法不是針對該問題的best fix

你真正需要的是一個訪問控制列表就像Kevin Waterson said

我不會建議你雖然實現自己的ACL。你可以在GitHub上看看這個ACL Library,它是最好的PHP庫中的一個,它沒有太多的學習曲線(如果有的話),它只是工作。

如果你使用Samshal\Acl圖書館,我掛上面,下面的代碼片段將幫助您保護資源:

 $permissionManager = new \Samshal\Acl(); #<-- Instantiate the ACL Class 

     #When you create a new data, add it to your ACL by doing 
     $permissionManager->addResource('data_1'); #<- data_1 is the id of your newly created data 

     #You need to also register users to the ACL 
     $permissionManager->addRole('user_n'); #<- user_n is the id (probably the username) of your just created user 

     #Then grant permissions by doing: 
     $permissionManager->user_n->can->view('data_1'); 
     #Or deny permissions by doing 
     $permissionManager->user_n->cannot->view('data_1'); 

保存在一個數據庫或文件,瞧一系列化$permissionManager!您已經成功保護了所有資源。

圖書館有其他很酷的功能太像,讓您授予editcreatedelete甚至允許你創建和附加一個完全自定義權限就像你的資源approveDataContent權限。 您可以訪問https://github.com/Samshal/Acl/blob/master/README.md以瞭解有關ACL庫的更多信息

相關問題