asp.net - CSRF 标记修复
问题描述
我有一个强化结果说以下行需要一个秘密来防止 CSRF
<form id ="form1test1" runat="server">
我在页面加载时生成了一个随机 GUID,我想在表单发布时对其进行比较。
我在经典 asp 中看到将令牌作为查询字符串放入操作中
我在尝试:
<form "form1test1" runat="server"
action='<%# string.Concat(Eval("login.aspx/?Token="),"",Eval(Session["Token"].ToString()))%> '> >
我得到的最好的是打印出文本而不是值,不在后面的代码中这样做并不能解决在 fortify 中尝试类似的结果
<form "form1test1" runat="server" action="login.aspx/?Token=12345DEF">
解决方案
防止 CSRF 攻击的更好方法(它在我的项目中起作用)是在您的母版页中实现它,如下所示:
添加将为您处理 CSRF 验证的新类:
public class CsrfHandler
{
public static void Validate(Page page, HiddenField forgeryToken)
{
if (!page.IsPostBack)
{
Guid antiforgeryToken = Guid.NewGuid();
page.Session["AntiforgeryToken"] = antiforgeryToken;
antiforgery.Value = antiforgeryToken.ToString();
}
else
{
Guid stored = (Guid)page.Session["AntiforgeryToken"];
Guid sent = new Guid(antiforgery.Value);
if (sent != stored)
{
// you can throw an exception, in my case I'm just logging the user out
page.Session.Abandon();
page.Response.Redirect("~/Default.aspx");
}
}
}
}
然后在您的母版页中实现它:
MyMasterPage.Master.cs:
protected void Page_Load(object sender, EventArgs e)
{
CsrfHandler.Validate(this.Page, forgeryToken);
...
}
MyMaster.Master:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:HiddenField ID="forgeryToken" runat="server"/>
...
</form>
希望你会发现这很有用。
推荐阅读
- python - 如何从 Python 发送“字符串数组”作为 HTTP 发布数据?
- python-3.x - 我正在尝试使用 pyspark 从 S3 读取 csv
- arrays - 来自 Firestore 文档的 Flutter lis 和子列表
- next.js - How to extract query from `getServerSideProps` to separate helper file?
- google-bigquery - Report Engines Interface with Bigquery datasource
- javascript - 删除元素后如何重新渲染列表
- python - 如何在 python 中单击带有 selenium 的 div 来下载文件(错误:rootNode.elementsFromPoint 不是函数)
- linux - emails from webmail go straight to SPAM - Plesk
- javascript - Detect if the file uploaded is password protected on the browser - Javascript
- reactjs - React Testing Library user-event throws error `TypeError: root.elementFromPoint is not a function`