CSRFの紹介
CSRF(クロスサイトリクエスト偽造)、中国語名:クロスサイトリクエスト偽造、ワンクリック攻撃/セッションライディング、略語:CSRF/XSRF。
SCRFの具体的な紹介と攻撃方法については、Baidu Encyclopediaの導入とBig Guyの分析を参照してください。
CSRF Baidu Encyclopediaは、CSRF攻撃方法について簡単に説明します
構成手順
1。JARパッケージに依存します
<properties> <spring.security.version> 4.2.2.Release </spring.security.version> </properties> <dependency> <groupid> org.springframework.security </groupid> <artifactid> spring-security-core </artifactid> <バージョン<groupid> org.springframework.security </groupid> <artifactid> spring-security-web </artifactid> <version> $ {spring.security.version} </version> </dependency> <redency> <groupid> org.springFramework.security <バージョン> $ {spring.security.version} </version> </dependency> 2.web.xml構成
<filter> <filter-name> springsecurityfilterchain </filter-name> <filter-class> org.springframework.web.filter.delegatingfilterproxy </filter-class> </filter> <フィルターマッピング> <フィルター - マッピング> springsecurityfilterchain </filltnam
3。スプリング構成ファイル構成
<bean id = "csrfsecurityrequestmatcher"> </bean> <security:http auto-config = "true" use-expressions = "true"> <security:headers> <security:frame-options = "true"/> </security:headers> <security:csrf request-matref = "csrf =" csrf = "CSRF =" CSRF = "CSRF =" CSRF = " </security:http>
4. RequestMatcher CSRFSeCurityRequestMatcherの実装クラスをカスタマイズします
このクラスは、インターセプトとフィルタリングを必要としないリクエストをカスタマイズするために使用されます。 CSRFが構成されている場合、すべてのHTTP要求はCSRffilterによってインターセプトされ、CSRffilterにプライベートクラスDefaultrequiresCsrfMatcherがあります。
ソースコード1:defaultrequirescsrfmatcherクラス
プライベート静的最終クラスdefaultrequirescsrfmatcherは、requestmatcher {private final hashset <string> apportmethods; private defaultrequirescsrfmatcher(){this.allowedMethods = new Hashset(arrays.aslist(new String [] {"get"、 "head"、 "trace"、 "options"})); } public boolean matches(httpservletrequest request){return!this.allowedmethods.contains(request.getMethod()); }}このソースコードから、postメソッドが除外されていることがわかります。つまり、Get | head | trace |オプションなどの4種類のメソッドのみがリリースされます。他のメソッドのHTTP要求は、_CSRFトークンが正しいかどうかを確認する必要があります。通常、POSTメソッドでRESTインターフェイスサービスを呼び出すと、_CSRFトークンはありません。これにより、RESTインターフェイスが失敗します。このタイプのインターフェイスをリリースするには、クラスをカスタマイズする必要があります。カスタマイズされたフィルターを見てみましょう。
ソースコード2:csrfsecurityrequestmatcherクラス
パブリッククラスcsrfsecurityrequestmatcherは、requestmatcherを実装します{private pattern aplatedmethods = pattern.compile( "^(get | head | trace | options)$"); private regexRequestMatcher unprotectedMatcher = new RegexRequestMatcher( "^/rest/.*"、null); @Override public boolean matches(httpservletrequest request){if(approadmethods.matcher(request.getMethod())。matches()){return false; } return!unprotectedMatcher.matches(request); }}注:一般的に、私たちが定義するRESTインターフェイスサービスはすべて /REST /であるため、プロジェクトを使用していない場合、またはプロジェクトに休憩サービスがない場合、このクラスは完全に省略できます。
5.ポスト要求構成
一般に、プロジェクトには共通のJSPファイルがあり、各ページで参照されるため、共通ファイルで次の構成を作成できます。
<Meta name = "_ csrf" content = "$ {_ csrf.token}"/> <meta name = "_ csrf_header" content = "$ {_ csrf.headername}"/> <script> var token = $( "meta [name = '_ csrf']")。 var header = $( "meta [name = '_ csrf_header']")。attr( "content"); $ .ajaxsetup({beforesend:function(xhr){if(header && token){xhr.setRequestheader(header、token);}}}); </script> $ .ajaxsetupとは、このヘッダーとトークンをすべてのリクエストに追加するか、フォームに配置することを意味します。 _CSRFは、Spring Securityの構成ファイルの構成と一致し、デフォルトは_CSRFであることに注意してください。
ソースコード分析
CSRFが構成されているため、すべてのHTTP要求がCSRffilterによって傍受されるため、CSRffilterのソースコードを調べた後、一目で原則について明確になることがわかっています。ここでは、特定のフィルタリング方法のみを見ています。
ソースコード3:csrffilterのdofilterinternalメソッド
保護されたvoid dofilterinternal(httpservletrequest request、httpservletresponse応答、filterchain filterchain)は、servletexception、ioexception {request.setattribute(httpservletresponse.class.getname()、response)をスローします。 csrftoken csrftoken = this.tokenrepository.loadtoken(request); Boolean MissingToken = csrftoken == null; if(missingtoken){//トークンが空の場合、それが初めてアクセスするとき、トークンオブジェクトを生成することを意味しますcsrftoken = this.tokenrepository.generatetoken(request); this.tokenrepository.savetoken(csrftoken、request、response); } request.setattribute(csrftoken.class.getName()、csrftoken); //トークンオブジェクトをリクエストに入れます。ここのキーはcsrftoken.getParametername()= _csrfであることに注意してください。 request.setattribute(csrftoken.getParametername()、csrftoken); //このマシンは、Spring構成ファイルでカスタマイズするフィルターです。つまり、Get、Head、Trace、Options、およびRESTが処理しない場合(!this.recirecsrfprotectionMatcher.matches(request)){filterchain.dofilter(request、response); } else {string eracttoken = request.getheader(csrftoken.getheadername()); if(actualtoken == null){altualtoken = request.getParameter(csrftoken.getParametername()); } if(!csrftoken.getToken()。equals(eactaltoken)){if(this.logger.isdebugenabled()){this.logger.debug( "" + urlutils.buildfullrequesturl(request)); } if(missingtoken){this.accessdeniedhandler.handle(request、response、new missingcsrftokenexception(eactytoken)); } else {this.accessdeniedhandler.handle(request、response、new invalidcsrftokenexception(csrftoken、actualtoken)); }} else {filterchain.dofilter(request、response); }}}ソースコードからわかるように、カスタマイズされたフィルター以外の要求を投稿する必要があります。
もともと、私はスクリーンショットを撮ってケースを取得したかったのですが、ブレークポイントを使用してページと背景の値伝送ステータスを確認したいと考えていました。ただし、ここに写真をアップロードして夢中になりません。 OK、要約することはたくさんあります!間違った文章がある場合や他の質問がある場合は、メッセージを残してコミュニケーションをとることができます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。