Введение в CSRF
CSRF (подделка по перекрестному запросу), китайское имя: подделка по перекрестному запросу, также известная как: езда на атаку/сеанс одного клика, аббревиатура: CSRF/XSRF.
Для конкретных введений и методов атаки SCR, пожалуйста, см. Внедрение энциклопедии Baidu и анализ большого парня:
Энциклопедия CSRF Baidu кратко обсуждает методы атаки 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> <version>${spring.security.version}</version> </dependency> <dependency> <groupId> org.springframework.security </GroupId> <artifactId> Spring-Security-web </artifactid> <sersive> $ {Spring.security.version} </version> </repertive> <Degifact> <groupD> org.springframework.security </GroupId> <Artifactid> <groupD> org.springframework.security </GroupId> <tryfactId> <groupD> <версия> $ {spring.security.version} </version> </dependency> 2. Конфигурация web.xml
<Filter> <Filter-name> SpringSecurityFilterChain </filter-name> <filter-class> org.springframework.web.filter.delegatingfilterproxy </class> </filter> <urlter-pater-patern> <filter-mame> springsecurityfilterchain </filter> <url </filter-карты>
3. Конфигурация файла конфигурации пружины
<bean id = "csrfSecurityRequestMatcher"> </bean> <cerection: http auto-config = "true" use-expressions = "true"> <cerection: заголовки> <безопасность: options disabled = "true"/> </security: heders> <creates: csrf request-matcher-ref = "csrfsecurity"/>> </безопасность: http>
4. Настроить класс реализации requestMatcher CSRFSecurityRequestMatcher
Этот класс используется для настройки, какие запросы не требуют перехвата и фильтрации. Если CSRF настроен, все HTTP -запросы перехватываются CSRffilter, а в CSRFFFILTER есть закрытый класс DefaulTRequiRescSrfMatcher.
Исходный код 1: DefaultRequiRescSrfMatcher Class
Частный статический окончательный класс DefaultRequiRescSrfMatcher реализует requestMatcher {private final Hashset <string> Althmethods; private defaultRequiRescSrfMatcher () {this.allowedMethods = new Hashset (arrays.aslist (new String [] {"get", "Head", "trace", "Options"})); } public boolean matches (httpservletrequest) {return! this.allowedmethods.contains (request.getmethod ()); }} Из этого исходного кода мы можем обнаружить, что метод POST исключен, то есть только четыре типа методов, таких как Get | Head | Trace | Параметры будут выпущены. HTTP -запросы других методов должны проверить, правильным ли токен _CSRF. Обычно при вызове службы интерфейса REST в методе POST нет токена _CSRF, который приведет к сбою нашего интерфейса покоя. Нам нужно настроить класс, чтобы выпустить интерфейс этого типа. Давайте посмотрим на наши индивидуальные фильтры:
Исходный код 2: CSRFSecurityRequestmatcher Class
открытый класс csrfSecurityRequestmatcher реализует requestMatcher {private alpermentmethods = pattern.compile ("^(get | Head | Trace | Options) $"); private regexrequestmatcher onprotectedMatcher = new RegexRequestMatcher ("^/rest /.*", null); @Override public boolean matches (httpservlectrequest) {if (oldedmethods.matcher (request.getmethod ()). Matches ()) {return false; } return! onprotectedMatcher.matches (запрос); }} Примечание. Как правило, службы интерфейса REST, которые мы определяем, находятся с /REST /, поэтому, если ваш проект не используется, или в проекте нет услуг REST, этот класс может быть полностью опущен.
5. Конфигурация запроса POST
Как правило, в нашем проекте есть общий файл JSP, на который ссылается каждая страница, поэтому мы можем сделать следующую конфигурацию в общем файле:
<meta name = "_ csrf" content = "$ {_ csrf.token}"/> <meta name = "_ csrf_header" content = "$ {_ csrf.headername}"/> <cript> var token = $ ("meta [name = '_ csrf']"). var Header = $ ("meta [name = '_ csrf_header']"). attr ("content"); $ .ajaxSetup ({beforesend: function (xhr) {if (header && token) {xhr.setrequestheader (заголовок, токен);}}}); </script> $ .ajaxSetup означает добавление этого заголовка и токена ко всем нашим запросам или поместите его в форму. Обратите внимание, что _CSRF должен соответствовать конфигурации в файле конфигурации Spring Security, а по умолчанию _CSRF.
Анализ исходного кода
Мы знаем, что, поскольку CSRF настроен, все HTTP -запросы будут перехвачены CSRFFILTER, поэтому после просмотра исходного кода CSRFFILTER вы сможете с первого взгляда. Здесь мы смотрим только на конкретный метод фильтрации:
Исходный код 3: Dofilterinternal метод csrffilter
Защищенная void dofilterinternal (httpservletrequest, httpservletresponse, Filterchain FilterChain) Throws ServletException, ioException {request.setattribute (httpservletresponse.class.getName (), ответ); Csrftoken csrftoken = this.tokenrepository.loadtoken (запрос); Boolean MissingToken = csrftoken == null; if (hipploadtoken) {// Если токен пуст, это означает, что при первом доступе к нему обращаются к нему доступ, генерируйте объект токена csrftoken = this.tokenrepository.generatetoken (request); this.tokenrepository.savetoken (csrftoken, запрос, ответ); } request.setattribute (csrftoken.class.getname (), csrftoken); // Поместите объект токена в запрос, обратите внимание, что ключом здесь является csrftoken.getParameterName () = _CSRF, поэтому мы пишем его до смерти на странице. request.setattribute (csrftoken.getparametername (), csrftoken); // Эта машина - это фильтр, который мы настраиваем в файле конфигурации пружины, то есть GET, HEAD, TRACE, OPTIONS и NEH REST не обрабатывают if (! This.RequirecsrfprotectionMatcher.matches (запрос)) {FilterChain.Dofilter (запрос, ответ); } else {string actualToken = request.getheader (csrftoken.getheadername ()); if (factiontoken == null) {factiontoken = request.getParameter (csrftoken.getParametername ()); } if (! csrftoken.getToken (). equals (factiontoken)) {if (this.logger.isdebugenabled ()) {this.logger.debug ("Invalid csrf token, найденный для" + urlutils.buildfulrequesturl (запрос)); } if (missomToken) {this.AccessDeniedHandler.handle (запрос, ответ, новый MissCsrftOkenexception (ActualToken)); } else {this.AccessDeniedHandler.handle (запрос, ответ, новый InvalidcsrftOkenexception (csrftoken, factiontoken)); }} else {filterchain.dofilter (запрос, ответ); }}}Как видно из исходного кода, запросы POST, кроме наших индивидуальных фильтров, требуют проверки токена.
Первоначально я хотел сделать скриншот, чтобы получить корпус, а затем использовать точку останова, чтобы увидеть состояние передачи значения страницы и фон ... Однако я не могу загрузить здесь фотографии и сходить с ума. Хорошо, так много, чтобы суммировать! Если у вас есть неправильное письмо или у вас есть другие вопросы, вы можете оставить сообщение для общения.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.