2012-02-22 74 views
1

我目前正在研究php/PostgreSQL/JQuery項目,並且我是所有這些域中的絕對初學者。在Php中,爲了連接到我的數據庫,我發現的最佳方式是在所有需要它的php腳本中包含一個帶有用戶名和密碼的php 腳本,如下所示。 include('../scripts/pgconnect.php');保護PostgreSQL數據庫連接

隨着pgconnect.php:

$conn_string = "dbname=mydb user=myuser password=mypass";

$db = pg_connect($conn_string);

if(!$db){ die("Connection à la base impossible -> " . pg_errormessage($db));}

我相信在座的各位安全專家會嘲笑這一點,所以你可以告訴我什麼是保持用戶和偷窺窺探的最佳方式? 我發現堆棧溢出使用env變量的建議,但我不覺得它真的很安全。

+0

您可以通過點擊答案左側的V來接受一個(!)答案。它會讓人們有動力回答你未來的問題。所以,請選擇最好的答案。 – 2012-02-22 14:48:35

回答

4

PHP是一種服務器端語言。這意味着,當請求的頁面被髮送回客戶端時,所有的PHP代碼都會被解析和「刪除」。只要你是唯一能夠查看你的文件的人,就沒有恐懼感。

無論是否將它存儲在(env)變量中,都不會產生任何差異。

但絕對沒有錯的代碼;)


編輯:

當你執行一個SQL查詢但是,你要小心。通常,您使用用戶輸入(URL或POST數據)來設置查詢中的某些值。例如:

$sql = 'SELECT * FROM `table` WHERE `id`=' . $_GET['id']; 

$_GET['id']變量在URL(index.php?id=4)來設置。

如果他們將值4更改爲一些SQL查詢,他們幾乎可以做任何事情與您的數據庫。這被稱爲SQL injection。這確實是使用數據庫的Web應用程序的最大威脅。

有多個修復程序。

  • 淨化輸入(確保輸入不包含SQL語法)
  • 準備語句

現在,我不熟悉的PostgreSQL,但顯然PHP模塊具有發送準備好的語句的能力。這使您可以將帶有未知值的查詢作爲問號發送,然後發送值。

$sql = 'SELECT * FROM `table` WHERE `id`=?'; 
// send prepared statement 

$value = $_GET['id']; 
// send the value 

這樣數據庫可以告訴該值是無查詢。

就像我說過的,我對PostgreSQL並不熟悉,但我確信有一些教程會指導您一路完成!


另一個編輯:

因爲我是一個好人,我發現怎麼辦呢!您需要使用功能pg_prepare()pg_execute()。就像這樣:

// This is a name to allow the database to identify the prepared statement 
$queryname = 'my_query'; 

// Setting up our query with "empty" values 
$sql = "SELECT * FROM `table` WHERE `column`='$1' AND `column`='$2'"; 

// Setting our values to send afterwards 
$values = array(
    $_GET['first_value'], // The first value that will replace $1 
    $_GET['second_value'] // The second value that will replace $2 
); 

$result = pg_prepare($connection, $queryname, $sql); // Send the query to the database 
$result = pg_execute($connection, $queryname, array($value)); // Send the values 

最後編輯(我發誓):

如果你決定把你的配置變量在一個外部文件,讓說的configuration.php,確保該文件結尾.php擴展名。如果您使用不同的擴展名,人們可能能夠找到它並以純文本形式查看它。如果使用PHP擴展,他們將無法看到任何內容,因爲就像我所說的那樣,PHP將被解析並刪除。

+3

對不起,但這是一個可怕的建議。你應該*永遠不要*以純文本保存你的數據庫密碼,特別是不要在你的PHP文件中。 – AviD 2013-03-14 16:25:34

+1

@AviD PHP在發送給客戶端之前被解析,他們看不到密碼。除非有人直接訪問服務器上的文件,否則沒有威脅。爲什麼您認爲世界領先的CMS以純文本格式將數據庫密碼保存在PHP文件中?如果像你說的這樣一個大問題,你有什麼建議?即使你要加密它,你仍然需要解密它。當黑客有權訪問您的服務器文件時,他們也可以查找解密算法。如果您使用任何其他擴展名,文本將不會被解析,並會以純文本顯示,甚至更糟糕。 – 2013-03-15 10:02:13

+4

當然它不會發送給客戶端。除非有錯誤。或者是一些漏洞。或內部人員訪問文件。或...爲什麼世界領先的CMS將文件保存爲純文本PHP文件?我沒有任何線索。顯然他們也不是。您的評論的其餘部分毫無意義,並且對加密,保護和安全性有完全的誤解。我建議你在將自己稱爲專業開發人員之前,對這些主題做一些作業。 – AviD 2013-03-15 12:28:00

1

我使用環境變量來存儲數據庫身份驗證信息:也就是說,數據庫的主機/用戶/密碼位於Apache配置中的SetEnv命令中,該命令出現在$_SERVER中。

爲什麼這樣做?

  1. 開發和生產環境需要不同的值,所以讓應用程序讀取某種環境配置是必要的。
  2. 應用程序代碼位於源代碼存儲庫中,該代碼存儲庫很容易瀏覽...將認證機密嵌入到該存儲庫中可使這些應用程序廣泛使用。

環境變量不是唯一的解決方案:例如,包括一個設置某種配置對象的文件也可以。但是大多數人似乎在一個可變點上發展了一些配置設置(以及設置)的系統,與使用這些設置的代碼分開,這些代碼在完全不同的時間表上發生變化。

+0

謝謝大家的意見。我會仔細閱讀pg_prepare文檔(不知道這些)再次考慮env變量的用戶/傳遞信息。 – 2012-02-22 14:02:05