簡體   English   中英

使用itemdatabound在轉發器項目中解密

[英]decrypt in repeater item using itemdatabound

我正在使用ASP中繼器顯示圖像,我希望對其進行加密,但是我不知道每次中繼器發射物品時如何解密

//client side <asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand" OnItemDataBound="Repeater1_ItemDataBound" >

`//server side
//decrypt method
private void DecryptFile(string inputFile, string outputFile)
    {

        {
            string password = @"myKey123"; // Your Key Here

            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);

            FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);

            RijndaelManaged RMCrypto = new RijndaelManaged();

            CryptoStream cs = new CryptoStream(fsCrypt,
                RMCrypto.CreateDecryptor(key, key),
                CryptoStreamMode.Read);

            FileStream fsOut = new FileStream(outputFile, FileMode.Create);

            int data;
            while ((data = cs.ReadByte()) != -1)
                fsOut.WriteByte((byte)data);

            fsOut.Close();
            cs.Close();
            fsCrypt.Close();

        }
    }

`

protected void Repeater1_ItemDataBound(object source, RepeaterCommandEventArgs e)
        {
            if (e.CommandName =="openimage")
            {
                string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });
                DecryptFile(commandArgs[0], commandArgs[0]);

            }
        }

當我嘗試運行它時,它給了我錯誤CS0123:'Repeater1_ItemDataBound'沒有重載匹配委托'System.Web.UI.WebControls.RepeaterItemEventHandler'

請幫助我,因為我是C#新手

您的事件處理程序上的方法簽名不正確。 您需要將RepeaterCommandEventArgs更改為RepeaterItemEventArgs

protected void Repeater1_ItemDataBound(object source, RepeaterItemEventArgs e)
{
}

這樣可以解決您的錯誤,但是對於您要嘗試執行的操作,我不確定這是否是顯示解密圖像的好方法。 我建議創建一個通用處理程序,該處理程序將通過傳入ID即時解密您的圖像,一旦傳遞ID,您就可以解密並寫到屏幕上。

public class DisplayImage : IHttpHandler
{

    /// <summary>
    /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler" /> interface.
    /// </summary>
    /// <param name="context">An <see cref="T:System.Web.HttpContext" /> object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.</param>
    public void ProcessRequest(HttpContext context)
    {
        if (!this.HasAccess())
        {
            context.Response.End();
            return;
        }

        string requestFileName = context.Request.QueryString["FileName"];

        DecryptFile(requestFileName, context);
    }

    /// <summary>
    /// Gets a value indicating whether another request can use the <see cref="T:System.Web.IHttpHandler" /> instance.
    /// </summary>
    /// <value><c>true</c> if this instance is reusable; otherwise, <c>false</c>.</value>
    /// <returns>true if the <see cref="T:System.Web.IHttpHandler" /> instance is reusable; otherwise, false.</returns>
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    /// <summary>
    /// Determines whether the user has access to display an image.
    /// </summary>
    /// <returns><c>true</c> if this instance has access; otherwise, <c>false</c>.</returns>
    private bool HasAccess()
    {
        // Check if user is logged in and has permissions
        // to do the decryption
        // use your own logic here
        return true;
    }

    /// <summary>
    /// Decrypts the file and outputs to the response buffer
    /// </summary>
    /// <param name="inputFile">The input file.</param>
    /// <param name="context">The context.</param>
    private void DecryptFile(string inputFile, HttpContext context)
    {
        if (PathTraversalCheck(inputFile))
        {
            context.Response.End();
            return;
        }

        // get the base directory
        inputFile = Path.Combine(ConfigurationManager.AppSettings["filedirectory"], inputFile);

        if (!File.Exists())
        {
            context.Response.End();
            return;
        }

        string password = @"myKey123"; // Your Key Here

        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] key = UE.GetBytes(password);

        using (FileStream encryptedFile = new FileStream(inputFile, FileMode.Open))
        {
            RijndaelManaged rijndael = new RijndaelManaged();

            using (MemoryStream output = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(encryptedFile, rijndael.CreateDecryptor(key, key), CryptoStreamMode.Read))
                {
                    // write to the memory stream
                    var buffer = new byte[1024];
                    var read = cryptoStream.Read(buffer, 0, buffer.Length);
                    while (read > 0)
                    {
                        output.Write(buffer, 0, read);
                        read = cryptoStream.Read(buffer, 0, buffer.Length);
                    }

                    cryptoStream.Flush();

                    // output to the response buffer
                    context.Response.ContentType = "image/jpeg";
                    context.Response.BinaryWrite(output.ToArray());
                }
            }

        }
    }

    /// <summary>
    /// Checks for a path traversal attack
    /// </summary>
    /// <param name="inputFile">The input file.</param>
    /// <returns>System.String.</returns>
    private bool PathTraversalCheck(string inputFile)
    {
        if (inputFile.Contains(".") || inputFile.Contains('\\') || inputFile.Contains('/'))
        {
            return true;
        }

        return false;
    }
}

在轉發器中,您只需要將src設置為img的img標簽放置到處理程序中即可。

<ItemTemplate>
    <img src="DisplayImage.ashx?FIleName=<%# DataBinder.Eval(Container.DataItem, "FileName" )%>" />
</ItemTemplate>

我還需要更改的其他地方是,我不會將密鑰存儲在源代碼中,而通過對dll進行反編譯很容易讀取。 相反,您應該將其存儲在web.config中並加密web.config。 請查看http://msdn.microsoft.com/library/dtkwfdky.aspx以獲取說明。

您需要更正中繼器事件:

void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {

}

另外,要處理轉發器中的事件,應將代碼移至Repeater1__ItemCommand事件。

void Repeater1__ItemCommand(Object Sender, RepeaterCommandEventArgs e) {       
        if (e.CommandName =="openimage")
        {
            string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });
            DecryptFile(commandArgs[0], commandArgs[0]);

        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM