我可能在这里完全是noob,但我仍然不确定CSRF(跨站点请求伪造)攻击到底是什么.那么让我们看看三种情况......
1)我有一个POST表单,用于编辑我的网站上的数据.我希望只有登录的用户才能编辑这些数据.
2)我有一个站点,登录的用户和访客都可以使用.该站点的某些部分仅供登录用户使用,但也有所有用户都可以使用的POST表单 - 匿名而非(例如标准联系表单).是否应该保护联系表格免受CSRF攻击?
3)我有一个完全没有身份验证系统的站点(好吧,也许这是不切实际的,所以假设它有一个管理站点,它与其余部分分开,管理部分得到了适当的保护).该站点的主要部分仅供匿名用户使用.是否需要保护其上的POST表格?
在1)的情况下,答案显然是肯定的.但是在2和3的情况下我不知道(并且2和3之间的差异是否显着?).
每当您网站上的恶意HTML或JavaScript 嵌入到已成功执行的另一个 HTML页面(或电子邮件)中时,就会有CSRF的方法.
以下是一个例子,它被放置在另一个网页中,在继续之前无辜地询问您的姓名和年龄:
请注意,该操作指向您的网站,隐藏的输入包含所需的POST信息.此示例将尝试将1000的基金(以任何货币计算)转移到帐号12345678.如果您需要在表单上登录并实际检查,那么上述内容当然只有在未知用户具有的情况下才能成功执行最近登录了您的网站,但尚未注销,或者会话尚未过期.
为了防止这种情况发生,最好的办法是在表单中添加基于请求的令牌,并在服务器端验证它.即生成一个长的,独特的,不可能猜测的随机字符串,您将其存储在会话中并嵌入作为表单的元素.提交表单时,将提交的标记值与已在会话中的标记值进行比较(并立即删除会话中的标记值).要更进一步,请使用CAPTCHA.
在您的特定情况下,我认为您实际上更担心XSS,这与CSRF相反,但反过来也可以成为CSRF的来源.XSS的一个示例是当用户在输入字段中输入以下内容时,该输入字段迟早会在同一网站上重新显示:
无论何时 - 作为管理员 - 使用带有(不可见!)表单和脚本的注释查看页面,它将成功执行.
预防XSS实际上非常简单.只需HTML转义任何用户控制的输入(即请求URL,请求标题,请求参数和请求正文),然后再在网页上显示它们.在PHP中,您可以使用htmlspecialchars()
JSTL和Java/JSP中的JSTL fn:escapeXml()
.下每个这种方式<
将被转换为<
和>
到>
这将使任何输入HTML/JS将字面原样显示,因此可以不被执行.