<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                {% raw %} # Symfony CSRF 教程 > 原文: [http://zetcode.com/symfony/csrf/](http://zetcode.com/symfony/csrf/) Symfony CSRF 教程展示了如何在 Symfony 應用中實現 CSRF 保護。 ## Symfony Symfony 是一組可重用的 PHP 組件和一個用于 Web 項目的 PHP 框架。 Symfony 于 2005 年發布為免費軟件。Symfony 的原始作者是 Fabien Potencier。 Symfony 的靈感來自 Djanog,Spring 和 ROR 框架。 ## CSRF 跨站點請求偽造(CSRF)是一種攻擊,其中惡意用戶試圖使合法用戶在不知情的情況下提交他們不打算提交的數據。 CSRF 攻擊專門針對狀態更改請求,而不是數據盜竊。 成功的 CSRF 攻擊可以迫使用戶執行狀態更改請求,例如轉移資金或更改其個人數據詳細信息。 CSRF 保護的工作原理是在表單中添加一個隱藏字段,該字段包含僅應用和用戶知道的值(令牌)。 這樣可以確保用戶(而非其他實體)正在提交給定的數據。 `symfony/security-csrf`組件提供`CsrfTokenManager`用于生成和驗證 CSRF 令牌。 默認情況下,使用 Symfony 表單組件創建的表單包括 CSRF 令牌,Symfony 會自動檢查它們,因此我們無需采取任何措施來防止 CSRF 攻擊。 `csrf_token()` Twig 函數為用戶呈現 CSRF 令牌。 ## Symfony CSRF 保護示例 在下面的示例中,我們手動創建一個表單,為其實現 CSRF 保護。 在此應用中,我們在`routes.yaml`文件中定義路由。 ```php $ composer create-project symfony/skeleton csrf-app $ cd csrf-app ``` 使用`composer`,我們創建一個新的 Symfony 框架項目并定位到項目目錄。 ```php $ composer require symfony/security-csrf ``` 我們安裝`security-csrf`包。 ```php $ composer require server --dev ``` 我們安裝開發 Web 服務器。 `config/routes.yaml` ```php index: path: / controller: App\Controller\AppController::index process-form: path: /process controller: App\Controller\AppController::processForm ``` 我們為應用定義了兩個路由。 `index`路由顯示帶有表單的主頁。 `process-form`處理提交的表單并檢查 CSRF 令牌。 `src/Controller/AppController.php` ```php <?php namespace App\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class AppController extends AbstractController { public function index() { return $this->render('home/index.html.twig'); } public function processForm(Request $request) { $token = $request->request->get("token"); if (!$this->isCsrfTokenValid('myform', $token)) { return new Response('Operation not allowed', Response::HTTP_BAD_REQUEST, ['content-type' => 'text/plain']); } $name = $request->request->get("name"); $email = $request->request->get("email"); $msg = "$name with $email saved"; return new Response($msg, Response::HTTP_CREATED, ['content-type' => 'text/plain']); } } ``` `AppController`具有兩個動作:`index()`和`processForm()`。 ```php public function index() { return $this->render('home/index.html.twig'); } ``` `index()`函數呈現主頁。 主頁包含 HTML 表單。 ```php $token = $request->request->get("token"); ``` 我們從請求中使用`get()`方法檢索 CSRF 令牌。 ```php if (!$this->isCsrfTokenValid('myform', $token)) { return new Response('Operation not allowed', Response::HTTP_BAD_REQUEST, ['content-type' => 'text/plain']); } ``` 我們使用`isCsrfTokenValid()`方法檢查令牌的有效性。 如果令牌無效,我們將返回帶有`Response::HTTP_BAD_REQUEST`代碼的響應。 令牌`myform`的名稱在模板的 HTML 表單中指定。 `templates/home/index.html.twig` ```php {% extends 'base.html.twig' %} {% block title %}Home page{% endblock %} {% block body %} <section class="ui container"> <form class="ui form" action="{{ path('process-form') }}" method="post"> <input type="hidden" name="token" value="{{ csrf_token('myform') }}" /> <div class="field"> <label>Name:</label> <input name="name" type="text"> </div> <div class="field"> <label>Email</label> <input name="email" type="text"> </div> <button class="ui button" type="submit">Send</button> </form> </section> {% endblock %} ``` 這是帶有表單的主頁的 Twig 模板。 表單使用語義 UI 庫進行樣式設置。 ```php <form class="ui form" action="{{ path('process-form') }}" method="post"> ``` 表單動作指向`process-form`路徑。 表單的方法是 POST,這意味著必須進行 CSRF 保護。 ```php <input type="hidden" name="token" value="{{ csrf_token('myform') }}" /> ``` 我們使用 CSRF 令牌添加隱藏的輸入。 令牌是使用`csrf_token()`生成的。 `templates/base.html.twig` ```php <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> {% block title %}Welcome! {% endblock %} </title> <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" rel="stylesheet"> </head> <body> {% block body %}{% endblock %} </body> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.js"></script> </html> ``` 這是基本模板文件。 它加載語義 UI 庫。 ```php $ php bin/console server:run ``` 我們運行該應用。 ```php $ curl -d "name=Peter&email=peter@example.com" -X POST http://localhost:8000/process Operation not allowed ``` 如果我們嘗試繞過表單并嘗試使用`curl`工具訪問控制器操作,則會收到錯誤消息。 在本教程中,我們在 Symfony 應用中實現了 CSRF 保護。 您可能也對以下相關教程感興趣: [Symfony 驗證教程](/symfony/validation/), [Symfony 表單教程](/symfony/form/), [PHP 教程](/lang/php/)或列出[所有 Symfony 教程](/all/#symfony)。 {% endraw %}
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看