2

我想知道如何通过 post 方法保护数据,还是足够安全?!

我在我的门户网站上使用以下内容:

 protected Control CreateCommForm(string action)
        {
            HtmlGenericControl frm = new HtmlGenericControl("form");
            frm.Attributes.Add("method", "post");
            frm.Attributes.Add("target", "_blank");
            frm.Attributes.Add("action", action.TrimEnd());
            /////////////////////////////////////////
            HtmlGenericControl hdn_sal_a = new HtmlGenericControl("input");
            hdn_sal_a.Attributes.Add("id", "hdn_give");
            hdn_sal_a.Attributes.Add("name", "hdn_give");
            hdn_sal_a.Attributes.Add("type", "hidden");
            hdn_sal_a.Attributes.Add("value", Session["empnum"].ToString());
            /////////////////////////////////////////
            HtmlGenericControl hdn_sal_b = new HtmlGenericControl("input");
            hdn_sal_b.Attributes.Add("id", "hdn_give_b");
            hdn_sal_b.Attributes.Add("name", "hdn_give_b");
            hdn_sal_b.Attributes.Add("type", "hidden");
            hdn_sal_b.Attributes.Add("value", Session["secret"].ToString());
            /////////////////////////////////////////
            HtmlGenericControl hdn_sal_result = new HtmlGenericControl("input");
            hdn_sal_result.Attributes.Add("id", "hdn_give_rr");
            hdn_sal_result.Attributes.Add("name", "hdn_give_rr");
            hdn_sal_result.Attributes.Add("type", "hidden");
            hdn_sal_result.Attributes.Add("value", ((99 * int.Parse(Session["secret"].ToString())) + 761).ToString());
            /////////////////////////////////////////
            HtmlGenericControl hdn_sal_h = new HtmlGenericControl("input");
            hdn_sal_h.Attributes.Add("id", "hdn_givel_h");
            hdn_sal_h.Attributes.Add("name", "hdn_give_h");
            hdn_sal_h.Attributes.Add("type", "hidden");
            hdn_sal_h.Attributes.Add("value", role_h.Hash((int.Parse(Session["secret"].ToString()) - 55).ToString(), "SHA512", null));
            /////////////////////////////////////////
            frm.Controls.Add(hdn_give);
            frm.Controls.Add(hdn_give_b);
            frm.Controls.Add(hdn_give_rr);
            frm.Controls.Add(hdn_give_h);
            body.Controls.Add(frm);
            return frm;

        }

然后

        Control frm = new Control();
        frm = CreateCommForm(process_url);
        Control crl_data = FormContent(block_type, block_id, frm);
        PlaceHolder1.Controls.Add(crl_data);

我检查从该门户打开的任何网站中的这些值,如下所示:

var hr = HttpContext.Current.Request.UrlReferrer;
if (hr != null && !string.IsNullOrEmpty(hr.AbsolutePath))
    {
        if (Request.UrlReferrer.AbsolutePath.Contains("master_portal"))
        {

            if (Request.Form["hdn_give"] != null && !string.IsNullOrEmpty(Request.Form["hdn_give"].ToString())
               && Request.Form["hdn_give_b"] != null && !string.IsNullOrEmpty(Request.Form["hdn_give_b"].ToString()) &&
               Request.Form["hdn_give_rr"] != null && !string.IsNullOrEmpty(Request.Form["hdn_give_rr"].ToString()) &&
               Request.Form["hdn_give_h"] != null && !string.IsNullOrEmpty(Request.Form["hdn_give_h"].ToString())
               )
            {
              //------
            }

这是否足够安全,或者有更好的方法来做到这一点?

4

2 回答 2

1

你是说防伪?

见链接如下:

http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-%28csrf%29-attacks

于 2013-06-09T08:56:01.467 回答
1

正如我在代码中看到的,您在此行中包含了用户会话与发布数据的连接,这就是Session["secret"]它的哈希值。

HtmlGenericControl hdn_sal_result = new HtmlGenericControl("input");
hdn_sal_result.Attributes.Add("id", "hdn_give_rr");
hdn_sal_result.Attributes.Add("name", "hdn_give_rr");
hdn_sal_result.Attributes.Add("type", "hidden");
hdn_sal_result.Attributes.Add("value", ((99 * int.Parse(Session["secret"].ToString())) + 761).ToString());

HtmlGenericControl hdn_sal_h = new HtmlGenericControl("input");
hdn_sal_h.Attributes.Add("id", "hdn_givel_h");
hdn_sal_h.Attributes.Add("name", "hdn_give_h");
hdn_sal_h.Attributes.Add("type", "hidden");
hdn_sal_h.Attributes.Add("value", role_h.Hash((int.Parse(Session["secret"].ToString()) - 55).ToString(), "SHA512", null));

现在在回发时,如果您检查该值是否相同,则可以避免一次攻击。基于您的代码:

if( Request.Form["hdn_give_rr"] != null &&
    Request.Form["hdn_give_rr"].ToString()
      == ((99 * int.Parse(Session["secret"].ToString())) + 761).ToString())
{
    // User come from the same session, having the same cookie.

}
于 2013-06-09T09:40:53.683 回答