隐藏php文件中的mysql密码

时间:2017-07-27 03:21:31

标签: php security mysqli

我有一个PHP脚本,用于在mysql中运行查询并导出文件。我在php文件中有登录凭据。它将由访问该页面的用户调用,该文件会自动下载。我已经读过你应该在另一个文件中写入凭据并将其包含在文件中。我不太了解php,知道安全地存储这个文件的位置以及如何正确地包含它。我有一个朋友帮我写文件 php脚本如下。

<?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 个答案:

答案 0 :(得分:3)

将PHP文件放在正确设置的服务器上时,用户将无法访问PHP源代码。因此,如果您信任该服务器,则可以将数据库凭据放在代码中而不会出现任何问题。

但是,您可能会遇到一些与安全相关的问题:

1. 当您将网站放在服务器上时,您必须确保此服务器是安全的。来自外部的人不应该能够从服务器读取php源文件。根据您的托管服务提供商,服务器可能已经全部为您保护,因此您不必过于担心(只要您尽量减少有权访问服务器的人数)。

2。您是正确的,您需要将凭据放在外部文件中。但是,这与服务器上的安全性无关。当您与多个其他程序员一起处理项目并希望将数据库凭据保密时,它非常有用。通常,您希望将所有私有数据存储在一个您不打算与其他任何人共享的文件中。例如,如果您使用的是版本控制系统,例如git,则不希望跟踪此文件,并且每个程序员都应该拥有自己的文件版本。这降低了敏感信息普及的风险。

答案 1 :(得分:1)

即使你把它放在{{1}}中,他们仍然可以通过回复来获取密码,这对你不起作用。

如果您要向不受信任的来源发送数据库密码,那么您做错了。您可能想要做的是将该脚本转换为REST API,并且有很多教程。然后,他们永远不会看到您的密码。他们所要做的就是发送一组有限的命令,你的脚本会将所需的数据返回给他们。 REST API有点像黑盒子,最终用户只能访问一组有限的功能。

答案 2 :(得分:0)

如果您具有完全的服务器访问权限或对WWW目录后面目录的访问权,请使用SQL凭据编写一个文件并将其存储在www目录后面,然后将-rwx赋予所有人,并将+ r赋予Apache / Nginx用户(通常www-data)。 将www-data(或httpd服务器用户)shell设置为/ bin / false,并使用私钥保护root。 然后在文件中包含硬路径。 另外,切勿在MySQL上使用root用户。创建一个特定的用户,并只授予其所需的权限。