如何加密从asp.net中的gridview传递的查询字符串值?

时间:2012-12-23 17:59:48

标签: asp.net

我想加密从asp.net中的网格视图行超链接选择传递的查询字符串值,因为要防止SQL注入攻击。我有兴趣在UrlRewriting方法或加密方法中完成这项工作。哪种方法好用?怎么做?

3 个答案:

答案 0 :(得分:2)

以下代码将“firstName = stephen& surname = oberauer”转换为“arg = x2lk1rkBmXvilYTzLpfm5E9tkYSzEZnSkl7se0hNP0HsXbD82OYfiA ==”并返回。

这是一个简单的加密/解密类(确保使用您自己的密钥)

public static class Crypt
{
    // Must be random
    private static readonly byte[] key = new byte[24] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 };

    public static string Encrypt(string input)
    {
        byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input);
        TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
        tripleDES.GenerateKey();
        tripleDES.Key = key;
        tripleDES.Mode = CipherMode.ECB;
        tripleDES.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tripleDES.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
        tripleDES.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

    public static string Decrypt(string input)
    {
        byte[] inputArray = Convert.FromBase64String(input);
        TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
        tripleDES.Key = key;
        tripleDES.Mode = CipherMode.ECB;
        tripleDES.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tripleDES.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
        tripleDES.Clear();
        return UTF8Encoding.UTF8.GetString(resultArray);
    }
}

假设你有一个如下所示的网格视图:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:HyperLinkField DataNavigateUrlFields="Url" DataTextField="Name" />
    </Columns>
</asp:GridView>

您可以像这样设置网格数据:

var gridData = new[]
{  
    new { Name = "Link 1", Url = "TargetPage.aspx?arg=" + Crypt.Encrypt("firstName=stephen&surname=oberauer") },
    new { Name = "Link 2", Url = "TargetPage.aspx?arg=" + Crypt.Encrypt("firstName=joe&surname=smith") }
};
GridView1.DataSource = gridData;
GridView1.DataBind();

在您的目标网页中,您可以解码加密的查询字符串,如下所示:

var encryptedArgs = Request.QueryString["arg"];
var decryptedArgs = HttpUtility.ParseQueryString(Crypt.Decrypt(encryptedArgs));
FirstName.Text = decryptedArgs["firstName"];
Surname.Text = decryptedArgs["surname"];

为了确保您的查询字符串没有被篡改,您可以处理Decrypt方法引发的FormatException并进行测试以确保参数存在,在本例中为“firstName”和“surname”。

网址重写是一个单独的问题,如果您想让您的网址更漂亮,可以使用它。它确实与确保没有人对查询字符串进行调整有很大关系。

答案 1 :(得分:2)

为什么复杂,你可以使用row databound事件来设置Uri,转换你的querystring参数并使用Server.UrlEncode,你很高兴

<强> RowDataBoundEvent


protected void YourGrid_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType != DataControlRowType.DataRow) return;

                if (e.Row.DataItem == null) return;


                var hlobj= e.Row.FindControl("HYPERLINKID") as HyperLink;

                if ( null == hlViewTest) return;



                hlobj.NavigateUrl = String.Format("--------.aspx?whatever={0}",
                                                           Server.UrlEncode(Encrypt(whatever)));
            }
            catch (Exception ex)
            {
               //
            }


        }

加密方法:..........


 private static string Encrypt(String val)
        {
            try
            {
                var bytes = Encoding.UTF8.GetBytes(val.ToString(CultureInfo.InvariantCulture));
                var encBytes = ProtectedData.Protect(bytes, new byte[0], DataProtectionScope.LocalMachine);
                return Convert.ToBase64String(encBytes);
            }
            catch (Exception ex)
            {
              return String.Empty;
            }
        }

解密方法:------------


  private static string Decrypt(string val)
        {
            try
            {
                var bytes = Convert.FromBase64String(val);
                var encBytes = ProtectedData.Unprotect(bytes, new byte[0], DataProtectionScope.LocalMachine);
                return System.Text.Encoding.UTF8.GetString(encBytes);
            }
            catch (Exception ex)
            {
              return String.Empty;
            }
        }

在其他页面上,请使用.........

var decryptedString=Decrypt(Request["YOUR PASSING ID"] || Request.QueryString["YOUR PASSING ID"]));

答案 2 :(得分:0)

一种方法是为您要传递的每个ID创建一个GUID,并在后端的某个地方继续跟踪。所以你在查询字符串中传递Guid并用字典“解码”它回到正常的ID。

然而,这是'默默无闻',所以你仍然需要在接收页面上执行授权检查(以确保没有人对查询字符串进行调整。当然,猜测GUID权利的机会可能小于被闪电击中,你还需要检查)。