在将结果返回到应用程序的其余部分之前更改Mysqli_result

时间:2017-04-13 01:16:12

标签: php mysql encryption resultset

我有大约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都会返回所有字段都被加密,因此无法使用。

因此,我想创建一个执行mysqli_query的函数,然后解密所有字段,并返回结果,就好像它是由mysqli_query返回的,而不是更改所有75个PHP脚本来解码每个字段,但是解密。像

这样的东西
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查询结果?

任何人都可以提供帮助,我刚刚离开船只#34;所以我不知道sql那么好或php,我现在非常绝望,因为所有的脚本都因为这个而被打破!!

由于

1 个答案:

答案 0 :(得分:1)

抱歉,您无法修改结果的行,然后以某种方式“取消”将它们重新导入到要再次获取的结果中。

但您可以通过更改一行来修复代码:

func saveAction(image: NSImage, url: URL) {

    if let tiffdata = image.tiffRepresentation,
    let bitmaprep = NSBitmapImageRep(data: tiffdata) {

    let props = [NSImageCompressionFactor: Appearance.imageCompressionFactor]
    if let bitmapData = NSBitmapImageRep.representationOfImageReps(in: [bitmaprep], using: .JPEG, properties: props) {

        let path: NSString = "~/Desktop/out.jpg"
        let resolvedPath = path.expandingTildeInPath

        try! bitmapData.write(to: URL(fileURLWithPath: resolvedPath), options: [])

        print("Your image has been saved to \(resolvedPath)")
    }
}

你必须编写类似这样的函数:

$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
    }
}

PS:您提到要求您不应该通过网络将未加密的数据发送到数据库。这不是我的顾虑,因为您可以使用VPN或通过SSL连接到数据库。

更值得关注的是,包含明文数据和明文加密密码的查询将写入MySQL服务器上的数据库日志,并且这些日志未加密。

MySQL有一些可选扩展,承诺进行全数据库加密,但这些扩展忽略了查询日志。