0

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

但是,有一些工具(例如任何 Web 开发人员工具)允许更改输入。例如,我可以更改页面输入表单:我可以启用禁用的复选框,并且我可以将输入框更改为 textarea 框,而无需重新加载页面或类似的东西。CSRF 不会捕捉到这样的变化。

那么,为了保证安全,我需要验证多少表格?我是否需要验证每个输入以确保它没有被更改,包括选择、复选框、隐藏输入等?当然,假设这些没有被改变是不安全的吗?

4

3 回答 3

2

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

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

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

所有输入必须经过消毒。无需验证输入因此这完全取决于您。

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

于 2013-04-30T16:15:57.163 回答
2

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

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

于 2013-04-30T16:19:06.150 回答
0

我认为你在这里得到了错误的结果。令牌在发送时不是表单的散列。

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

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

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

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

阅读 1 阅读2

于 2013-04-30T16:38:03.463 回答