SV.STRUTS.STATIC

如果一个类扩展了 org.apache.struts.action.ActionForm 并且定义了非最终的静态字段,将报告此错误。

漏洞与风险

非最终的静态字段可能创建争用条件,因为可同时或在检查和使用之间的时间 (TOCTOU) 由表单的不同实例进行更改。

Klocwork 安全漏洞 (SV) 检查器可识别可能创建危险数据的调用;这些调用被视为不安全的来源。用户所提供的任何数据都可能是不安全的来源,因为用户可能是攻击者,或者可能引入人为错误。

缓解与预防

避免使用非最终的静态字段。将字段设置为最终或非静态字段。如果要将一个字段设置为最终字段,确保其包含的对象不可变。如果此字段的值取决于某个请求,则该字段不应为静态,因为可能通过创建恶意表单产生暴露问题。如果字段不取决于请求,应将该字段设置为最终字段。

示例 1

复制
 public class SV_STRUTS_STATIC_Sample_1 extends ActionForm {
 
     private String birthdayString;
     protected Date birthday;
     private static SimpleDateFormat dateConvertor;
     public ActionErrors validate(ActionMapping map,
                                  HttpServletRequest req) {
         ActionErrors errors = new ActionErrors();
         if (dateConvertor == null) {
             dateConvertor = new SimpleDateFormat(req
                     .getParameter("date.format"));
         }
         try {
             birthday = dateConvertor.parse(birthdayString);
         } catch (ParseException e) {
             errors.add(ActionErrors.GLOBAL_MESSAGE,
                        new ActionMessage("Bad date"));
         }
         return super.validate(map, req);
     }
     public String getBirthday() {
         return birthdayString;
     }
     public void setBirthday(String birthday) {
         this.birthdayString = birthday;
     }
 }

针对第 22 行的字段声明报告 SV.STRUTS.STATIC:Struts:静态表单字段变量“dateConvertor”应为最终字段