专栏首页PHP在线PHP 安全性漫谈

PHP 安全性漫谈

原文出处: 彭长霖

本文所讨论的安全性环境是在Linux+Apache+Mysql+PHP。超出此范围的安全性问题不在本文范畴之内

一、apache server安全性设置

1、以Nobody用户运行

一般情况下,Apache是由Root 来安装和运行的。如果ApacheServer进程具有Root用户特权,那么它将给系统的安全构成很大的威胁,应确保Apache Server进程以最可能低的权限用户来运行。通过修改httpd.conf文件中的下列选项,以Nobody用户运行Apache 达到相对安全的目的。 User nobody Group# -1

2、ServerRoot目录的权限

为了确保所有的配置是适当的和安全的,需要严格控制Apache 主目录的访问权限,使非超级用户不能修改该目录中的内容。Apache 的主目录对应于Apache Server配置文件httpd.conf的Server Root控制项中,应为: Server Root /usr/local/apache

3、SSI的配置

在配置文件access.conf 或httpd.conf中的确Options指令处加入Includes NO EXEC选项,用以禁用Apache Server 中的执行功能。避免用户直接执行Apache 服务器中的执行程序,而造成服务器系统的公开化。 Options Includes Noexec

4、阻止用户修改系统设置

在Apache 服务器的配置文件中进行以下的设置,阻止用户建立、修改 .htaccess文件,防止用户超越能定义的系统安全特性。 AllowOveride None Options None Allow from all 然后再分别对特定的目录进行适当的配置。

5、改变Apache 服务器的缺省访问特性

Apache 的默认设置只能保障一定程度的安全,如果服务器能够通过正常的映射规则找到文件,那么客户端便会获取该文件,如http://local host/~ root/ 将允许用户访问整个文件系统。在服务器文件中加入如下内容: order deny,ellow Deny from all 将禁止对文件系统的缺省访问。

6、CGI脚本的安全考虑

CGI脚本是一系列可以通过Web服务器来运行的程序。为了保证系统的安全性,应确保CGI的作者是可信的。对CGI而言,最好将其限制在一个特定的目录下,如cgi-bin之下,便于管理;另外应该保证CGI目录下的文件是不可写的,避免一些欺骗性的程序驻留或混迹其中;如果能够给用户提供一个安全性良好的CGI程序的模块作为参考,也许会减少许多不必要的麻烦和安全隐患;除去CGI目录下的所有非业务应用的脚本,以防异常的信息泄漏。

7、SSL链接加密

以上这些常用的举措可以给Apache Server 一个基本的安全运行环境,显然在具体实施上还要做进一步的细化分解,制定出符合实际应用的安全配置方案。

二、PHP安全性设置

服务器并不能阻止所有的安全问题,例如程序漏洞问题、用户输入表单问题、PHP文件权限问题等。 也可以通过一些手段来迷惑黑客或者别有用心者。

1、程序代码漏洞问题

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

<?php

unlink ($evil_var);

fwrite ($fp, $evil_var);

system ($evil_var);

exec ($evil_var);

?>

必须时常留意你的代码,以确保每一个从客户端提交的变量都经过适当的检查,然后问自己以下一些问题: 此脚本是否只能影响所预期的文件? 非正常的数据被提交后能否产生作用? 此脚本能用于计划外的用途吗? 此脚本能否和其它脚本结合起来做坏事? 是否所有的事务都被充分记录了? 在写代码的时候问自己这些问题,否则以后可能要为了增加安全性而重写代码了。注意了这些问题的话,也许还不完全能保证系统的安全,但是至少可以提高安全性。

还可以考虑关闭 register_globals,magic_quotes 或者其它使编程更方便但会使某个变量的合法性,来源和其值被搞乱的设置。

2、用户输入表单问题

验证用户输入的任何数据,保证PHP代码的安全。 注意1:JS只是为了提高来访用户的体验而产生的,而不是验证的工具。因为任何一个来访的用户都可能会,也有可能无意间就禁用了客户端脚本的执行,从而跳过这层验证。所以我们必须在PHP的服务器端程序上检验这些数据。 注意2:不要使用$_SERVER[‘HTTP_REFERER’]这个超级变量来检查数据的来源地址,一个很小的菜鸟黑客都会利用工具来伪造这个变量的数据,尽可能利用Md5,或者rand等函数来产生一个令牌,验证来源的时候,验证这个令牌是否匹配。

3、PHP文件权限问题

PHP 被设计为以用户级别来访问文件系统,所以完全有可能通过编写一段 PHP 代码来读取系统文件如/etc/passwd,更改网络连接以及发送大量打印任务等等。因此必须确保 PHP 代码读取和写入的是合适的文件。 请看下面的代码,用户想要删除自己主目录中的一个文件。假设此情形是通过 web 界面来管理文件系统,因此 Apache 用户有权删除用户目录下的文件。

<?php

$username = $_POST['user_submitted_name'];

$homedir = "/home/$username";

$file_to_delete = "$userfile";

unlink ("$homedir/$userfile");

echo "$file_to_delete has been deleted!";

?>

既然 username 变量可以通过用户表单来提交,那就可以提交别人的用户名和文件名,并删除该文件。这种情况下,就要考虑其它方式的认证:

-只给 PHP 的 web 用户很有限的权限。 -检查所有提交上来的变量。 -以下是更加安全的文件名和变量的验证和检查:

<?php

$username = $_SERVER['REMOTE_USER'];

$homedir = "/home/$username";

if (!ereg('^[^./][^/]*$', $userfile))

die('bad filename');

if (!ereg('^[^./][^/]*$', $username))

die('bad username');

?>

4、隐藏PHP扩展名

一般而言,通过隐藏的手段提高安全性被认为是作用不大的做法。但某些情况下,尽可能的多增加一份安全性都是值得的。 一些简单的方法可以帮助隐藏 PHP,这样做可以提高攻击者发现系统弱点的难度。在 php.ini 文件里设置 expose_php = off ,可以减少他们能获得的有用信息。 另一个策略就是让 web 服务器用 PHP 解析不同扩展名。无论是通过 .htaccess 文件还是 Apache 的配置文件,都可以设置能误导攻击者的文件扩展名: # 使PHP看上去像其它的编程语言 AddType application/x-httpd-php .asp .py .pl # 使 PHP 看上去像未知的文件类型 AddType application/x-httpd-php .bop .foo .133t # 使 PHP 代码看上去像HTML页面 AddType application/x-httpd-php .htm .html 要让此方法生效,必须把 PHP 文件的扩展名改为以上的扩展名。这样就通过隐藏来提高了安全性,虽然防御能力很低而且有些缺点。

本文分享自微信公众号 - php(phpdaily)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从运行原理及使用场景看Apache和Nginx

    用正确的工具,做正确的事情。 本文只作为了解Apache和Nginx知识的一个梳理,想详细了解的请阅读文末参考链接中的博文。 Web服务器 Web服务器也称为W...

    wangxl
  • 谈谈新浪微博背后的那些算法

    本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人...

    wangxl
  • 关于PHP程序员解决问题的能力

    原文出处: 韩天峰(@韩天峰-Rango) 这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高。解决问题...

    wangxl
  • Apache+PHP测试环境搭建

    4. 如图,下载页面有V15和V14两个版本,下载的时候要牢记版本,此处Apache安装版本需与之后的PHP选择一致

    7089bAt@PowerLi
  • win10 下配置 PHP 独立开发环境总结

    Apache 的官网上是不能下载 Apache 服务器的安装包的,只提供 Apache 的源码,下载下来需要用 VC++ 重新编译一下,并且还要配置不少东西(心...

    Wizey
  • 图解NumPy:常用函数的内在机制

    NumPy 是一个基础软件库,很多常用的 Python 数据处理软件库都使用了它或受到了它的启发,包括 pandas、PyTorch、TensorFlow、Ke...

    郭好奇同学
  • raw镜像与qcw2镜像互相转换

    raw格式是原始镜像,会直接当作一个块设备给虚拟机来使用,至于文件里面的空洞,则是由宿主机的文件系统来管理的,linux下的文件系统可以很好的支...

    yaohong
  • Python3 基础学习之数值简单运算

    zhangyudeiMac:~ zhangyu$ python3 /Users/zhangyu/Desktop/数据计算.py 

    ZY_FlyWay
  • 从微软Build2019大会看PowerBI战略及在中国的未来

    近日,微软的2019年Build大会在美国西雅图召开。国内的众多伙伴无缘亲身到场,但微软还是很好的将大会视频发布出来。这里分享 5 部,包括微软CEO在内的大会...

    BI佐罗
  • JS二维数组 8

    贵哥的编程之路

扫码关注云+社区

领取腾讯云代金券