[英]How can I prevent JSF 2.2 from accepting a ViewState from a different session?
我正在使用 JSF 2.2(Glassfish 4.1)。 我們的 webapp 有 Primefaces 6.0 和 Omnifaces 2.6.9 作為依賴項。 JSF state 存儲在服務器上。 例如說我有這個表單,其中userModel
是一個javax.faces.view.ViewScoped
bean。
<h:form id="user">
<p:inputText id="name" value="#{userModel.name}"/>
<p:inputText id="pass" value="#{userModel.pass}"/>
<p:commandButton id="create" value="#{msgs.lbl_add}" action="#{userModel.addUser()}"/>
</h:form>
一家公司掃描了我們的 web 應用程序是否存在安全問題,並聲稱它存在 CSRF 漏洞。 攻擊者可以像這樣向我們的一個應用用戶提供一個虛構的表單來執行不需要的操作。
<!DOCTYPE html>
<html>
<body>
<form action="http://appserver:8080/myapp/users.jsf" method="POST">
<input type="hidden" name="javax.faces.source" value="user:create"/>
<input type="hidden" name="user:create" value="user:create"/>
<input type="hidden" name="user" value="user"/>
<div>
<input type="text" name="user:name" value="FAKEUSER"/>
<input type="text" name="user:pass" value="FAKEPASSWORD"/>
<input type="text" name="javax.faces.ViewState" value="1185295409278172717:-3206872038807094332"/>
</div>
<input type="submit" name="submit" value="Create User"/>
</form>
</body>
</html>
我在 SO 上讀到 ViewState 是 JSF 防止 CSRF 的方式。 但是在我們的 web 應用程序中可能會出現以下情況(如果重要,請使用 HTTP 協議)。
file:///C:/...
或由本地網絡服務器托管)結論是我們這個場景下的webapp/JSF沒有檢查接收到的ViewState是否屬於JSESSIONID標識的session。
這不是漏洞嗎? 我怎樣才能避免這種情況?
在我們的例子中,這是我們應用程序中的一個錯誤。 我們還使用 Deltaspike 庫並在我們的應用程序中注冊了一個“Handle-All-Exceptions”class。
import org.apache.deltaspike.core.api.exception.control.ExceptionHandler;
import org.apache.deltaspike.core.api.exception.control.Handles;
import org.apache.deltaspike.core.api.exception.control.event.ExceptionEvent;
@ExceptionHandler
public class ExceptionDispatcher {
public void processException(@Handles ExceptionEvent<Throwable> evt) {
// Handle exception by just logging
}
}
如果 JSF 發現無效的 ViewState,這也會“處理” javax.faces.application.ViewExpiredException
。 結果,請求被正常處理。
更好的實現將重定向到錯誤頁面並使 session 無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.