【发布时间】:2018-05-10 05:10:24
【问题描述】:
我尝试了多种解决方案来对上传的文件进行 XOR 编码,但总是失败。问题基本上是,未加密的文件可以很好地上传到 mysql 数据库:
$fp = fopen($tempPath, 'r');
$content = fread($fp, filesize($tempPath));
$content = addslashes($content);
fclose($fp);
$encrypted = "";
$key = "123456";
for($i = 0; $i < strlen ($content); $i++)
{
$encrypted = $encrypted . chr( ord( $content[$i] ) );
}
$sql = "INSERT INTO
doc_files (
id,
filedata,
filename,
cryptdata,
beschreibung,
category,
filetype)
VALUES (
'$new_guid',
'$encrypted',
'$title',
'$key',
null,
'$cat',
'$filetype'
);";
但是当仅更改编码文件的行(添加 XOR)时,整个脚本会失败并出现 mysql 错误。 mysql 字段格式为longblob。
$encrypted .= chr( ord( $content[$i] ) ^ ord( $key[$i % strlen ($key)] ) );
“您的 SQL 语法有错误;请查看手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近 '??ѿG?a????og??3O??o3y q:??eH}?????.,Y?Z>?m?]?Y%?|{?$? ' 在第 12 行"
提前感谢您的帮助
编辑:添加
$encrypted = addslashes($encrypted);
使代码工作。该文件已上传到数据库中,但已增大,因此无法解码。
【问题讨论】:
-
PHP中XOR的表示法是
xor:php.net/manual/en/language.operators.logical.php -
@Raptor
^是bitwise XOR operator;您指的是逻辑 XOR 运算符。 -
PHP 中的字符串连接是用点符号
.完成的,而不是用加号+完成的,所以连接赋值运算符是.=,而不是+=。此外,如果安全性很重要,与其创建自己的加密方法,不如研究 PHP 的专业级加密扩展,例如 OpenSSL。 -
至于运算符我都试过了,我相信参考文章指定两者都可以使用。对于操作员来说,是的,当恢复到我的代码的先前版本时,这只是一个打字问题。无论如何,它没有在我的数据库中生成任何文件......我很欣赏这些输入
-
我浏览了很多解决方案,但它们似乎大多不适用于 mysql,或者在处理来自文件上传器的数据时失败。因为这应该是比较字节我猜它是一个逻辑运算符