| 
                        副标题[/!--empirenews.page--]
                        【新品产上线啦】51CTO播客,随时随地,碎片化学习
             一、前言 
php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市场。但是php本身的安全问题却一直不曾消停,以及不规范的php代码编写规范,使得web应用漏洞百出。这篇文章从配置文件和代码编写角度出发,总结记录php相关安全。新手上路,向前辈致敬。 
  
二、请充分了解你的php 
1. 基本信息 
注意到以下的文件结构在新版本php或者不同的发行版中略有不同,就好比在ubuntu18.04中安装php7就和下面的文件结构有较大的差别,所以下面的文件仅仅作为一个apache的架构参考。 
    - Root:/var/www/html
 
    - 默认Web服务:Apache(可以使用Lighttpd或Nginx代替)
 
    - 默认PHP配置文件:/etc/php.ini
 
    - 默认PHP Extensions
 
    - 配置目录:/etc/php.d/
 
    - PHP安全配置样例文件:/etc/php.d/security.ini(需要使用文本编辑器创建这个文件)
 
    - php 版本: php -v
 
    - 查看当前PHP所编译 : php -m
 
 
2. 敏感配置 
以下是一些常见的配置举例,更多请查看: 
http://php.net/manual/zh/ini.core.php#ini.variables-order。 
不在请求头中泄露php信息: 
- expose_php=Off 
 
  
不回显php错误(包括运行错误时和启动时错误),但是进行错误记录: 
- play_errors=Off   
 - display_startup_errors=off 
 - log_errors=On 
 - error_log=/var/log/httpd/php_scripts_error.log 
 
  
文件上传开启与否和最大上传文件限制: 
- file_uploads=On 
 - upload_max_filesize=1M 
 
  
控制最大post数据: 
- post_max_size=1M 
 
  
注意:到要比upload_max_filesize大,否则后者失效。 
关闭远程代码执行: 
- allow_url_fopen=Off 
 - allow_url_include=Off 
 
  
关闭全局注册变量,不过默认5.x版本的php是off: 
- register_globals=off 
 
  
关于安全模式和粗暴的魔术引号过滤,注意到save_mode模式在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了: 
- safe_mode=On 
 - safe_mode_include_dir = D:/phpstudy/www/include/ 
 - magic_quotes_gpc=Off   #如果开启了这个,然后在php应用中使用addslashes()过滤输入会造成双重转义,使得过滤无济于事,遇到这种情况时可以使用函数   get_magic_quotes_gpc() 进行检测。 
 - magic_quotes_runtime 
 
  
资源管理防止过分消耗服务器资源: 
- max_execution_time = 30 
 - max_input_time = 30 
 - memory_limit = 40M 
 
  
禁用危险函数: 
- disable_functions =  
 - phpinfo,eval,passthru,assert,exec,system,ini_set,ini_get,get_included_files, 
 - get_defined_functions,get_defined_constants,get_defined_vars, 
 - glob,``,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status, 
 - ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink, 
 - symlink,popepassthru,stream_socket_server,fsocket,fsockopen 
 
  
限制php访问文件系统: 
- open_basedir='/var/www/html/';......;...... 
 
  
session保存路径: 
- session.save_path="/var/lib/php/session" 
 
  
上传文件默认路径: 
- upload_tmp_dir="/var/lib/php/upload" 
 
  
3. 关于危险函数 
特殊符号: 
“:反引号运算符在激活了安全模式或者关闭了 shell_exec()  时是无效的,同时与其它某些语言不同,反引号不能在双引号字符串中使用。否则将会当作shell命令执行,执行效果等同于shell_exec()。 
    - 文件操作:http://php.net/manual/zh/ref.filesystem.php。
 
    - 全局信息,配置等:http://php.net/manual/zh/ref.info.php。
 
    - 程序执行:http://php.net/manual/zh/book.exec.php。
 
 
三、不要过分相信php 
1. 弱类型 
前人之述备矣,仅仅做个汇总。同样还可以参看官网给出的类型表(PHP 类型比较表)。 
- 0=='0'        //true 
 - 0 == 'abcdefg'    //true 
 - 1 == '1abcdef'    //true 
 - null==false     //true 
 - 123=='123'      //true  
 -  
 - //哈希比较 
 - "0e132456789"=="0e7124511451155" //true 
 - "0e123456abc"=="0e1dddada"    //false 
 - "0e1abc"=="0"     //true 
 -  
 - "0x1e240"=="123456"        //true 
 - "0x1e240"==123456        //true 
 -  
 - var_dump(intval('2'))    //2 
 - var_dump(intval('3abcd'))    //3 
 - var_dump(intval('abcd'))    //0 
 -  
 - //任意两个array,MD5相等 
 - var_dump(md5($array1)==var_dump($array2));    //true 
 -  
 - //case 自转换,以下代码输出i is less than 3 but not negative 
 - $i ="2abc"; 
 - switch ($i) { 
 - case 0: 
 - case 1: 
 - case 2: 
 -     echo "i is less than 3 but not negative"; 
 -     break; 
 - case 3: 
 -     echo "i is 3"; 
 - } 
 -  
 - //in_array的缺陷,array_search 
 - $array=[0,1,2,'3']; 
 - var_dump(in_array('abc', $array));  //true 
 - var_dump(in_array('1bc', $array));    //true 
 -  
 - //strcmp在php5.x个版本后有些特性不太同,所以遇到的时候具体讨论 
 
  
2. 全局注册变量 
                                                (编辑:滁州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |