2016-11-21 5 views
1

간단한 양식을 UserFrosting에 제출하려고 시도하고 있으며 데이터를 수정하지 않고 테스트 만 성공 메시지 만 표시합니다. 나는 Lesson 2에서 제공된 지침을 따르는하지만 난 CSRF 문제로 실행 :UserFrosting forms - CSRF 토큰이 잘못되었거나 누락되었습니다.

Invalid or missing CSRF token.

내가 놓친 게 무엇 :

UserFrosting 다음과 같은 오류를 반환? 나뭇 가지 파일의 맨 아래에 추가 된 스크립트 부분

<form class="form-horizontal" role="form" name="requestDescription" action="{{site.uri.public}}/soap/requests/desc/edit/{{ keyname }}" method="post"> 
    <div class="form-group"> 
     <label for="input_group" class="col-md-2 control-label">Name</label> 
     <div class="col-md-10"> 
      <input type="text" id="input_name" class="form-control" name="lgname" placeholder="{{ name }}"> 
     </div> 
    </div> 
    <div class="form-group text-center"> 
     <button type="submit" class="btn btn-success text-center">Update</button> 
    </div> 
</form> 

:이 시점까지는 UserFrosting는 :(

에게 양식 소화하기 매우 쉬웠다 여기

<script> 
    $(document).ready(function() { 
     // Load the validator rules for this form 
     var validators = {{validators | raw}}; 
     ufFormSubmit(
       $("form[name='requestDescription']"), 
       validators, 
       $("#userfrosting-alerts"), 
       function(data, statusText, jqXHR) { 
        // Reload the page on success 
        window.location.reload(true); 
       } 
     ); 
    }); 
</script> 

이 내 컨트롤러의 두 가지 기능 :

public function soapRequestDescriptionEditPage($keyname){ 
    if (!$this->_app->user->checkAccess('uri_soap_requests')){ 
     $this->_app->notFound(); 
    } 
    $requestDetails = $this->soapRequestReadMeta($keyname); 

    $schema = new \Fortress\RequestSchema($this->_app->config('schema.path') . "/forms/soap-request-description-edit.json"); 
    $this->_app->jsValidator->setSchema($schema); 

    $this->_app->render('soap/soap-request-description-edit.twig', [ 
     "name" => $requestDetails['name'], 
     "description" => $requestDetails['description'], 
     "keyname" => $keyname, 
     "validators" => $this->_app->jsValidator->rules() 
    ]); 
} 

public function test(){ 
    if (!$this->_app->user->checkAccess('uri_soap_requests')) { 
     $this->_app->notFound(); 
    } 
    $post = $this->_app->request->post(); 
    $ms = $this->_app->alerts; 
    $requestSchema = new \Fortress\RequestSchema($this->_app->config('schema.path') . "/forms/soap-request-description-edit.json"); 
    $rf = new \Fortress\HTTPRequestFortress($ms, $requestSchema, $post); 
    $ms->addMessageTranslated("success", "Everyone's title has been updated!", $post); 
    $rf->sanitize(); 
    if (!$rf->validate()) { 
     $this->_app->halt(400); 
    } 
    $data = $rf->data(); 
} 

Entr 의 index.php 파일에서 이거 :

$app->post('/soap/requests/desc/edit/:request_id/?', function() use ($app) { 
    $controller = new UF\SoapController($app); 
    return $controller->test(); 
}); 
$app->get('/soap/requests/desc/edit/:request_id/?', function ($request_id) use ($app) { 
    $controller = new UF\SoapController($app); 
    return $controller->soapRequestDescriptionEditPage($request_id); 
}); 

마지막으로, 스키마 :

{ 
    "lgname" : { 
    "validators" : { 
     "length" : { 
     "min" : 1, 
     "max" : 150, 
     "message" : "The new title must be between 1 and 150 characters long." 
     } 
    }, 
    "sanitizers" : { 
     "raw" : "" 
    } 
    } 
} 
+0

을 당신은 당신이 여기 https://www.owasp.org/index.php/ CSRF 손쉽게 찾을 수 요청할 때마다에서 CSRF 토큰을 보낼 필요 Cross-Site_Request_Forgery_ (CSRF) – MONTYHS

+1

https://github.com/userfrosting/UserFrosting/wiki/On-the-matter- 이 오류에 대한 자세한 내용은 CSRF 토큰을 참조하십시오. 또한, 당신의 URL과 컨트롤러의 "비누"가 SOAP을 가리키는 지 확신 할 수 없지만, UserFrosting은 대부분 RESTful 접근법을 사용합니다. 이것은 SOAP와는 확연히 다릅니다. – alexw

답변

0

그것은 내 코드가 괜찮다고 밝혀졌다. UserFrosting 양식 처리에 영향을주는 관련이없는 자바 스크립트 오류가 페이지에있었습니다. 이러한 오류를 수정하면 UserFrosting이 양식을 처리 할 수있었습니다.

자체에 주 ... 그것은 자바 스크립트 오류 : 4 UserFrosting의로

0

, 당신은 명시 적으로 폼에 숨겨진 CSRF 입력 필드를 추가해야합니다 위해 콘솔에 보는 습관합니다. (이 자바 스크립트에서 순수하게 구성되어있는 경우, 예를 들어) 형태 않고있다 요청에 대한

<form class="form-horizontal" role="form" name="requestDescription" action="{{site.uri.public}}/soap/requests/desc/edit/{{ keyname }}" method="post"> 
    {% include "forms/csrf.html.twig" %} 
    <div class="form-group"> 
     <label for="input_group" class="col-md-2 control-label">Name</label> 
     <div class="col-md-10"> 
      <input type="text" id="input_name" class="form-control" name="lgname" placeholder="{{ name }}"> 
     </div> 
    </div> 
    <div class="form-group text-center"> 
     <button type="submit" class="btn btn-success text-center">Update</button> 
    </div> 
</form> 

당신은 : 당신이 나뭇 가지의 include 태그를 사용하여 삽입 할 수 있습니다 이러한 필드를 포함하는 부분 템플릿 forms/csrf.html.twig가있다 글로벌 site.csrf 변수에서 CSRF 토큰 이름과 값을 잡을 수 있습니다

var userName = 'luke'; 
var fieldName = 'lgname'; 

var data = { 
    'value': fieldValue 
}; 

data[site.csrf.keys.name] = site.csrf.name; 
data[site.csrf.keys.value] = site.csrf.value; 

var url = site.uri.public + '/api/users/u/' + userName + '/' + fieldName; 

return $.ajax({ 
    type: "PUT", 
    url: url, 
    data: data 
}).done(function (response) { 
    window.location.reload(); 
});