2017-07-27 186 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