2011-01-12 10 views
0

ich die folgende Sicherheitswarnung für den Code mit Blick unten erwähnt:Fehlende Prüfung gegen Null

if (null != FacesContext.getCurrentInstance()) { 

      FacesContext context = FacesContext.getCurrentInstance(); 

      if ((null != context.getApplication()) 
        && (null != context.getApplication().getVariableResolver())) { 

       if (null != context.getApplication().getVariableResolver() 
         .resolveVariable(context, "userBean")) { 

        Object requestObject = context.getApplication() 
          .getVariableResolver().resolveVariable(context, 
            "userBean"); 

        String pRange = ((UserBean) requestObject) 
          .getPageSize_REM(); 

        page_range = Integer.parseInt(pRange); 

       } 

      } 
     } 

Die Warnung, die ich in Fortify Bericht bin immer ist:

Abstract: Verfahren getList() in GrantAccessBackingBean.java kann einen Nullzeiger in Zeile 2357 dereferenzieren, weil es den Rückgabewert von resolveVariable() nicht überprüft, der m igight gibt null zurück. Sink: GrantAccessBackingBean.java:2353 requestObject = ResolveVariable (...): VariableResolver.resolveVariable kann return NULL() 2351 .resolveVariable (Kontext, "userBean")) { 2352 Objekt requestObject = context.getApplication() 2353 .getVariableResolver(). ResolveVariable (Kontext, 2354 "userBean");

Obwohl ich es mir die alle null Referenzzustand bin Überprüfung noch gibt. Irgendein Vorschlag ? Vielen Dank im Voraus

+5

Aahh. Yoda bedingt. Schön. –

+1

Was hat das mit Sicherheit zu tun? – skaffman

+0

@goreSplatter +1 @Vibhas http: // stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307 # 2430307 – zengr

Antwort

2

Meine Vermutung wäre, dass der Bericht nicht feststellen kann, dass

if (null != context.getApplication().getVariableResolver() 
         .resolveVariable(context, "userBean")) 

und

Object requestObject = context.getApplication() 
           .getVariableResolver() 
           .resolveVariable(context, "userBean"); 

zum gleichen bewerten. Warum Sie nicht den Code ändern zu

Object requestObject = context.getApplication() 
           .getVariableResolver() 
           .resolveVariable(context, "userBean"); 
if (requestObject != null) 
{ 
} 

Und sehen, ob das hilft.

(Und wenn es nicht der Fall ist, es wird zumindest der doppelten Anrufe loszuwerden, die für jede NULL-Prüfung jetzt vorhanden sind)

+0

Dies sollte das Problem lösen, da im ursprünglichen Code keine Garantie besteht, dass * der zweite * resolveVariable() Aufruf wird nicht Null (die Prüfung wird nur gegen den * ersten * Aufruf ausgeführt. –

0

Es gibt nicht genügend Informationen ist Ihre statische Inspektionswerkzeug zu sagen, ob bereitstellt guter Rat oder nicht.

Wenn eine verwaltete Bean ist, ist eine Nullprüfung redundant - sie wird vom Resolver instanziiert. Es wäre jedoch besser, die Abhängigkeitsinjektion von JSF zu verwenden, als manuelle Suchvorgänge auf diese Weise durchzuführen.

Wenn dieser Code während einer HTTP-Anforderung aufgerufen wird, sind alle diese Null-Prüfungen Junk. Es gibt keinen gültigen Status, in dem FacesContext.getCurrentInstance() null zurückgibt. Null-Anwendungen und Resolver zeigen an, dass der Lebenszyklus nicht korrekt initialisiert wurde (oder gerade eingerichtet oder abgebrochen wird; in diesem Fall werden keine Anfragen beantwortet). Was machen Sie, wenn Sie die Bean nicht auflösen können? Wenn die Anwendung einen ungültigen Status annimmt, sollten Sie den Code normalerweise nur fehlschlagen lassen.

Verwandte Themen