گزارش دهی نامناسب(Insufficient Logging&Monitoring)
از Secure Coding
نرم افزار های مختلف برای اطلاع رسانی خود و سایر استفاده کنندگان نرم افزار از log استفاده می کنند.
برای مثال پس از ورود کاربر جدید به سیستم و احراز هویت با نام کاربری و کلمه عبور، نرم افزار نام کاربری و کلمه عبور به صورت log نمایش می دهد.
یا در مثال دیگر نرم افزار پس از ارسال پیام خصوصی کاربران، پیام را به صورت log اعلام و نمایش دهد.
روش های جلوگیری
اطلاعات حساس را حد امکان log نکنید ولی اگر نیاز به log شدن دارید، به صورت غیر واضح log کنید.
برخی از اطلاعات مهم که نباید به صورت واضح log شود.
- کلمه عبور
- Ip address
- اطلاعات بانکی
- اطلاعات تولید شده توسط برنامه مانند نام کاربری
یک نمونه log بد:
error - user bob cant eat pork
این log نام کاربر را نمایش می دهد.
حالت بهبود یافته:
error - meal code not allowed for this user
یک نمونه log بد در JAVA
package org.o7planning.securitywebapp.utils; import java.util.HashMap; import java.util.Map; import org.o7planning.securitywebapp.bean.UserAccount; import org.o7planning.securitywebapp.config.SecurityConfig; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class DataDAO { private static final Logger LOGGER = Logger.getLogger(DataDAO.class.getName()); private static final Map<String, UserAccount> mapUsers = new HashMap<String, UserAccount>(); static { initUsers(); } private static void initUsers() { // This user has a role as EMPLOYEE. UserAccount emp = new UserAccount("employee1", "123", UserAccount.GENDER_MALE, // SecurityConfig.ROLE_EMPLOYEE); // This user has 2 roles EMPLOYEE and MANAGER. UserAccount mng = new UserAccount("manager1", "123", UserAccount.GENDER_MALE, // SecurityConfig.ROLE_EMPLOYEE, SecurityConfig.ROLE_MANAGER); mapUsers.put(emp.getUserName(), emp); mapUsers.put(mng.getUserName(), mng); } // Find a User by userName and password. public static UserAccount findUser(String userName, String password) { LOGGER.info("Logger Name: "+LOGGER.getName()); UserAccount u = mapUsers.get(userName); if (u != null && u.getPassword().equals(password)) { LOGGER.info("User "+ u.getUserName() +" Logged in with "+ u.getPassword()); return u; } return null; } }
حالت بهبود یافته:
package org.o7planning.securitywebapp.utils; import java.util.HashMap; import java.util.Map; import org.o7planning.securitywebapp.bean.UserAccount; import org.o7planning.securitywebapp.config.SecurityConfig; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; public class DataDAO { private static final Logger LOGGER = Logger.getLogger(DataDAO.class.getName()); private static final Map<String, UserAccount> mapUsers = new HashMap<String, UserAccount>(); static { initUsers(); } private static void initUsers() { // This user has a role as EMPLOYEE. UserAccount emp = new UserAccount("employee1", "123", UserAccount.GENDER_MALE, // SecurityConfig.ROLE_EMPLOYEE); // This user has 2 roles EMPLOYEE and MANAGER. UserAccount mng = new UserAccount("manager1", "123", UserAccount.GENDER_MALE, // SecurityConfig.ROLE_EMPLOYEE, SecurityConfig.ROLE_MANAGER); mapUsers.put(emp.getUserName(), emp); mapUsers.put(mng.getUserName(), mng); } // Find a User by userName and password. public static UserAccount findUser(String userName, String password) { LOGGER.info("Logger Name: "+LOGGER.getName()); UserAccount u = mapUsers.get(userName); if (u != null && u.getPassword().equals(password)) { LOGGER.info("User Logged in"); return u; } return null; } }