转自:http://www.codingforums.com/showthread.php?t=176717php
php编程安全指南
一、通常
1)lamp系统安全设置
2)php.ini安全设置
3)使用MVC框架html
二、数据传输
1)在$_GET的$_POST,$_COOKIE,和$_REQUEST中,消毒和验证以前以编程方式操纵数据中包含的全部数据
2)SQL注入
定义:代码注入技术,利用一个安全漏洞,在应用程序的数据库层发生。该漏洞是存在的,当用户输入或者不正确的字符串文字转义字符中嵌入SQL语句或用户输入不强类型,从而意外地执行过滤。
预防:mysql_real_escape_string($string)
3)跨站点脚本(XSS)
定义:安全漏洞,一般在Web应用程序的其余用户浏览网页,它容许恶意web用户将代码注入。这样的例子:包括客户端脚本(即JavaScript)的。
预防:htmlentities(strip_tags($string))
三、浏览器的请求
1)跨站点请求伪造(CSRF)
定 义:攻击经过在受权用户访问的页面中包含连接或者脚本的方式工做。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另外一个用户Alice也在此论坛 中,而且后者刚刚发布了一个具备Bob银行连接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的连接,并将此链 接做为图片tag。若是Bob的银行在cookie中保存他的受权信息,而且此cookie没有过时,那么当Bob的浏览器尝试装载图片时将提交这个取款 form和他的cookie,这样在没经Bob赞成的状况下便受权了此次事务。
预防:生成一个独特的“令牌”,一般当一个浏览器会话的开始。通 过令牌在全部POST和GET请求。继POST/ GET行动,检查存在的会话令牌,而后确认邮寄令牌/ GET存储在会话中的令牌相同。 (像CakePHP的MVC框架,使得这个比较容易实现整个应用程序的统一。)mysql
四、Sessions
1)杀死一个会话时,销毁会话数据
当session会话完成后(“注销”),销毁其数据,不仅是清除cookie,不然恶意用户能从新恢复cookie和再次使用session。能够将$_SESSION中的全部索引置空
2)以文件形式存储session在网站的webroot文件或存储在数据库
在服务器上保存session的默认路径能够被劫持的,尤为是在一个共享的主机环境。web
五、密码
1)应用强密码
须要数字,符号,大写和小写字母的密码
密码长度应该在12至14个字符
2)加密
至少使用SHA1()哈希加密(不使用md5()),hash()函数提供了一些额外的哈希选择,包括SHA256。添加一个“特定的应用程序”来加密sql
六、通常的php.ini配置
1)Disable register_globals
预防: register_globals = Off
2)Disable magic quotes
预防: magic_quotes_gpc = Off
3)Disable error reporting
预防: display_errors = Off
4)Enable error logging and save log file to a directory above web root
预防: log_errors = On;
ignore_repeated_errors = On;
html_errors = Off;
error_log = /path/above/webroot/logs/php_error_log
5)保存session数据到webroot的目录下
预防: session.save_path = /path/above/webroot/sessions数据库
七、webroot下载的.htaccess文件
1)Disable directory listings site-wide
预防: Options -Indexes编程
八、重要/敏感文件
1)防止未经受权的访问/下载
这包括网站管理/成员,部分网站/数据库配置文件等
2)使用脚本文件做为中介,做为附件
3)不断更新你的脚本(WordPress的,phpMyAdmin的,等)的密码。
4)当你正在使用时可使phpMyAdmin容许访问,这可防止别人对您的利用"零日漏洞"破坏
“零日漏洞”(zero-day)又叫零时差攻击,是指被发现后当即被恶意利用的安全漏洞。通俗地讲,即安全补丁与瑕疵曝光的同一日内,相关的恶意程序就出现。这种攻击每每具备很大的突发性与破坏性。
九、文件上传
1)在数据操做前必定要对$_FILES进行验证,判断文件是否已经在 $_FILES 中
2)请注意提供的MIME类型可能欺骗或其致使他方式错误
3)全部用户上传的文件应移动到网站根目录以上的目录
4)不要执行用户上传的文件,或者用include require等包含用户上传的文件
5)尽可能不要设定脚本类型为application/octet-stream,” “application/unknown,” or “plain/text”浏览器
十、其余
在webroot下,被网站开发人员建立和使用的“实用工具”文件/程序,若是不打算被网站用户访问和使用,那么在放到外网以前应该将他们所有删除,下降的网站的安全风险。安全