有多少html表单可以在不触发CSRF保护的情况下被修改


How much of an html form can be altered without triggering CSRF protection?

我通过在每个表单的隐藏输入中包含一个PHP令牌来实现CSRF保护。当然,每个令牌只能使用一次。

然而,有一些工具,比如任何web开发工具,允许更改输入。例如,我可以更改页面上的输入表单:我可以启用禁用的复选框,我可以将输入框更改为文本区域框,而无需重新加载页面或类似的操作。CSRF不会捕捉到这样的变化。

那么,我需要验证多少表单才能保证安全呢?我是否需要验证每个输入以确保它没有被更改,包括选择、复选框、隐藏输入等?当然不能假设这些都没有被修改过?

您需要验证(在服务器端)所有需要验证的内容。究竟需要验证什么取决于许多因素和个人选择。其中一些可能是为了安全,但在许多情况下,只需要最低限度的剂量。在大多数情况下,验证是为了改善或创造用户体验。

例如,您可以检查他们是否输入了有效的电子邮件地址。如果他们没有,你可以给他们留言。如果你不这样做,你的应用程序不会发生什么不好的事情,但用户将无法收到你的电子邮件。

验证 卫生之间还有一个重要的区别。卫生是为了安全(例如防止注射)。进行验证是为了确保输入符合应用程序正常工作的要求,尽管不正确的输入可能是良性的。净化后的恶意输入也有可能是有效的。

所有输入都必须经过处理。没有输入需要验证,所以这完全取决于您。

CSRF保护与验证无关。它所做的只是防止用户从外部来源使用您的表单发出请求,因为生成和查看令牌的唯一方法是首先向您的站点发出请求。

我们使用CSRF试图做的是确保请求来自可靠的来源。例如,您需要做的是确保隐藏字段中的值是一致的。只有当令牌与服务器呈现表单时提供的令牌相同时,它才可能是相同的(前提是您的令牌足够强大)。

现在,表单中的字段是否更改,只是您的应用程序逻辑。它与csrf没有任何关系。如果令牌是正常的,那么它来自正确的来源。现在,如果在表单中输入值的是同一个人,例如,不在csrf.

的范围内

我想你理解错了。令牌在发送时不是表单的散列。

其工作方式是将您的唯一令牌存储在表单的隐藏字段中,并在服务器提供原始页面时存储到会话中。

当你从用户那里得到post/GETed页面时,你检查页面上的令牌是否与先前存储在会话中的令牌相同。

必须仍然允许更改字段,否则用户将无法在表单上输入任何数据。您只是检查您收到的表单是否与您发送的表单相同,因为令牌是相同的,而不是来自其他地方的令牌,即它不是跨站点请求伪造。

在将数据存储到数据库之前,您仍然需要验证所有字段并做任何数据准备。

Reading1Reading2