保护登录和评论表单免受 CSRF 攻击

2024-04-30

我读过很多关于CSRF保护的文章(这个不错 http://seclab.stanford.edu/websec/csrf/csrf.pdf)以及关于SO的各种问题,但它们似乎都没有足够的信息来回答我的问题。

我正在开发自己的 CMS,我想保护我的登录和评论表单。我将允许匿名用户在我的网站上发表评论。

我网站上的所有表单均使用令牌进行保护。我已经知道这种方法,但问题是它需要一个活动会话(即用户登录后)。登录和评论表单的问题在于,几乎任何人都可以访问它们,并且不需要您登录 - 在这种情况下,针对 CSRF 的最佳保护是什么?

在上面的链接中,我读到当用户尝试登录时可以创建一个“预会话”,然后继续使用通常的反 CSRF 方法(例如为用户的会话分配令牌),但我不知道如何实现这一目标。

引用头是一个弱解决方案,所以我想我不应该打扰。据我测试,Origin 标头仅在 Google Chrome 中受支持。自定义标头怎么样? XMLHTTPRequest 似乎是一种可能性,但是,我实际上花了三个多小时在 Google 上查找一些有关如何在其网站上实施此类安全措施的信息。但即使我可以使用自定义标头,由于 HTTP 标头可以完全伪造,因此它是否会变得毫无用处?

那么问题来了:我应该如何保护我的登录和评论表单免受 CSRF 的影响?

Edit:以下是我上面提供的链接中的一些附加信息:

我们建议严格的 Referer 验证以防止登录 CSRF 因为登录表单通常通过 HTTPS 提交,其中 Referer 对于合法请求,标头可靠地存在。如果有登录请求 缺少Referer header,网站应拒绝防御请求 反对恶意打压。

and

秘密验证令牌可以防御登录CSRF,但开发者 经常忘记实施防御,因为在登录之前,有 没有要绑定 CSRF 令牌的会话。使用秘密验证 为了防止登录 CSRF,站点必须首先创建一个 “presession”,实现基于token的CSRF保护,然后 身份验证成功后转换到真实会话。

读完上面的引文后,我无法结束这个争论。其中之一提到使用引用标头,但我不太确定它是否真的大大提高了网络应用程序的安全性。

Edit 2:使用验证码怎么样?


CSRF 问题与某人使用登录的用户凭据提交某些内容有关。这是一个很大的问题,因为恶意网站可以像任何刚刚浏览过您网站的人一样做事。如果您谈论的是可以匿名使用而无需登录的表单,则 CSRF 风险要小得多,因为从其他站点发布到表单的收益要少得多 - 因为任何人都可以使用相同的权限直接执行此操作。

所以我不明白为什么需要针对非登录表单防范 CSRF。

如果您确实想要这样做,会话前令牌在技术上可能与真实会话类似,但只是一种更轻量级的令牌。除了生成的令牌之外,它实际上不会包含任何其他内容。


编辑:关于使用 PHP 提供的 $_SESSION 作为会话前令牌,这是 PHP 的标准会话机制。如果您想使用它,那么是的,仅此而已。

但是,您不会被迫这样做,而且我个人也不会这样做,因为它会消耗所有访问者的服务器内存,而这并不是真正需要的。对于更有效的机制,基本上你需要 a) 一个标识用户的 cookie,b) 存储在服务器端的一些东西,告诉 cookie 是有效的(如果需要,它对谁有效,即 ip)。对于更轻量级的方法,您可以创建一个令牌,将其存储在 cookie 中,并在表单中生成与该令牌匹配的内容作为隐藏字段,并在提交时匹配这些令牌(如 Devesh 所解释的)。后者会阻止从其他站点提交表单,前者甚至会阻止恶意站点在您的站点上进行查找并尝试向最终用户设置任何 cookie 的情况。所以我能想到的三种方法:

  • 只是阻止来自其他站点的图像请求 - 使用 POST 可以防止这种情况
  • 防止从另一个站点提交表单 - 与 cookie 匹配的表单隐藏字段可防止此情况发生
  • 防止从在您的网站上进行预查找的另一个网站提交表单 - 这需要 IP 验证,存储在服务器端的内容,例如数据库中与 cookie 匹配的 IP

EDIT2:在验证码上,它们的主要用例是防止自动(暴力)登录尝试。他们也会解决登录表单上的 CSRF 请求问题,但这样做有点过分了。为了防止暴力登录攻击,在某些情况下可能需要它们,尽管可能需要更用户友好的东西,以免过多降低可用性。也许像小猫认证 http://thepcspy.com/kittenauth/ :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保护登录和评论表单免受 CSRF 攻击 的相关文章

  • 在没有默认 java.policy 文件的情况下运行 Java 安全管理器

    我不想修改 java 主目录中的任何内容 但是 我担心有时我的默认 java policy 文件可能过于宽松 当我使用以下命令运行 java 时 有没有办法使用指定的策略文件作为唯一的策略文件 Djava security manager
  • setcookie with expire=0 浏览器关闭后不会过期

    我使用setcookie来制作一个过期 0的cookie 从 PHP 文档来看 link http php net manual en function setcookie php cookie 过期的时间 这是一个 Unix 时间戳 所以
  • 用户可以更改 PHP 中 $_SESSION 的值吗?

    这是我的想法 我想知道是否可能 将信息存储在 PHP 的 SESSION 变量中有多安全 在 SESSION 变量中存储变量有两个潜在的 不安全 风险 另一个答案所描述的第一个称为 会话固定 这里的想法是 由于会话 ID 存储在 cooki
  • 图像随机损坏(但刷新后加载)并显示“资源解释为图像但使用 MIME 类型 text/html 传输”

    我目前正在开发一个简单的 php 网站 问题是 我的整个网站中的图像 发生在所有 php 文件中 随机损坏并显示错误资源解释为图像 但以 MIME 类型 text html 传输但是 如果我尝试多次刷新页面 可以再次加载图像并且错误消失 我
  • 您的要求无法解析为 laravel 的一组可安装软件包

    我使用 5 7v Laravel 和 7 2 1v PHP 和 Composer 最新版本 但是当我想创建新项目时出现这些错误 Your requirements could not be resolved to an installabl
  • Xdebug V3 不会停止 VSCode 中的断点

    我正在尝试使用 VSCode 在 XAMPP 上进行调试 但没有成功 我知道有很多关于这个的问题 我已经尽了一切努力 但仍然行不通 我的 xdebug 扩展确实有一件奇怪的事情 我目前使用 PHP v7 4 12 和 Xdebug 版本 3
  • 如何从网站网址中隐藏 .html 扩展名

    我知道这个问题以前曾被问过 但有人知道隐藏 html 扩展名的好方法吗 我已经尝试了许多代码和许多答案https stackoverflow com https stackoverflow com 但我没有看到结果 那是我再问你一次 我有一
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 如何在 JavaScript 中创建服务器端进度指示器?

    我想在我的网站中创建一个部分 用户可以在其中进行一些简单的操作update纽扣 这些中的每一个update按钮将发送到服务器 并在幕后进行长时间的处理 当服务器处理数据时 我希望用户有某种进度指示器 例如进度条或文本百分比 我使用 jQue
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 在 foreach 中使用 QueryPath 的多个查找

    我正在使用 QueryPath 和 PHP 这发现 eventdate 没问题 但不会为 dtstart 返回任何内容 qp htmlqp url foreach qp gt find table schedule gt find tr a
  • Facebook API sdk 4.0 - 将照片发布到 Facebook

    我正在尝试创建一个应用程序 用户可以在其中浏览照片并将其从计算机提交到 Facebook 为此 他们首先必须将照片上传到服务器 然后使用 Facebook 请求将此图像发布到 Facebook 我正在使用多部分 表单数据 这就是我到目前为止
  • Asp.net Identity 注销其他用户

    我正在使用 Asp net Identity 来验证用户身份 并尝试从管理端锁定任何用户 但是当我锁定任何在线用户时 它并没有注销 我读过很多关于我的问题的评论 但它们都不起作用 我尝试使用 UserManager UpdateSecuri
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • 如何在codeigniter中将上传图片比例限制为16:9?

    这是我用来上传图像的代码 this gt load gt library upload ext pathinfo file name PATHINFO EXTENSION img name now ext imgConfig upload
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess
  • PHP 表单 - 带验证蜜罐

    我有以下内容 效果很好 但对垃圾邮件机器人开放 我想放入蜜罐 而不是验证码 下面的代码适用于验证姓名 电子邮件 消息 但我无法让它与蜜罐一起工作 任何人都可以查看 蜜罐 代码并告诉我如何修复它吗 我希望表单给出 success2 不允许垃圾
  • 如何在 PHP 5.6 中通过 php.ini 设置“verify_peer_name=false”SSL 上下文选项

    案例 我想打开 SSL 连接localhost而 SSL 证书是 FQDN 的问题 问题 没有进行特殊处理就行 下面的程序失败并显示以下消息 PHP Warning stream socket enable crypto Peer cert
  • PHP更改小数点分隔符

    在某些情况下 PHP 会在操作后更改小数点分隔符 下面是一个示例 为什么小数点分隔符变成 这是一个多语言网站 在西班牙语版本中 区域设置设置为西班牙语 es ES 小数点分隔符为 这就是为什么正在改变 解决方案是强制 LC NUMERIC

随机推荐

  • SQL 从一列到另一列搜索字符串

    以前可能有人问过这个问题 但我不知道如何搜索它 我想查找 Column2 中的字符串是否是 Column1 的一部分 或者根本没有在 Column1 中使用 Column1 Column2 ABCDE JKL XC XC PQ A XYZ
  • matplotlib 中的低对比度图像(对比度拉伸)问题

    当读取低对比度图像时 它会自动采用以下示例 In 1 from PIL import Image In 2 import numpy as np In 3 import matplotlib pyplot as plt In 4 img I
  • 迭代 C++ 映射中的键

    有没有办法迭代键 而不是 C 映射对 地图是关联容器 因此 迭代器是一对key val 如果您只需要键 则可以忽略该对中的值部分 for std map
  • rvm 与 sqlite3 冲突

    Users dev rvm gems ruby 1 9 2 head rails3 gems sqlite3 ruby 1 3 1 lib sqlite3 sqlite3 native bundle BUG 分段错误 ruby 1 8 7
  • 为 iPhone 应用程序设置自动构建服务器的最佳实践?

    我正在为我们的 iPhone 应用程序设置一个自动夜间构建服务器 并寻求有关哪些有效 哪些无效的建议 基本上 至少每晚运行所有单元测试并向我们的内部网站发布新的临时版本 所有开发人员都使用笔记本电脑 笔记本电脑将在夜间关闭 因此我正在考虑购
  • 如何在Android上的Xamarin.Forms中的NavigationBar左侧添加ToolbarItem?

    I need to have关闭button 在本例中 在左侧 of 导航栏 如下 我只需要弹出窗口 因此其他元素 导航不存在潜在问题 谷歌对此有一些建议 但我只看到了 iOS 示例 这并不是一个需要处理的大问题 iOS custom re
  • 如何在 GitHub 页面上添加与 index.md 共享相同主题的新页面?

    目前 我的 GitHub 帐户上有一个主页 https
  • 将树形图导出为 R 中的表格

    我想将 hclust dendrogram 从 R 导出到数据表中 以便随后将其导入到另一个 自制 软件中 str unclass fit 提供了树状图的文本概述 但我正在寻找的实际上是一个数字表 我查看了 Bioconductor ctc
  • “便捷初始化程序缺少对另一个初始化程序的‘自我’调用”

    我正在尝试将我的代码转换为 iOS 8 项目 我需要一些关于如何修复此警告的解释 Convenience initializer missing a self call to another initializer 在此代码上 instan
  • 有没有办法在 Visual Studio 或 MATLAB 中“映射”程序执行顺序?

    我所说的 地图 是指我有一个 主 函数 它调用内部的许多其他程序 我希望能够看到哪个文件首先运行 第二个 第三个等等 基本上 我希望能够请参阅这个大型 OOP 设计程序 创建者没有为其制作 UML 类图 中的依赖项列表和顺序 以帮助破译代码
  • 带 Retrofit 的 JSON 解析

    我最近开始使用Retrofit 我对此了解不多 我用谷歌搜索了这个问题 但没有答案适合我的问题 这是 JSON 响应 results description eng This is second time testing img url t
  • 窗口的打开事件和窗口句柄

    如何从刚刚打开的 Outlook 窗口获取窗口句柄 IntPtr OutLook Items items oFolder Items foreach OutLook MailItem mail in items mail Display I
  • TailwindCSS / PurgeCSS 提取器字符串删除一些类

    对于 Tailwind 和 PostCSS PurgeCSS 来说相当新 所以希望这是一个相当简单的修复 In my tailwind config js 我扩展了一些间距值 包括添加 0 5 值以与默认的 Tailwind 间距比例对齐
  • docker asp.net core 容器在 mysql 容器之后启动

    我有一个带有 asp net core 的 docker 容器和一个带有 mysql 的容器 现在我需要等待 mysql 容器启动并准备好 两个容器都通过 docker compose yml 启动 就像是https github com
  • VSS 的有效绑定根?

    我正在尝试修复我拥有的项目的视觉源安全绑定 当我选择我认为项目应该绑定到的位置时 我会收到一个对话框 其中显示 The folder you chose is not a valid binding root for the project
  • 如何防止文件被直接 URL 访问?

    我正在使用 Apache 并且我的目录中有一个示例 Web 文件夹本地主机 喜欢 http localhost test 文件位于test文件夹 index html sample jpg htaccess 样本来源index html i
  • Angular2 选择 ngValue null

    这就是我想要做的 我想要一个选择列表绑定到具有 ngValue 的对象数组 但第一个选项需要是带有null value Model this managers id null name None id 1 name Jeffrey id 2
  • div 中的内部 html 更改时触发事件

    I have div对于一些信息 填写为 innerHTML单击按钮 目标是我想要 slideDown添加 div 中的文本时的 div 可以用 jQuery 来实现吗 Example div div 将文本添加到 div document
  • Android 表单验证 UI 库

    有iOSUS2表单验证器 https github com ustwo US2FormValidator用于用户输入验证的库 见下图 我认为该库比默认情况下在某些内容未验证时弹出警报更好 我正在寻找如何在 Android 上做这样的事情 有
  • 保护登录和评论表单免受 CSRF 攻击

    我读过很多关于CSRF保护的文章 这个不错 http seclab stanford edu websec csrf csrf pdf 以及关于SO的各种问题 但它们似乎都没有足够的信息来回答我的问题 我正在开发自己的 CMS 我想保护我的