0

管理パネルのカスタムフォームを使用してzipアーカイブをアップロードできるPHPを実行しているサーバーがあります。zip アーカイブをアップロードするとき、その CRC32 チェックサムを計算し、将来のダウンロード整合性チェックのためにデータベースに挿入します。

$zipchecksum = strtoupper(hash_file('crc32', $zippath));
$mysqli->query("INSERT INTO files VALUES (NULL, '$zipname', '$zippath')");

C# クライアントを使用してダウンロード可能なファイルをサーバーに照会すると、応答でそのチェックサムも受け取り、新しいファイルが利用可能な場合はダウンロードします。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Properties.Settings.Default.URLDownload);
request.Accept = "application/octet-stream";
request.ContentType = "application/x-www-form-urlencoded";
request.Method = WebRequestMethods.Http.Post;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (MemoryStream memoryStream = new MemoryStream())
{
    responseStream.CopyTo(memoryStream);

    Crc32 crc = new Crc32();
    crc.Update(memoryStream.GetBuffer());

    if (crc.Value.ToString("X") != m_ServerData.CRC)
        throw new Exception("Malformed zip file received!");

    ZipFile file = new ZipFile(memoryStream);
    // ...
}

そして、ここに私の応答があります:

header('Cache-Control: must-revalidate, pre-check=0, post-check=0');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename="'.$zipname.'"');
header('Content-Length: '.filesize($filepath));
header('Content-Transfer-Encoding: binary');
header('Content-Type: application/octet-stream');
header('Expires: 0');
header('Pragma: public');

readfile($zippath);

さて、ここで整合性チェックが行われます。PHP によって計算された CRC32 チェックサムは、私のクライアントで ICSharpCode.SharpZipLib の Crc32 クラスを使用して計算したものとはまったく異なります。例えば:

PHP サーバー -> CF83A609

C# クライアント -> 3FB78619

また、別の PHP 関数を使用しようとしました。

$zipcontents = file_get_contents($zippath); 
$crc = crc32($zipcontents);
$zipchecksum = strtoupper(dechex(crc32($zipcontents)));
$mysqli->query("INSERT INTO files VALUES (NULL, '$zipname', '$zippath')");

しかし、結果はまた違ったものになります。

PHP サーバー -> A6A642D0

C# クライアント -> 3FB78619

そのため、PHP がチェックサムを計算するために使用しているバッファは、クライアントがサーバーから受け取るバッファとは異なるようです。うーん...誰かが解決策を持っていますか?

4

1 に答える 1

1

同様の問題がありましたが、問題はチェックサムアルゴリズムではありませんでした。
問題は、ダウンロードされたファイルがアップロードされたファイルと異なっていたことです。

まず、ファイルのアップロードが ddbb に保存されているものと同じであることを確認します。

MySQL では: SELECT fileName, md5(fileBlob) FROM yourTable;

次に、ダウンロードしたファイルがアップロードしたファイルと同じであることを確認します。

ここで整合性を確認できますhttp://onlinemd5.com/

私が開発していた REST が間違った変換を行っていることに気付きました。

遅いことはわかっていますが、お役に立てば幸いです。

于 2015-06-03T09:35:08.453 に答える