我通过在每个表单的隐藏输入中包含一个带有 PHP 的令牌来实现 CSRF 保护。当然,每个令牌只能使用一次。
但是,有一些工具(例如任何 Web 开发人员工具)允许更改输入。例如,我可以更改页面输入表单:我可以启用禁用的复选框,并且我可以将输入框更改为 textarea 框,而无需重新加载页面或类似的东西。CSRF 不会捕捉到这样的变化。
那么,为了保证安全,我需要验证多少表格?我是否需要验证每个输入以确保它没有被更改,包括选择、复选框、隐藏输入等?当然,假设这些没有被改变是不安全的吗?
您需要验证(在服务器端)需要验证的所有内容。究竟需要验证什么取决于许多因素和个人选择。其中一些可能是为了安全,但在许多情况下只需要最低限度。在大多数情况下,验证是为了改善或创造用户体验。
例如,您可以检查他们是否输入了有效的电子邮件地址。如果他们没有,你可以给他们留言。如果您不这样做,您的应用程序不会发生任何不良情况,但用户将无法收到您的电子邮件。
验证和卫生之间也有一个重要的区别。卫生是为了安全(例如防止注射)。进行验证是为了确保输入满足与您的应用程序一起正常工作的要求,尽管不正确的输入可能是良性的。净化后的恶意输入也可能是有效的。
所有输入必须经过消毒。无需验证输入,因此这完全取决于您。
CSRF 保护与验证无关。它所做的只是阻止用户使用您的表单从外部来源发出请求,因为生成和查看令牌的唯一方法是首先向您的站点发出请求。
我们正在尝试使用 CSRF 来确保请求来自可靠的来源。例如,您需要做的是确保隐藏字段中的值是正常的。只有当它与服务器呈现表单时提供的相同时,它才可能是理智的(前提是您的令牌足够强大)。
现在表单中的字段是否更改,只是您的应用程序逻辑。它与 csrf 没有任何关系。如果令牌是理智的,那么它来自正确的来源。现在,如果是同一个人在例如表单中输入值,则不在 csrf 的范围内。