目录

php常被说不安全,是php不安全吗?肯定不存在绝对安全的语言,但php也足够安全,很多 PHP 程序所存在的重大弱点并不是 PHP 语言本身的问题,而是编程者的安全意识不高而导致的。因此,必须时时注意每一段代码可能存在的问题,去发现非正确数据提交时可能造成的影响。

比如错误日志导致的安全问题

比如:一个php错误日志可能会暴露web服务器具有什么权限、正在使用的php版本、数据库、文件组织结构、框架等信息。这些暴露的信息往往会提供攻击者推敲的可能。

有三个常用的办法处理这些问题。第一个是彻底地检查所有函数,并尝试弥补大多数错误。第二个是对在线系统彻底关闭错误报告。第三个是使用 PHP 自定义的错误处理函数创建自己的错误处理机制。根据不同的安全策略,三种方法可能都适用。

一个能提前阻止这个问题发生的方法就是利用 error_reporting() 来帮助使代码更安全并发现变量使用的危险之处。在发布程序之前,先打开 E_ALL 测试代码,可以帮你很快找到变量使用不当的地方。一旦准备正式发布,就应该把 error_reporting() 的参数设为 0 来彻底关闭错误报告或者把 php.ini 中的 display_errors 设为 off 来关闭所有的错误显示以将代码隔绝于探测。当然,如果要迟一些再这样做,就不要忘记打开 ini 文件内的 log_errors 选项,并通过 error_log 指定用于记录错误信息的文件。

比如用户提交数据导致安全问题

必须时常留意我们的代码,以确保每一个从客户端提交的变量都经过适当的检查,然后问自己以下一些问题:

  • 此脚本是否只能影响所预期的文件?
  • 非正常的数据被提交后能否产生作用?
  • 此脚本能用于计划外的用途吗?
  • 此脚本能否和其它脚本结合起来做坏事?
  • 是否所有的事务都被充分记录了?

记住:用户提交的数据是不安全的,我们需要适当检查过滤用户提交的数据。

尽量隐藏php相关环境信息

  • 在 php.ini 文件里设置 expose_php = off ,可以减少他们能获得的有用信息。

    expose_php=Off
    display_errors=Off
    
  • web 服务器用 PHP 解析不同扩展名

    # 使 PHP 代码看上去像 HTML 页面
    AddType application/x-httpd-php .htm .html
    
  • 隐藏语言及错误日志

    error_reporting(0);
    header("X-Powered-By: ASP.NET");
    
  • nginx或apache中rewrite设置

  • 框架路由