XSS攻擊解決辦法 Spring mvc databinder


XSS攻擊解決辦法

一、SpringMVC架構下@InitBinder方法
Controller方法的參數類型可以是基本類型,也可以是封裝后的普通Java類型。若這個普通Java類型沒有聲明任何注解,則意味着它的每一個屬性都需要到Request中去查找對應的請求參數,服務端通過Request的getParameter方法取到的參數都是字符串形式,WebDataBinder的作用就是把字符串形式的參數轉換成服務端真正需要的類型。
每次請求到來后的參數解析都會利用WebDataBinderFactory創建一個binder對象,然后從這個binder中取得最終解析好的參數對象。WebDataBinderFactory是在InvocableHandlerMethod中定義的,即不同的Controller方法有着不同的WebDataBinderFactory。
@InitBinder用於在@Controller中標注於方法,表示為當前控制器注冊一個屬性編輯器或者其他,只對當前的Controller有效,所以要用@InitBinder實現過濾輸入,轉義輸出,就必須在每個需要的Controller中使用@InitBinder,我的方法就是創建一個BaseController,每個需要實現此業務的都去繼承它。

 

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

@Controller
public class BaseController {
    @InitBinder
    public void webInitBinder(WebDataBinder binder){
        binder.registerCustomEditor(String.class, new StringEditor());
    }
}

public class StringEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isBlank(text)) {
            return;
        }

        try {
            //Spring自帶html標簽轉義與反轉義
            super.setValue(HtmlUtils.htmlEscape(text));
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
}

  WebBindingInitializer

WebBindingInitializer:實現WebBindingInitializer,重寫initBinder注冊的屬性編輯器是全局的屬性編輯器,對所有的Controller都有效

public class WebBinderInitializerUtils implements WebBindingInitializer{

    @Override
    public void initBinder(WebDataBinder binder, WebRequest request) {
        binder.registerCustomEditor(String.class,new StringEditor());
    }
}

public class StringEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isBlank(text)) {
            return;
        }

        try {
            //Spring自帶html標簽轉義與反轉義
            super.setValue(HtmlUtils.htmlEscape(text));
        } catch (Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
}

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="cacheSeconds" value="0"/>
        <property name="webBindingInitializer">
            <bean class="cn.gov.wu.biz.utils.WebBinderInitializerUtils"/>
        </property>
    </bean>

  Spring MVC架構內還有蠻多方法可以實現此種功能,具體可見:http://www.tuicool.com/articles/BzqUja

三、HttpOnly
如果在cookie中設置了HttpOnly屬性,那么通過javaScript腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊,但是注意,只是不能讀取,但是可以覆蓋,攻擊者如果發現網站的XSS漏洞,就可以利用HttpOnly cookie發動session fixation攻擊。\\

response.setHeader("Set-Cookie", "cookiename=value;
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM