代码审核,是对运用程序源代码进行系统性检讨的事情。它的目的是为了找到并且修复运用程序在开拓阶段存在的一些漏洞或者程序逻辑缺点,避免程序漏洞被造孽利用给企业带来不必要的风险。 代码审核不是大略的检讨代码,审核代码的缘故原由是确保代码能安全的做到对信息和资源进行足够的保护,以是熟习全体运用程序的业务流程对付掌握潜在的风险是非常主要的。审核职员可以利用类似下面的问题对开拓者进行访谈,来网络运用程序信息。 运用程序中包含什么类型的敏感信息,运用程序怎么保护这些信息的? 运用程序是对内供应做事,还是对外?哪些人会利用,他们都是可信用户么? 运用程序支配在哪里? 运用程序对付企业的主要性? 最好的办法是做一个checklist,让开发职员填写。Checklist能比较直不雅观的反响运用程序的信息和开拓职员所做的编码安全,它该当涵盖可能存在严重漏洞的模块,例如:数据验证、身份认证、会话管理、授权、加密、缺点处理、日志、安全配置、网络架构。
2.输入验证和输出显示
大多数漏洞的形成缘故原由紧张都是未对输入数据进行安全验证或对输出数据未经由安全处理,比较严格的数据验证办法为: 对数据进行精确匹配; 接管白名单的数据; 谢绝黑名单的数据; 对匹配黑名单的数据进行编码; 在PHP中可由用户输入的变量列表如下: $_SERVER $_GET $_POST $_COOKIE $_REQUEST $_FILES $_ENV $_HTTP_COOKIE_VARS $_HTTP_ENV_VARS $_HTTP_GET_VARS $_HTTP_POST_FILES $_HTTP_POST_VARS $_HTTP_SERVER_VARS 我们该当对这些输入变量进行检讨 1.命令注入 PHP实行系统命令可以利用以下几个函数:system、exec、passthru、“、shell_exec、popen、proc_open、pcntl_exec 我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会由于外部提交而改变,检讨这些参数是否有经由安全处理。 戒备方法: 1.利用自定义函数或函数库来替代外部命令的功能 2.利用escapeshellarg函数来处理命令参数 3.利用safe_mode_exec_dir指定可实行文件的路径 2.跨站脚本 反 射型跨站常常涌如今用户提交的变量接管往后经由处理,直接输出显示给客户端;存储型跨站常常涌如今用户提交的变量接管过经由处理后,存储在数据库里,然后 又从数据库中读取到此信息输出到客户端。输出函数常常利用:echo、print、printf、vprintf、< %=$test%> 对付反射型跨站,由于是立即输出显示给客户端,以是该当在当前的php页面检讨变量被客户提交之后有无立即显示,在这个过程中变量是否有经由安全检讨。 对付存储型跨站,检讨变量在输入后入库,又输出显示的这个过程中,变量是否有经由安全检讨。 戒备方法: 1.如果输入数据只包含字母和数字,那么任何分外字符都应该阻挡 2.对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符 3.对输出进行HTML编码,编码规范 < < > > ( ( ) ) # # & & ” “ ‘ ‘ ` %60
3.文件包含
PHP可能涌现文件包含的函数:include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、file 戒备方法:
1.对输入数据进行精确匹配,比如根据变量的值确定措辞en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检讨提交的数据是否是en或者cn是最严格的,检讨是否只包含字母也不错
2.通过过滤参数中的/、..等字符 4.代码注入 PHP可能涌当代码注入的函数:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function 查找程序中程序中利用这些函数的地方,检讨提交变量是否用户可控,有无做输入验证 戒备方法: 1.输入数据精确匹配2.白名单办法过滤可实行的函数
5.SQL注入
SQL注入由于要操作数据库,以是一样平常会查找SQL语句关键字:insert、delete、update、select,查看通报的变量参数是否用户可掌握,有无做过安全处理 戒备方法: 利用参数化查询
6.XPath注入
Xpath用于操作xml,我们通过搜索xpath来剖析,提交给xpath函数的参数是否有经由安全处理 戒备方法: 对付数据进行精确匹配
7.HTTP相应拆分
PHP中可导致HTTP相应拆分的情形为:利用header函数和利用$_SERVER变量。把稳PHP的高版本会禁止HTTP表头中涌现换行字符,这类可以直接跳过本测试。 戒备方法: 1.精确匹配输入数据 2.检测输入输入中如果有\r或\n,直接谢绝
8.文件管理
PHP 的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可能成为高危漏洞。我们该当在程序中搜索如下函数:copy、rmdir、 unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、 file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、 fputs,但常日PHP中每一个文件操作函数都可能是危险的。 http://ir.php.net/manual/en/ref.filesystem.php 戒备方法: 1.对提交数据进行严格匹配 2.限定文件可操作的目录
9.文件上传
PHP文件上传常日会利用move_uploaded_file,也可以找到文件上传的程序进行详细剖析 戒备办法: 1.利用白名单办法检测文件后缀 2.上传之后按韶光能算法天生文件名称 3.上传目录脚本文件不可实行 4.把稳%00截断 10.变量覆盖 PHP变量覆盖会涌现不才面几种情形: 1.遍历初始化变量 例: foreach($_GET as $key => $value) $$key = $value; 2.函数覆盖变量:parse_str、mb_parse_str、import_request_variables 3.Register_globals=ON时,GET办法提交变量会直接覆盖 戒备方法: 1.设置Register_globals=OFF 2.不要利用这些函数来获取变量 11.动态函数 当利用动态函数时,如果用户对变量可控,则可导致攻击者实行任意函数。 例: < ?php $myfunc = $_GET[‘myfunc’]; $myfunc(); ?> 防御方法: 不要这样利用函数