使用时:
$con = mysql_connect('localhost','user','password')
我已经阅读了将密码部分存储在别处的好处 (https://stackoverflow.com/a/3354457/1704651)。
我是 PHP 的新手,想知道我存储 MySQL 密码的方法是否安全:
- 第一步,选择一个较长的 MySQL 数据库密码 (https://www.random.org/passwords/?num=1&len=24&format=html&rnd=new)
第二步,将其放入/outsidewebroot/salt.php(我的实际盐更长)
<?php $salt = sdcjbdt8veADJbyuQxsfJtYeW7tC5; ?>
第三步,使用临时 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);
第四步,将这段代码放入.htaccess
SetEnv encrypted-password i3NOByNkztBtEbJ8LJMt2GbX9VjMzO2MTYtBXsxyYVI=
第五步,将这段代码放在需要连接到数据库的地方:
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使用哈希而不是加密/解密方法。
感谢您对我的方法的反馈。
最佳答案
没有。如果有人可以获取您的文件或运行程序,那么游戏就结束了:
- 如果您的 Web 目录是可写的,我可以简单地在
mysql_connect()
上面添加一行echo $decrypted;
并获取密码。 - 我可以将您的文件复制下来并在那里进行编辑。
安全是您经历的一个过程,而不是您可以链接到程序中的某个库。
您应该将配置存储在 php.ini 中文件,以便您的程序只需要
mysql_connect()
(不带参数)。这是一个好主意,因为攻击者可能更容易说服您的系统打印出源代码和 Web 可访问的文件,而不是在您的系统上打印任意字段。在像 OSX 和 Linux 这样的 Unixish 系统上,你应该确保你使用的是 unix 域套接字,它不会将你的 MySQL 服务器暴露给互联网;如果不在 Internet 上,则有人无法连接到您的 MySQL 服务器。这提供了一些针对“获取您的文件”攻击的进一步保护。
注意不要让您的网络用户创建 php 文件(或任何其他可执行文件)。这提供了一些针对“运行程序”攻击的保护,
如果我可以上传/编辑你的文件,我可以做他们能做的任何事情,所以你也应该小心你放在 MySQL 服务器中的
GRANT
语句:如果只管理员需要对某些表执行某些INSERT
或DELETE
,请考虑以具有单独权限的单独网络用户身份运行管理脚本。如果您的脚本无法删除您的所有数据,那么我作为攻击者也不能。
关于php - 我保护 MySQL 数据库密码的方法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12661923/