软件流程规范---常见安全问题

1、SQL注入

SQL注入通常是由于直接将未可信的用户输入作为数据库查询的参数,用于数据库查询操作,从而引发数据库信息的泄露。SQL注入可导致未授权的访问敏感数据,更新或删除数据库信息等恶意操作。引发信息泄露/任意代码执行漏洞。

示例:

其中$selectSqlSting$由用户输入带入

解决方案:

iBatis框架中的SQL语句尽量使用预编译#方式传参数,特别注意in语句和like语句写法,如必须使用$方式拼接SQL语句,则不应带入用户输入,或使用ESAPI中的SQLEscape方法过滤用户输入。

where h.dif_register_detail_inc_id in 
 
#[]#
]]>


p.CHNL_ID like '%'||#chnlId#||'%'

2、XSS

跨站点脚本发生于在动态生成的Web页面直接显示未可信(未严格验证)的外部输入,恶意用户可以利用该缺陷往动态页面中注入恶意脚本,当用户打开页面时,该恶意脚本将自动执行。注入的恶意脚本可以获取用户的帐号密码、改变用户设置、窃取cookies或往页面中插入一些恶意的内容。可导致恶意内容显示/任意脚本(代码)执行问题。

示例:

上传文件使用用户输入的文件名存储,若文件名中包含则出现下图中的XSS问题


上传解析Excel时为进行过滤,导致用户输入反射到页面形成XSS问题


解决方案:

系统统一使用XssSpFilter进行用户输入过滤,需要配置web.xml中过滤器,文件:XssSpFilter.java,XssSpCommonsMultipartResolver.java。

同时在上传文件、解析Excel等位置使用用户输入存库时,通过Jsoup.clean(value, Whitelist.relaxed());方法进行过滤。

3、CSRF

用户以当前身份浏览到flash或者第三方网站时,JS/flash可以迫使用户浏览器向任意CGI发起请求,此请求包含用户身份标识,CGI如无限制则会以用户身份进行操作。

解决方案:

部署anti csrf token;限制访问的referer;不使用get方式提交数据;重要操作进行二次验证(验证码)等请求referrer验证;关键请求使用验证码。

4、路径可控制

利用用户的未可信的输入来控制访问服务器上的哪个文件,允许用户控制或访问不在用户访问路径上的文件。所访问文件的文件名(含路径)来源于外部输入(或部分受控制),通过控制用户访问路径上的“../”或“//”等特殊字符来访问其他目录下的文件(或添加新文件),可造成以下风险:读敏感数据文件、删除重要文件、DOS攻击。

示例:

String path = getInputPath();

if (path.startsWith("/safe_dir/")){

File f = new File(path);

f.delete()

}

由于有“/safe_path/”的限定,程序假定path就是可信的。但当恶意用户输入/safe_dir/../important.dat,则导致程序误删父目录下的文件important.dat。

解决方案:

写死路径、白名单路径,随机化文件名(如../);要检测../,对../ 进行替换转义;使用文件服务器;限制文件及目录权限。

5、日志欺骗

通过构造输入形成伪造的日志记录,达到隐藏痕迹的目的。

示例:

用户登录,日志记录登录状态

Username=Alex&Password=nopassword

19:30-Login failed for username:Alex

攻击者登录,日志被篡改

Username=Alex%0d%0a19%3a31-Login+successed+for+username%3a+Admin&Password=nopassword

19:30-Login failed for username:Alex

19:31-Login successed for username:Admin

解决方案:

日志记录时过滤换行及换行转义字符

你可能感兴趣的:(软件流程规范)