可能以下所有内容都不合理,但要明确并理解。
目标是保护以mysql录制的电子邮件地址和电话号码。如果黑客获得数据库,那就更难以获得真正的电子邮件
决定这样做
1)在webroot外面放置一些文本文件
2)在php $content_of_some_file = include '/wamp/some_file.txt';
3)INSERT into users (email) VALUES (AES_ENCRYPT('someemail@example.com', $content_of_some_file));
但是如果黑客可以访问mysql,访问php文件并使用echo $content_of_some_file;
没问题。获取密钥并SELECT AES_DECRYPT(email, 'key')
任何想法如何预防?有可能吗?如果不可能的话,那么以上几乎都是不合理的......
目标如下:
1)来自网站的访问者想要向某个用户发送消息
2)输入字段中的访客类型消息,点击发送
3)我从mysql收到用户的电子邮件并将邮件发送到电子邮件
想要阻止:
黑客获取mysql的内容并希望收集电子邮件发送垃圾邮件(而不是实际的电子邮件黑客看到的东西不可理解)。黑客想要转换为实际的电子邮件。
黑客也可以访问php文件。在其中一个php文件中,黑客会插入代码来查看$content_of_some_file
(一个放在webroot之外的密钥)。
使用密钥,黑客AES_DECRYPT
并获取实际的电子邮件。
是否有可能不允许黑客看到$content_of_some_file
(放在webroot外面的密钥)?
尝试使用php DEFINE
如果在webroot外的文件中插入define("GREETING","Hello you! How are you today?");
在webroot中的文件中仅插入echo constant("GREETING");
我可以看到常量GREETING
的内容。因此,如果黑客插入此类代码,他可以查看AES_DECRYPT
密钥的内容并解密电子邮件。
似乎必须设置php文件(目录)不可写...黑客无法插入代码而无法上传文件。并且无法直接访问位于webroot外部的文件。这将是一些措施......
而且似乎还需要混淆部分php代码,以便代码黑客无法知道变量和文件名。
答案 0 :(得分:2)
如果某个文件的内容只是上面的盐,你可以使用位于任何地方的salt(随机字符集合)。
这样,有问题的黑客就必须在你的PHP代码中以及拥有数据库访问权限。在实际使用方面;如果使用列表,salt必须有某种引用。
define('SALT', 'iuoerghiuowerbnfcuioq3hrj980127yu589734754-12j84903q24fyjrm03qwy4ruw');
INSERT into users (email) VALUES (AES_ENCRYPT('someemail@example.com', SALT));
由于salt是一个不变的密码,mysql中的条目可以返回到可读的状态,使用AES_DECRYPT和salt一起使用
SELECT AES_DECRYPT(email, SALT)
WHERE user_id = 'recipient_id'
FROM users
Limit 1;
请注意,在这两种情况下,您都需要转义mysql字符串,以便将实际的salt作为密码插入,否则您将使用SALT作为密码。
另一种方法是使用现成的类,例如找到的here,它允许您从PHP中对条目进行编码,完全忽略数据库。
更新以反映在网络根目录之外持有盐
为了允许PHP访问Web根目录之外的路径,您需要查找basedir directive。例如:
open_basedir = /srv/http/:/path/to/where/you/keep/salt/
这声明web_root和另一个路径都可以被PHP访问,请注意它们之间的分号。现在,您使用salt在该路径中创建一个文件:
/path/to/where/you/keep/salt/salt.php
<?php $strSalt = 'hideouslylongandobscurestring'; ?>
使用该集合,您打算使用代码,而不是之前使用的定义,请替换为以下内容:
include('/path/to/where/you/keep/salt/salt.php');
INSERT into users (email) VALUES (AES_ENCRYPT('someemail@example.com', $strSalt));
但是,如果有问题的黑客可以访问您的文件,他们可以简单地找到这个包含并提取盐。如果您的数据库和主机都受到损害,那么真的没有简单的万能药(全部治愈)。
如果确定你需要一些更加万无一失并且愿意走极端的东西,那么你真正关注的是你在异地生成盐(基于用户帐户标准)并通过某种方式通过安全方式提供的设置像OAuth一样授权部分。在这一点上,当你只想加密一个电子邮件地址并超出这个问题的范围时,你真的开始让自己生活困难。
希望这种思考能有所帮助