我有大约 75 个 php 现有脚本访问 mysql 数据库,类似于这个伪代码:
$query="SELECT * from table";
$result=mysqli_query($conn,$query);
if (mysqli_num_rows($result)) {
while($row=mysqli_fetch_assoc($result)) {
//use the rows
}
}
我最近被迫单独加密所有数据库字段,所以现在当这 75 个 php 脚本如上所示运行时,所有$row都会返回所有字段加密,因此无法使用。
因此,与其更改所有 75 个 php 脚本来解码每个字段,我想创建一个执行mysqli_query的函数,然后解密所有字段,并返回结果,就好像它是由mysqli_query返回的,但已解密。类似的东西
function QueryAndDecrypt($conn,$query){
$result=mysqli_query($conn,$query);
if (mysqli_num_rows($result)) {
while($row=mysqli_fetch_assoc($result)) {
$row=decrypt($row);
}
}
return $result; <<----- return result with fields decrypted
}
// now all 75 scripts would have to change just one line to call above
$query="SELECT * from table";
$result=QueryAndDecrypt($conn,$query); <<--- change only 1 line
if (mysqli_num_rows($result)) {
while($row=mysqli_fetch_assoc($result)) {
//use the rows as normal decrypted
}
}
如您所见,我只想更改所有 75 个脚本中的一行,以便它执行与以前相同的操作,结果将返回所有已解密的字段。
我尝试编写这个 QueryAndDecrypt 函数,但是当我从mysqli_result $row更改结果时,如上所示,它不会改变,因为 mysql 的结果是某种不可更改的集合(我被告知),或类似的东西。
那么,是否可以通过编写一个通用函数来做到这一点,该函数可以从执行SQL查询的所有脚本中调用,并且还可以解密结果,以便所有其他脚本都可以像常规mysql查询结果一样
访问结果?任何人都可以帮忙,我"刚下船",所以我不太了解 sql 或 php,我现在很绝望,因为所有的脚本都因此而损坏!!
谢谢
抱歉,您无法修改结果的行,然后以某种方式将它们"取消提取"回结果中以再次获取。
但是您可以通过更改一行来修复代码:
$query = "SELECT * from table";
$result = mysqli_query($conn,$query);
if (mysqli_num_rows($result)) {
while ($row = MyFetchAssocAndDecrypt($result)) { <<--- change only 1 line
//use the rows as normal decrypted
}
}
你必须编写这样的函数:
function MyDecrypt(&$item, $key) {
$item = openssl_decrypt($item, OPENSSL_CIPHER_AES_256_CBC, MY_SECRET_KEY);
}
function MyFetchAssocAndDecrypt($conn, $result){
$row = mysqli_fetch_assoc($conn, $result);
array_walk($row, 'MyDecrypt');
return $row; <<----- return row with fields decrypted
}
PS:您提到了不应通过网络将未加密的数据发送到数据库的要求。这不是我关心的问题,因为您可以使用VPN或通过SSL连接到数据库。
更大的问题是,包含明文数据和明文加密密码的查询将被写入MySQL服务器上的数据库日志,并且这些日志未加密。
MySQL有一些可选的扩展承诺进行全数据库加密,但这些扩展会忽略查询日志。