1. 概念

1.1. CSRF

CSRF(Cross-site request forgery) 跨站请求伪造,即一个网站中包含多个网站域名时,恶意网站网站请求会伪造用户(使用用户的cookies,session)去访问目标网站,危害较大,浏览器默认禁止。
f603918fa0ec08fa63cbd7e654ee3d6d54fbdaac.jpg

1.2. Nginx实现跨站访问的方式

  • 使用反向代理到其它网站时,nginx会自动在response中添加 Access-Control-Allow-Origin 信息,浏览器解析后会允许到该站点的请求
  • 使用add_header将Access-Control-Allow-Origin添加到响应头部

2. 案例

2.1. 直接访问

[root@centos-81 ~]# cat /usr/share/nginx/html/csrf.html ## 测试页

  1. <html>
  2. <head>
  3. <script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
  4. <script>
  5. $(document).ready(function(){
  6. $.ajax({
  7. type:"GET",
  8. url:"http://192.168.1.50/api/test.html",
  9. success:function(data){
  10. alert("success!")
  11. },
  12. error:function (e) {
  13. alert("failed!")
  14. }
  15. });
  16. });
  17. </script>
  18. </head>
  19. <h2> CSRF TEST </h2>
  20. </html>

直接在浏览器访问:
201211281402437422.png

2.2. 使用反向代理

[root@centos-81 ~]# sed -i ‘s/192.168.1.50/192.168.1.81/‘ /usr/share/nginx/html/csrf.html
[root@centos-81 ~]# cat /etc/nginx/conf.d/localhost.conf

  1. location ~ ^/api/.* {
  2. proxy_pass http://192.168.1.50 ;
  3. }

201211281402437422.png

2.3. 使用add_header

[root@centos-81 ~]# sed -i ‘s/192.168.1.81/192.168.1.50/‘ /usr/share/nginx/html/csrf.html
[root@centos-50 html]# cat /usr/local/nginx/conf/nginx.conf ## 在192.168.1.81添加是没用的

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. add_header Access-Control-Allow-Origin http://192.168.1.81 ;
  5. add_header Access-Control-Allow-Methods GET,POST,PUT,HEAD ;

201211281402437422.png