【问题标题】:Is my method for protecting MySQL DB password secure?我保护 MySQL 数据库密码的方法安全吗?
【发布时间】:2012-09-21 15:10:15
【问题描述】:

使用时:

$con = mysql_connect('localhost','user','password')

我已了解将密码部分存储在其他地方的好处 (https://stackoverflow.com/a/3354457/1704651)。

我是 PHP 新手,想知道我存储 MySQL 密码的方法是否安全:

  1. 第一步,选择一个冗长的 MySQL 数据库密码 (https://www.random.org/passwords/?num=1&len=24&format=html&rnd=new)
  2. 第二步,把这个放到/outsidewebroot/salt.php(我的实际salt更长)

    <?php $salt = sdcjbdt8veADJbyuQxsfJtYeW7tC5; ?>
    
  3. 第三步,使用临时PHP文件对密码进行编码(使用后删除):

    $decrypted = "my decrypted MySQL password"
    $key = $salt;
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $decrypted, MCRYPT_MODE_CBC, md5(md5($key))));
    var_dump($encrypted);
    
  4. 第四步,把这段代码放到.htaccess中

    SetEnv encrypted-password i3NOByNkztBtEbJ8LJMt2GbX9VjMzO2MTYtBXsxyYVI=
    
  5. 第五步,把这段代码放在你需要连接数据库的地方:

    require_once("../../outside-webroot/salt.php")
    $key = $salt
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted-password), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
    $con = mysql_connect('localhost','user',$decrypted)
    

/outsidewebroot/salt.php 中的盐与我在数据库中用于散列密码的盐相同,因此我只需将其包含一次以供两次使用。

我在这里看到的加密/解密方法:http://ideone.com/yQIAX

我也见过这种方法:https://stackoverflow.com/a/3354457/1704651 使用哈希而不是加密/解密方法。

感谢您对我的方法的反馈。

【问题讨论】:

  • 保护它的第一种方法是使用 mysqli 或 POD 与准备好的语句连接到 mysql db。您想阻止注射发生。
  • 不要在 mysql 密码的加密上投入大量精力,而应该把精力放在使您的网站安全上。给你我网站的IP和mysql密码没问题!
  • JvdBerg,我对此很陌生!您如何保护您的数据库?你有链接吗?亲切的问候,
  • (另外,我不知道 mysqli 或 POD,因为 mysql_connect() 命令是我读到的第一个命令。感谢 Moe Tsao)

标签: php mysql database-connection password-encryption


【解决方案1】:

没有。如果有人可以获取您的文件或运行程序,则游戏结束:

  1. 如果您的网络目录是可写的,我只需在mysql_connect() 上方添加一行echo $decrypted; 并获取密码。
  2. 我可以将您的文件复制下来并在那里进行编辑。

安全性是您经历的过程,而不是您可以链接到程序中的某个库。

  • 您应该将配置存储在php.ini 文件中,这样您的程序就只需要mysql_connect()(不带参数)。这是一个好主意,因为攻击者可能更容易说服您的系统打印出源代码和 Web 可访问的文件,而不是在您的系统上打印任意文件。

  • 在像 OSX 和 Linux 这样的 Unixish 系统上,您应该确保您使用的 unix 域套接字不会将您的 MySQL 服务器暴露给 Internet;如果您的 MySQL 服务器不在 Internet 上,则有人无法连接到它。这提供了一些针对“获取您的文件”攻击的进一步保护。

  • 注意不要让您的网络用户创建 php 文件(或任何其他可执行文件)。这提供了一些针对“运行程序”攻击的保护,

  • 如果我可以上传/编辑你的文件,我可以做他们能做的任何事情,所以你也应该小心你放在 MySQL 服务器中的 GRANT 语句:如果只有管理员需要做某些INSERTDELETE 到某些表,请考虑以具有单独权限的单独Web 用户身份运行管理脚本。如果你的脚本不能删除你所有的数据,那么我作为攻击者也不能。

【讨论】:

    【解决方案2】:

    安全的第一条规则是,如果您不确定自己是否安全,那么您可能不安全。

    下一个版本的 PHP (v5.5) 将具有一组内置函数,可提供标准化的密码散列。一旦此版本发布,这将是唯一推荐的密码处理方式。

    同时,您可以下载一个兼容库,它为当前的 PHP 版本实现了相同的功能。从这里下载:https://github.com/ircmaxell/password_compat

    另请参阅:http://www.h-online.com/open/news/item/PHP-5-5-should-reduce-password-sloppiness-1707835.html 以供参考。

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      • 2015-04-02
      相关资源
      最近更新 更多