AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 21061
Accepted
David Pashley
David Pashley
Asked: 2009-06-07 01:26:24 +0800 CST2009-06-07 01:26:24 +0800 CST 2009-06-07 01:26:24 +0800 CST

保护 PHP 网络服务器

  • 772

PHP 应用程序以高于平均水平的安全问题而闻名。您使用哪些配置技术来确保应用程序尽可能安全?

我正在寻找类似的想法:

  • 使用强化的 PHP/Suhosin
  • 使用mod_security
  • 在 php.ini 中禁用 register_globals 和 allow_url_fopen

我通常使用 Linux,但也可以随意建议 Windows 解决方案。

linux php apache-2.2 security web-server
  • 8 8 个回答
  • 2967 Views

8 个回答

  • Voted
  1. Best Answer
    Antoine Benkemoun
    2009-06-07T01:36:26+08:002009-06-07T01:36:26+08:00
    1. 使用 open_basedir 指令将您的 PHP 脚本限制在它们的主目录和最终的额外应用程序目录中。这本身就非常有效。

    2. 使用强化的 php,因为这没有任何成本,而且可以提供帮助。

    3. 使用suPHP让 PHP 脚本作为文件的所有者(每个网站一个用户)执行,并避免使用具有错误权限的文件,例如 777...要求不要破坏一切。

    4. Mod_security 是一个很大的优势,但需要很好地使用和配置。

    • 15
  2. msanford
    2009-06-08T08:35:29+08:002009-06-08T08:35:29+08:00

    根据我的经验,基于 PHP 的网站上的大多数漏洞都是糟糕的(网站)设计造成的,而不是 PHP 本身的缺陷。

    一些快速提示:

    • 通用过滤输入,转义输出。澄清:过滤并不意味着逃跑,它的意思是“如果我在这个用户输入中发现一些可疑的东西,导致提交失败并告诉用户重新格式化。”
    • 而不是使用 escapeshellcmd(),只是不允许在 shell 中执行任何用户输入。这是危险的,可能从来没有真正必要。
    • 不要在生产站点上调用像 phpinfo() 这样的函数(或者如果你这样做,请参见下文*)。
    • 在设计 Web 应用程序时,请始终考虑“这是一个可能的攻击媒介吗?” 说,SQL注入。如果答案是“是”,请立即插入——不要说“好的,我将在以后的开发中将其添加为功能”。安全从来都不是一项功能。
    • 永远不要向用户输出原始错误;这意味着设置 php.ini 的 display_errors = Off,log_errors = On。捕获运行时错误并输出一些漂亮的东西。以 Twitter 的鲸鱼为例:它不会给用户调试级别的信息,它只是说“糟糕,有东西坏了,请刷新”。

    *您还可以看看我写的一篇名为“保护 phpinfo(),有点像”的短文,并确保阅读评论http://egovsergo.com/2009/04/03/protecting-your-phpinfo/如果我以某种方式忘记在生产站点上删除它,我必须(某种程度上)保护 phpinfo(),这是一个快速的想法。

    在更一般的方式中,一些开发人员为敏感功能编写包装器,检查是否设置了“生产站点”标志,并在生产中禁用敏感功能。

    • 3
  3. Deem3n
    2009-11-23T23:48:33+08:002009-11-23T23:48:33+08:00

    应更改以强化 PHP 的其他参数:

    safe_mode = Off
    register_globals = Off
    expose_php = Off
    allow_url_fopen = Off
    allow_url_include = Off
    log_errors = On
    error_log = /var/log/phperror.log
    display_errors = Off
    enable_dl = Off
    disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"
    

    将所有 PHP 错误存储在文件/var/log/phperror.log中:

    touch /var/log/phperror.log
    chmod 666 /var/log/phperror.log
    
    • 3
  4. Brent
    2009-06-07T05:15:00+08:002009-06-07T05:15:00+08:00

    我已将dotdeb存储库添加到我的 /etc/apt/sources.lst

    deb http://packages.dotdeb.org stable all
    deb-src http://packages.dotdeb.org stable all
    

    因为他们比 Debian 更频繁地修补 php / apache / mysql。

    • 1
  5. Jim OHalloran
    2009-06-16T22:12:58+08:002009-06-16T22:12:58+08:00

    考虑open_basedir在“每个站点”的基础上进行设置。 open_basedir是一个 php.ini 设置,它将阻止您的脚本访问定义的白名单之外的文件。如果您的服务器托管多个站点,它将阻止一个站点从另一个站点读取数据库设置。它还将阻止 php 脚本访问/修改核心系统文件。Open basedir 易于设置,只需将“ php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list”行添加到每个 Apache vhost。

    还要考虑为所有不应包含 PHP 脚本的站点/文件夹(例如上传的图像文件夹)关闭 PHP 脚本引擎。同样,这很简单,将“php_admin_value engine off”添加到任何不需要 php 的 Apache VirtualHosts。要在目录中禁用 PHP,请将相同的内容放入 Directory 标记中。

    尽可能严格地运行文件权限,避免 Apache 用户对 PHP 脚本的写入权限,这可以防止正在运行的脚本修改自身或同一站点/服务器上的其他脚本。尽可能避免 777 权限,找出运行应用程序所需的最低权限并使用这些权限。

    如果您托管多个站点,每个站点都有自己的数据库,请为每个站点使用单独的 MySQL/Postgres 用户,并为每个用户设置权限,以便他们只能访问相关数据库。同样,这将防止恶意脚本篡改另一个应用程序的数据库。

    Suosin、HardenedPHP、mod_security 等也都很有价值,但除了紧密锁定的配置之外,还可以使用它们,而不是代替。

    • 1
  6. Tom
    2009-06-07T07:30:40+08:002009-06-07T07:30:40+08:00

    Suhosin 的性能成本相当可观,因此“无成本”的评论有点不对劲。

    • 0
  7. D.F.
    2009-06-07T11:47:15+08:002009-06-07T11:47:15+08:00

    您是否正在寻找一些基本的防火墙/拓扑建议?我喜欢使用磅之类的东西来防止从未清洗的互联网直接访问 PHP 网络服务器的想法。这样,您也可以将网络服务器与网络的其他部分隔离开来。

    • 0
  8. jplourenco
    2009-06-07T16:39:02+08:002009-06-07T16:39:02+08:00

    使用 Suhosin/mod_security/SuPHP 肯定会让您的 PHP 服务器变得安全。禁用某些功能,如 exec、passthru、system 和 escapeshellcmd 也会有很大帮助。

    • 0

相关问题

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve