1

私は、ユーザーがさまざまなファイル形式をアップロードできるWebサイトに取り組んでいます。ユーザーがパスワードで保護されたファイルをアップロードできないように制限する必要があります。

ファイルをアップロードする前に、Microsoft Officeファイル(Word、Powerpoint、Excel)がパスワードで保護されているかどうかを確認する方法はありますか?http://social.msdn.microsoft.com/Forums/en/oxmlsdk/thread/34701a34-f1d4-4802-9ce4-133f15039c69に従って、次のように実装しましたが、「ファイルに破損したデータが含まれています」というエラーがスローされます。 、パスワードで保護されたファイルを開こうとしている間。

 using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(mem, false))
 {
     DocumentProtection dp =
         wordDoc.MainDocumentPart.DocumentSettingsPart.Settings.GetFirstChild<DocumentProtection>();
     if (dp != null && dp.Enforcement == DocumentFormat.OpenXml.OnOffValue.FromBoolean(true))
     {
         return true;
     }
 }

これを決定する他の方法はありますか?

4

5 に答える 5

5

このコードを試してみてください:

public static Boolean IsProtected(String file)
{
    Byte[] bytes = File.ReadAllBytes(file);

    String prefix = Encoding.Default.GetString(bytes.Take(2).ToArray());

    // Zip and not password protected.
    if (prefix == "PK")
        return false;

    // Office format.
    if (prefix == "ÐÏ")
    {
        // XLS 2003
        if (bytes.Skip(0x208).Take(1).ToArray()[0] == 0xFE)
            return true;

        // XLS 2005
        if (bytes.Skip(0x214).Take(1).ToArray()[0] == 0x2F)
            return true;

        // DOC 2005
        if (bytes.Skip(0x20B).Take(1).ToArray()[0] == 0x13)
            return true;

        // Guessing
        if (bytes.Length < 2000)
            return false;

        // DOC/XLS 2007+
        String start = Encoding.Default.GetString(bytes.Take(2000).ToArray()).Replace("\0", " ");

        if (start.Contains("E n c r y p t e d P a c k a g e"))
            return true;

        return false;
    }

    // Unknown format.
    return false;
}
于 2013-01-15T22:01:12.353 に答える
1

申し訳ありませんが、ここでのパーティーに少し遅れています。私はまだ50の評判を持っていないので、Tomasso Belluzoの答えについてコメントすることはできませんが、それを実装すると、次のことがわかりました。

  1. プレフィックスを取得するには、Encoding.UTF7.GetStringを使用します
  2. 「EncryptedPackage」を確認するには、Encoding.Unicode.GetStringを使用します。これにより、すべての\0を削除する必要がなくなります。
于 2019-10-07T11:31:06.273 に答える
0

質問に答えるには:

ファイルがパスワードで保護されているかどうかを確認するには、ブラウザでそのファイルを開いて処理する必要があります。現在、クライアント側でファイルを開くための唯一のメカニズムは、普遍的にサポートされていないHTML5のFileAPIを使用することです。これは、これを行うための信頼できる方法がないことを意味します。

これで、サーバー上でファイルをテストして、パスワードで保護されているかどうかを判断し、ルールに応じてファイルを破棄するか保存することができます。

ちなみに、提供したコードはサーバー側のコードです。破損した例外をキャッチするように変更し、ファイルが破損しているかパスワードで保護されているかについてのメッセージを、パスワードで保護されたファイルのアップロードを許可しない方法に関するメモとともにユーザーに表示するだけです。

于 2013-01-16T00:08:09.600 に答える
0

以下は.aspxソースファイルにあります

 Page Language="C#" AutoEventWireup="true" CodeBehind="TestForm.aspx.cs" Inherits="TestApp.TestForm"

 !DOCTYPE html PUBLIC
 Reference Page ="~/TestForm.aspx" // Note: Removed all HTML tags
    protected void Upload_Click(オブジェクト送信者、EventArgs e)
    {{
        String noPW = "C:\\ Users \\ David \\ Desktop \\ Doc1.docx";
        String pwProtected = "C:\\ Users \\ David \\ Desktop \\ Test.docx";
    // if(isProtected(pwProtected))
    // result.Text =( "ドキュメントはパスワードで保護されています");
    // そうしないと
    // result.Text =( "ドキュメントはパスワードで保護されていません");

        if(isProtected(noPW))
            result.Text =( "ドキュメントはパスワードで保護されています");
        そうしないと
            result.Text =( "ドキュメントはパスワードで保護されていません");
    }

以下は、ファイルの背後にある.aspx.csコードにあります

    システムを使用する;
    System.Collections.Genericを使用します。
    System.Linqを使用します。
    System.Webを使用します。
    System.Web.UIを使用します。
    System.Web.UI.WebControlsを使用します。
    Microsoft.Office.Interop.Wordを使用する;
    System.Runtime.InteropServicesを使用します。
    Microsoft.Office.Interop.Wordを使用する;


    名前空間TestApp
    {{
        パブリック部分クラスTestForm:System.Web.UI.Page
        {{

            保護されたvoidPage_Load(オブジェクト送信者、EventArgs e)
            {{

            }
            public static bool isProtected(object filePath)
            {{
                アプリケーションmyapp=new Application();

                オブジェクトpw="thispassword";
                試す
                {{

                    //Word文書でこれを試す
                    myapp.Documents.Open(ref filePath、PasswordDocument:ref pw); //開いてみます
                    myapp.Documents [ref filePath] .Close(); //開いている場合は閉じます    
                }
                キャッチ(COMException ex)
                {{
                    if(ex.HResult == -2146822880)//パスワードが無効なためにドキュメントを開くことができません
                        trueを返します。
                    そうしないと
                        Console.WriteLine(ex.Message + "" + ex.HResult); //デバッグのために、この1つのドキュメントのみをテストしました。
                }
                falseを返します。
            }
        }

    }

少なくとも私のコンピューターでは、両方のファイルに対して期待される出力が得られますが、これは、コードの徹底的なテストと呼ばれるものとは異なります。さらに、FileUploadコントロールを使用してファイルをアップロードしようとしましたが、アップロードされたファイルがデスクトップからのものであるという理由だけで、COMエラー「CannotFind C:\ Windows \ System \ fileName.docx」が表示されましたが、私よりもASP.NETに精通しているので、なぜそれが発生するのかをおそらく知っているでしょう。いずれにせよ、このコードは試してみるだけのものです。それがお役に立てば幸いです。

于 2013-01-15T23:36:55.170 に答える
-1

notmeのように、ファイルの一部をアップロードするに、ファイルがパスワードで保護されているかどうかを判断する方法を知りませんが、この質問に対する受け入れられた答えは、技術的には優れていますが、少しやり過ぎです。

ファイルがパスワードで保護されているかどうかをテストするためのはるかに簡単で高速な方法については、パスワードで保護されたWordファイルの検出を参照してください。

また、VBA / Sで解決策を探しているこの質問を見つけた人のために、以下は前者のバージョンであり、後者に簡単に適応できます。www.ozgrid.com/forum/showthread.php?t=148962。err.numberを使用してファイルがパスワードで保護されているかどうかを判断するのではなく、err.number = 5408(保護されている場合に間違ったパスワードでスローされるもの)を確認することをお勧めします。

于 2017-03-08T15:39:30.520 に答える