2017-07-27 185 views
0

我有一個PHP腳本,用於在mysql中運行查詢並導出文件。我有在PHP文件中的登錄憑據。它將被訪問該頁面的用戶調用,並且該文件會自動下載。我已經讀過,你應該在另一個文件中寫入憑證並將其包含在文件中。我對PHP知之甚少,不知道如何安全地存儲這個文件,以及如何正確地包含它。我有一位朋友幫我寫這個文件。
php腳本如下。在php文件中隱藏mysql密碼

<?php 
header("Access-Control-Allow-Origin: *"); 
$db_user = "user"; //replace with your mysql username 
$db_pass = "password"; //replace with your mysql password 
$db_source = "database"; //replace with your database name 
$mysqli = mysqli_connect("localhost", $db_user, $db_pass, $db_source); 

if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} else { 
// place sql query between quotes for $sql -- do not end with ; 
    $sql = " SQL Statement Here "; 
    $res = mysqli_query($mysqli, $sql); 
    $rows = array(); 
    if ($res) { 
     while ($r = mysqli_fetch_assoc($res)) { 
      $rows[] = $r; 
     } 
    } else { 
     printf("Could not retrieve records: %s\n", mysqli_error($mysqli)); 
    } 

    $return = array(
     $rows 
    ); 

    array_to_csv_download($rows); 

    mysqli_free_result($res); 
    mysqli_close($mysqli); 
    unset ($db_user, $db_pass, $db_source); 
} 


function array_to_csv_download($array, $filename = "export.csv", $delimiter=",") { 
    header('Content-Type: application/csv'); 
    header('Content-Disposition: attachment; filename="'.$filename.'";'); 

    $f = fopen('php://output', 'w'); 

    foreach ($array as $line) { 
     fputcsv($f, $line, $delimiter); 
    } 
} 

?> 

回答

3

將PHP文件放在正確設置的服務器上時,用戶將無法訪問PHP源代碼。因此,如果您信任服務器,則可以毫無問題地將數據庫憑據放入代碼中。

然而,有可能會遇到與安全一些其他問題:

當你把一個網站的服務器上,你必須確保該服務器是安全的。來自外部的人不應該能夠從服務器讀取php源文件。根據您的託管服務提供商的不同,服務器可能已經全部爲您提供擔保,因此您不必太擔心(只要保持服務器訪問權限的最低限度)。

2.你說得對,你需要把憑據放在外部文件中。但是,這與服務器上的安全無關。當您與多個其他程序員一起處理項目並且希望將數據庫憑據保密時,這非常有用。通常情況下,您想要將所有私人數據存儲在一個您不會與其他人共享的文件中。例如,如果您使用的是版本控制系統(如git),則不需要跟蹤該文件,每個程序員都應該擁有自己的文件版本。這降低了敏感信息廣泛傳播的風險。

+0

這是*種*真。將版本保存在版本控制之外的單獨文件中更好,所以偶爾將Github私有化一段時間而不會暴露它。例如,參見'。env'文件在Laravel。 – ceejayoz

+0

@ceejayoz true!我會將其添加到我的答案。謝謝! – Maxime

1

即使你把它放在一個include他們仍然可以通過回出來,所以不會爲你工作得到密碼。

如果您發送的是不可信來源的數據庫密碼,那麼這樣做很不妥。你可能想要做的就是將該腳本轉換爲REST API,並且有很多教程。然後,他們永遠不會看到您的密碼。他們所要做的就是發送一組有限的命令,腳本會將所需的數據返回給它們。 REST API的行爲類似黑匣子,最終用戶只能訪問有限的一組函數。

+0

能否請你解釋一下,任何人都可以從PHP文件中「回顯」密碼,他們從來沒有看到密碼的來源? – cars10m

+0

如果你有一個名爲'connect.php'的文件,例如你的數據庫連接信息,然後你'include'connect.php',那麼所有人必須做的就是寫'echo $ password;'假設'$密碼'是'connect.php'中的一個變量 – Difster

+0

是的,但是這個「某人」必須具有讀取和寫入訪問PHP源文件的目錄。據我所知,一個Web用戶沒有辦法在PHP文件中插入PHP語句。 – cars10m