zoukankan      html  css  js  c++  java
  • 系统管理员必须知道的PHP安全实践


    Apache web 服务器提供了这种便利 :通过 HTTP 或 HTTPS 协议,访问文
    件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,
    使用 PHP 时要小心。以下是 25 个 PHP 安全方面的最佳实践,可供系统管理
    员们安全地配置 PHP。
    为 PHP 安全提示而提供的示例环境
    ◆文件根目录(DocumentRoot):/var/www/html
    ◆ 默 认 的 Web 服 务 器 :Apache(可 以 使 用 Lighttpd 或 Nginx 来 取 代
    Apache)
    ◆默认的 PHP 配置文件 :/etc/php.ini
    ◆默认的 PHP 加载模块配置目录 :/etc/php.d/
    ◆我们的示例 php 安全配置文件 :/etc/php.d/security.ini(需要使用文
    本编辑器来创建该文件)
    ◆ 操 作 系 统 :RHEL/CentOS/Fedora Linux(相 关 指 令 应 该 与 Debian/
    Ubuntu 等其他任何 Linux 发行版或者 OpenBSD/FreeBSD/HP-UX 等其他类
    似 Unix 的操作系统兼容)。
    ◆默认的 php 服务器 TCP/UDP 端口 :无
    将所有PHP错误记入日志
    别让 PHP 错误信息暴露在网站的所有访客面前。编辑 /etc/php.d/
    security.ini,执行以下指令 :
    display_errors=Off
    确保你将所有 PHP 错误记入到日志文件中 :
    log_errors=On
    error_log=/var/log/httpd/php_scripts_error.log
    不允许上传文件
    出于安全原因,编辑 /etc/php.d/security.ini,执行以下命令 :
    file_uploads=Off
    如果使用你应用程序的用户需要上传文件,只要设置 upload_max_
    filesize,即可启用该功能,该设置限制了 PHP 允许通过上传的文件的最大
    值 :
    file_uploads=On
    # 用户通过 PHP 上传的文件最大 1MB
    upload_max_filesize=1M
    关闭远程代码执行
    如 果 启 用,allow_url_fopen 允 许 PHP 的 文 件 函 数 —— 如 file_get_
    contents()、include 语句和 require 语句——可以从远程地方(如 FTP 或网站)
    获取数据。
    allow_url_fopen 选项允许 PHP 的文件函数——如 file_get_contents()、
    include 语句和 require 语句——可以使用 FTP 或 HTTP 协议,从远程地方
    获取数据。编程员们常常忘了这一点,将用户提供的数据传送给这些函数
    时,没有进行适当的输入过滤,因而给代码注入安全漏洞留下了隐患。基于
    PHP 的 Web 应用程序中存在的众多代码注入安全漏洞是由启用 allow_url_
    fopen 和糟糕的输入过滤共同引起的。编辑 /etc/php.d/security.ini,执行
    以下指令 :
    allow_url_fopen=Off
    出于安全原因,我还建议禁用 allow_url_include :
    allow_url_include=Off
    启用SQL安全模式
    编辑 /etc/php.d/security.ini,执行以下指令 :
    sql.safe_mode=On
    如果启用,mysql_connect() 和 mysql_pconnect() 就忽视传送给它们的
    任何变量。请注意 :你可能得对自己的代码作一些更改。sql.safe_mode 启
    用后,第三方开源应用程序(如 WorkdPress)及其他应用程序可能根本运行
    不了。我还建议你针对所有安装的 php 5.3.x 关闭 magic_quotes_gpc,因
    为它的过滤并不有效、不是很可靠。mysql_escape_string() 和自定义过滤
    函数能起到更好的作用 :
    magic_quotes_gpc=Off
    控制POST请求的大小
    作为请求的一部分,客户机(浏览器或用户)需要将数据发送到 Apache
    Web 服务器时,比如上传文件或提交填好的表单时,就要用到 HTTP POST
    请求方法。攻击者可能会企图发送过大的 POST 请求,大量消耗你的系统
    资源。你可以限制 PHP 将处理的 POST 请求的最大大小。编辑 /etc/php.
    d/security.ini,执行以下命令 :
    ; 在此设置实际可行的值
    post_max_size=1K
    1K 设置了 php 应用程序允许的 POST 请求数据的最大大小。该设置还
    影响文件上传。要上传大容量文件,这个值必须大于 upload_max_filesize。
    我还建议你限制使用 Apache Web 服务器的可用方法。编辑 httpd.conf,执
    行针对文件根目录 /var/www/html 的以下指令 :
    <Directory /var/www/html>
    <LimitExcept GET POST>
    Order allow,deny
    </LimitExcept>
    ## 可在此添加配置的其余部分 ... ##
    </Directory>
    资源控制(拒绝服务控制)
    你可以设置每个 php 脚本的最长执行时间,以秒为单位。另一个建议的
    选项是设置每个脚本可能用于解析请求数据的最长时间,以及脚本可能耗
    用的最大内存数量。编辑 /etc/php.d/security.ini,执行以下命令 :
    # 设置,以秒为单位
    max_execution_time = 30
    max_input_time = 30
    memory_limit = 40M
    为PHP安装Suhosin高级保护系统
    Suhosin 是一款高级的保护系统,面向安装的 PHP。它旨在保护服务器和
    用户,远离 PHP 应用程序和 PHP 核心中的已知缺陷和未知缺陷。Suhosin 分
    两个独立部分,可以单独使用,也可以组合使用。第一个部分是针对 PHP 核
    心的小补丁,实施了几个低级防护措施,以防范缓冲器溢出或格式字符串安
    全漏洞 ;第二个部分是功能强大的 PHP 加载模块,实施了其他所有的保护措
    施。
    保持PHP、软件和操作系统版本最新
    打安全补丁是维护Linux、Apache、PHP和MySQL服务器的一个重要环节。
    应该使用以下其中任何一个工具(如果你通过软件包管理器来安装 PHP),
    尽快检查所有的 PHP 安全更新版本,并尽快打上 :
    # yum update 或
    # apt-get update && apt-get upgrade
    你可以配置红帽 /CentOS/Fedora Linux,以便通过电子邮件发送 yum 软
    件包更新通知。另一个选项是通过 cron job(计划任务)打上所有的安全
    更新版。在 Debian/Ubuntu Linux 下,可以使用 apticron 来发送安全通知。
    注 :经常访问 php.net,寻找源代码安装的最新版本。
    限制文件和目录访问
    确保你以 Apache 或 www 等非根用户的身份来运行 Apache。所有文件
    和目录都应该归非根用户(或 apache 用户)所有,放在 /var/www/html 下 :
    # chown -R apache:apache /var/www/html/
    /var/www/html/ 是个子目录,这是其他用户可以修改的文件根目录,
    因为根目录从来不在那里执行任何文件,也不会在那里创建文件。
    确保在 /var/www/html/ 下,文件权限设成了 0444(只读):
    # chmod -R 0444 /var/www/html/
    确保在 /var/www/html/ 下,所有目录权限设成了 0445 :
    # find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}
    关于设置合适文件权限的补充
    chown 和 chmod 命令确保 :不管在什么情况下,文件根目录或文件根目
    录里面的文件都可以被 Web 服务器用户 apache 写入。请注意 :你需要设
    置对你网站的开发模型最合理的权限,所以可以根据自身需要,随意调整
    chown 和 chmod 命令。在这个示例中,Apache 服务器以 apache 用户的身
    份来运行。这可以在你的 httpd.conf 文件中用 User 和 Group 命令来配置。
    apache 用户需要对文件根目录下的所有内容享有读取访问权,但是不应该
    享有写入访问权。
    确保 httpd.conf 有以下命令,实现限制性配置 :
    <Directory / >
    Options None
    AllowOverride None
    Order allow,deny
    </Directory>
    由于篇幅所限,本文仅节选了 25 条最佳实践当中的 9 条。完整内容见
    原文 :
    25 PHP Security Best Practices For Sys Admins
    译文 :http://os.51cto.com/art/201111/305014.htmv
  • 相关阅读:
    java第19次
    Unity3D常用的生命周期函数
    Unity3D结合ZXing生成中间带图标的二维码并保存
    Unity查看当前内存使用情况(针对移动端开发)
    Unity 获取鼠标悬停位置下的UI或3D物体对象
    【Unity3D】获取鼠标在三维空间(世界坐标系)的位置
    【Unity3D—C#】按下任意按键,返回按键的名称 以及 KeyCode键码详解
    Unity UGUI获取鼠标在屏幕的准确点击位置
    ML-Agent:通过TF#使用训练完成的模型数据
    对《ml-agent:Win10下环境安装》更新
  • 原文地址:https://www.cnblogs.com/steven9898/p/11309476.html
Copyright © 2011-2022 走看看