php编程安全指南


转自:PHP Coding/Security Guidelines Checklist


1、大致方向

  • lamp系统安全设置;

  • php.ini安全设置;

  • 使用MVC框架;


2、数据传输

  • 在$_GET的$_POST,$_COOKIE,和$_REQUEST中,消毒和验证之前以编程方式操纵数据中包含的所有数据;

  • SQL注入,定义:代码注入技术,利用一个安全漏洞,在应用程序的数据库层发生。该漏洞是存在的,当用户输入或者不正确的字符串文字转义字符中嵌入SQL语句或用户输入不强类型,从而意外地执行过滤,预防:mysql_real_escape_string($string);


3、跨站点脚本(XSS)

  • 定义:安全漏洞,通常在Web应用程序的其他用户浏览网页,它允许恶意web用户将代码注入。这样的例子:包括客户端脚本(即JavaScript)的。 预防:htmlentities(strip_tags($string));


4、浏览器的请求

  • 跨站点请求伪造(CSRF),定义:攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。例如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片tag。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。 预防:生成一个独特的“令牌”,通常当一个浏览器会话的开始。通过令牌在所有POST和GET请求。继POST/ GET行动,检查存在的会话令牌,然后确认邮寄令牌/ GET存储在会话中的令牌相同。 (像CakePHP的MVC框架,使得这个比较容易实现整个应用程序的统一。)


5、Sessions

  • 杀死一个会话时,销毁会话数据 当session会话完成后(“注销”),销毁其数据,不只是清除cookie,否则恶意用户能重新恢复cookie和再次使用session。可以将$_SESSION中的所有索引置空

  • 以文件形式存储session在网站的webroot文件或存储在数据库在服务器上保存session的默认路径可以被劫持的,尤其是在一个共享的主机环境。


6、密码

  • 应用强密码,需要数字,符号,大写和小写字母的密码,密码长度应该在12至14个字符;

  • 加密,至少使用SHA1()哈希加密(不使用md5()),hash()函数提供了一些额外的哈希选择,包括SHA256。添加一个“特定的应用程序”来加密;


7、一般的php.ini配置

  • Disable register_globals,预防: register_globals = Off;

  • Disable magic quotes,预防: magic_quotes_gpc = Off;

  • Disable error reporting,预防: display_errors = Off;

  • 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

  • 保存session数据到webroot的目录下,预防: session.save_path = /path/above/webroot/sessions;


8、webroot下载的.htaccess文件

  • Disable directory listings site-wide,预防: Options -Indexes;


9、重要/敏感文件

  • 防止未经授权的访问/下载,这包括网站管理/成员,部分网站/数据库配置文件等;

  • 使用脚本文件作为中介,作为附件;

  • 不断更新你的脚本(WordPress的,phpMyAdmin的,等)的密码;

  • 当你正在使用时可以使phpMyAdmin允许访问,这可防止别人对您的利用"零日漏洞"破坏,“零日漏洞”(zero-day)又叫零时差攻击,是指被发现后立即被恶意利用的安全漏洞。通俗地讲,即安全补丁与瑕疵曝光的同一日内,相关的恶意程序就出现。这种攻击往往具有很大的突发性与破坏性。;


10、文件上传

  • 在数据操作前一定要对$_FILES进行验证,判断文件是否已经在 $_FILES 中;

  • 请注意提供的MIME类型可能欺骗或其导致他方式错误;

  • 所有用户上传的文件应移动到网站根目录以上的目录;

  • 不要执行用户上传的文件,或者用include require等包含用户上传的文件;

  • 尽量不要设定脚本类型为application/octet-stream,” “application/unknown,” or “plain/text”;


11、其他

  • 在webroot下,被网站开发人员创建和使用的“实用工具”文件/程序,如果不打算被网站用户访问和使用,那么在放到外网之前应该将他们全部删除,降低的网站的安全风险;

上一篇 下一篇

评论



紫气东来灰太狼:有个小程序想你帮我开发一下QQ:82074366
09月11日 10:55

分享

我的公众号

恩波的公众号

最新加入

最新评论

lwj: 你好,我刚看了你发的这个帖子,不知道现在评论是否能看到。我现在在做这个功能,可以用。但我这还有个需求就是,可以推送多张,我在cardList里,把需要推送的卡券,都添加上了,微信端页面也显示正确,有个领取按钮,但可以领取多次,每次卡包里多一张,而且这张是列表上的第一张 。。请问,你有没有遇到过 推送多张的情况 查看原文 05月15日 14:29
roly: 另外添加卡券接口的参数cardId: "xxxxxxxxxxxxxxxxxxxxxx", cardExt: '{"timestamp":"1426222398","signature":"fdd892770eb681e925f92acb9015c75107b2227a"}' 是通过自己服务获取以上参数 还是用js在html5页面直接生产签名参数? 查看原文 05月12日 16:41
roly: 您好,请问怎么查询当前用户卡券是否领取状态? 查看原文 05月12日 16:20
所谓爱人: 可不可以加个好友QQ1217994113 查看原文 04月01日 18:47
17688905252: 看了好多说是要加上这个样式的,但是加上之后为什么还是一点反应都没有呢... 查看原文 04月01日 14:55

赞助商