1.表单测试:
空白字符,控制字符,非字母数据(如符号&,*等),超长输入(大于256个字符),留言版垃圾,二进制数据,其他编码数据(如ASICII,UTF-8,十六进制,八进制等),SQL诸如,XSS
处理:设定长度规则(合法用户不会写小说),若能发邮件的地方只能一次一个发一人,错误处理进行重定向或错误提示,
2.系统调用:exec(),sysetem(),backtick。
1.部署的正式环境去掉sudo命令(禁止该命令)
2.使用escapeshellcmd(),escapeshellarg()进行转义保护系统调用,
3.使用固定方式调用系统命令,封装api,如将exec()来移动文件封装为只接受文件名的函数调用,避免直接调用,让api功能单一,exec()带太多额外不方便检测,如只接受文件名的函数则更容易检测变量是否满足条件
4.验证用户的输入
3.缓冲区溢出:
当载入程序后,程序会被保存在内存中,内存其他部分也就是缓冲区,将被用来保存程序数据(作为全局变量保存)、任何程序设计的函数库以及两个数据结构(堆栈和堆),堆栈是从下往上填充,若参数大于参数的缓冲区所准备的空间,它将覆盖下一个可用的内存地址,返回地址缓冲区,于是返回结果可能为一段恶意结构,
4.密码强度:
1.避免任何语言的字典单词
2.使用大小写字母或其他字符组合
3.密码长度大于6-8位,可以更多
4.创建密码提示符代替答案,如一句话的首写字母
5.定期修改密码
6.是否以加密的方式存储密码
7.保存密码的数据库是否安全
7.若账户可以发送邮件,是否实现了验证码来过滤避免自动脚本创建账户
5.会话安全:会话固化,会话劫持,会话毒化(注入)
6.xss跨站攻击(htmlspecialchars, strip_tags),sql注入(mysql_real_escape_string, addslashes),csrf,挂马,危险脚本(如phpinfo这种暴露版本信息),远程文件包含allow_url_include=Off,管理后台泄露(单一入口在目录,其他php不再web目录),身份权限验证
7.apache配置:
php.ini中disable_functions可以禁用php函数(如disable_functions = phpinfo,gzcompress,apache_note,apache_setenv,proc_get_status,exec,passthru,proc_nice,proc_open,proc_terminate,shell_exec,system,popen,ini_restore,syslog,define_syslog_variables,symlink,link,error_log,leak,dbmopen,openlog,closelog,popen,pclose,stream_socket_server)
1.隐藏版本信息和http头信息:ServerSignature Off,ServerTokens Prod,隐藏php错误(php.ini expose_php = On)
2.目录遍历
3.将apache限制在自身目录结构中,http.conf设置<Directory 目录> Order….Deny……..</Directory>,在非web目录不能打开php脚本,比如上传目录不能运行
4.关闭多于的配置和模块
5.使用ModSecurity包过滤工具(有利有弊,如增加了开销,还会将空格,点号,左方括号转换为下划线等)
额外补充:
Path Traversal(目录遍历)
漏洞描述
目录遍历指的是应用程序对文件路径没有检查导致服务器上的敏感文件/代码泄漏。
安全隐患
可能会导致源代码等敏感信息泄露。
修复建议
严格检查文件路径参数,限制在指定的范围。严格限制文件路径参数,不允许用户控制文件路径相关的参数,限定文件路径范围。
在php.ini中进行如下配置:
open_basedir = 服务器上WEB目录的路径(注,路径最后需要加上斜杠作为结束),如:open_basedir = /var/www/html/
Directory Indexing(目录泄露)
漏洞描述
应用服务器配置不当,导致应用服务器的目录列表被展示。
安全隐患
可能会导致敏感信息或源代码泄露。
修复建议
配置应用服务器禁止目录列表展示。、
apache修改方法:
<Directory “E:/www”>下面的
Options Indexes FollowSymLinks
改成
Options FollowSymLinks
然后
<Directory />
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
改成
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
8.保护MySQL:
1.单机的话则关闭远程访问或则只能固定ip访问
2.修改管理员root用户名且增加密码不为空
3.为一个应用开启单独的账户和密码设置最小化的权限,如不能删除数据表等
4.删除多于的MySQL账户和数据库(如test)
9.php配置php.ini:
1.safe_mod,safe_mod_gid开关
2.open_basedir,safe_mode_exec_dir
3.expose_php,register_globals,session_cookie_lifetime
4.diplay_errors
5.远程文件打开等
10.Fuzz测试:PowerFuzzer,测试工具集:CAL9000
参考和建议阅读:
《PHP应用程序安全编程》
淘宝第三方应用安全规范
制作安全网站的checklist
PHP漏洞全解
浅谈php web安全
php.ini安全配置
写给系统管理员的 25 个 PHP 安全实践