laravel csrf_token在wordpress中使用curl获取url请求时不匹配

时间:2017-12-05 09:02:39

标签: wordpress curl laravel-5.4 csrf-protection

抱歉我的英语不好。我想同样的问题,但有不同的想法,但我的想法是不同的。我要问的是我使用curl请求在wordpress中编译了laravel url。请查看我的代码,以便更好地理解我想说的内容。

<html lang="{{ config('app.locale') }}">
     <head>
        <!-- ImportInWordpressHeaderStart -->
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        <meta name="csrf-token" content="{{ csrf_token() }}" />
        <title>{{ config('app.name', 'Laravel') }}</title>
        <!-- ImportInWordpressHeaderEnd -->
       </head>
   <body> .......
         //here is my complete html part ignore it.


    <!-- ImportInWordpressFooterScriptStart -->
    <script type="text/javascript" src="{{ asset('frontend/js/jquery-2.1.0.min.js') }}"></script>
    <script type="text/javascript">
    $("#login form").on('submit', function (e){
                e.preventDefault();

                $.ajax({
                    type: $(this).attr('method'),
                    url: $(this).attr('action'),
                    data: $(this).serialize(),
                    dataType: "json", ........... // the rest ajax code.

    <!-- ImportInWordpressFooterScriptEnd -->

代码的上半部分是完全正常工作的laravel。现在看看我在wordpress主题页眉和页脚中做了什么。

<?php  
//Laravel Home url 
$url = "http://example.com/home";  
$ch = curl_init();  

// set URL and other appropriate options  
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  

// grab URL and pass it to the browser  
$output = curl_exec($ch);  

//Regular expression to excerpt the targeted portion  
preg_match('/<!-- ImportInWordpressFooterStart -->(.*?)<!--ImportInWordpressFooterEnd -->/s', $output, $footer);  
preg_match('/<!-- ImportInWordpressFooterScriptStart -->(.*?)<!-- ImportInWordpressFooterScriptEnd -->/s', $output, $script);
// close curl resource, and free up system resources  
curl_close($ch);  
?> 

<?php echo $footer[0]; 
      wp_footer();
      echo $script[0];
?>

现在在laravel当我点击登录时它完全登录但是当我尝试在wordpress中执行相同操作时它会给我令牌不匹配错误

 http://example.com/wordpress

wordpress和laravel都在同一个域中我不想再在wordpress中创建相同的laravel页眉。任何更好的主意将不胜感激。感谢

1 个答案:

答案 0 :(得分:1)

每个cookie会话都有自己的csrf令牌,您似乎不会尝试将curl收到的cookie会话ID传输到浏览器,反之亦然。因此,浏览器将尝试使用它自己的cookie会话登录,并使用curl的cookie会话的csrf标记,这肯定不会起作用。

解决方案:使用浏览器的cookie,使curl获取csrf令牌。

$str='';
foreach($_COOKIE as $n=>$v){
    $str.=$name.'='.$v.'; ';
}
curl_setopt($ch,CURLOPT_COOKIE,$str);
  • 请注意,如果您获取csrf令牌的页面发送任何新的Set-Cookie标头,则curl不会将这些标头传输到浏览器,除非您编写一些代码以明确执行此操作。例如,如果您获取cookie会话的URL也重新生成浏览器的会话ID,并且您没有将新ID传输到浏览器,它将有效地注销浏览器。