配置文件和代码编写角度出发,总结记录php开发安全规范


以一
以一 2024-01-07 18:30:35 64897 赞同 0 反对 0
分类: 资源
php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市场。但是php本身的安全问题却一直不曾消停,以及不规范的php代码编写规范,使得web应用漏洞百出。这篇文章从配置文件和代码编写角度出发,总结记录php相关安全。新手上路,向前辈致敬。

php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市场。但是php本身的安全问题却一直不曾消停,以及不规范的php代码编写规范,使得web应用漏洞百出。这篇文章从配置文件和代码编写角度出发,总结记录php相关安全。新手上路,向前辈致敬。

配置文件和代码编写角度出发,总结记录php开发安全规范

请充分了解你的php

基本信息

注意到以下的文件结构在新版本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

敏感配置

以下是一些常见的配置举例,更多请查看: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"

关于危险函数

特殊符号:

“:反引号运算符在激活了安全模式或者关闭了 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

弱类型

前人之述备矣,仅仅做个汇总。同样还可以参看官网给出的类型表(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个版本后有些特性不太同,所以遇到的时候具体讨论

全局注册变量

如果已经弃用的 register_globals 指令被设置为 on 那么局部变量也将在脚本的全局作用域中可用。例如, $_POST[‘foo’] 也将以 $foo 的形式存在。这将会造成一些变量覆盖,条件判断绕过。以下是简化的全局变量认证绕过模型:

if(authenticated_user()){
    $authorized=true;
}
if($authorized){
    do something......
}

对于以上的绕过,我们可以有以下的规避措施:(1) php.ini register_globals=off(2) 在每次判断前初始化变量,如下:

$authorized=false;

if(authenticated_user()){
    $authorized=true;
}
if($authorized){
    do something......
}

php伪协议

伪协议在很多绕过场景下发挥着举足轻重的作用,如后面提到的文件包含file://协议绕过,以及最近才提出的phar协议反序列化对象注入,我们可以在不存在可控unserialization()函数的情况下利用phar反序列化对象,实现对象注入。所以在web应用中不要忽视他们的存在,千里之堤,溃于蚁穴。

file:///var/www/html  访问本地文件系统
ftp://:@   访问FTP(s) URLs
data://  数据流
http:// — 访问 HTTP(s) URLs
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流
zlib:// — 压缩流
data:// — Data (RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP Archive
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — Audio streams
expect:// — 处理交互式的流

向DVWA学习php安全的代码编写

以下样例来自于DVWA v1.9版本

sql注入

Low level

 

 



                                                        

 

 

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
以一L0
粉丝 0 资源 1143 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  509
MiSans 阿拉伯语字体文件  450
解决新版本麒麟系统中微信打开白屏显示  393
麒麟系统进行系统监控,查看进程的运行时间来优化性能  326
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  217
统信桌面专业版添加字体  210
统信uos单一程序黑屏,任务栏正常显示解决办法  209
统信uos快捷键文档  181
统信系统双无线网卡设置关闭开启单一网卡  145
分享一个磁盘恢复工具,适用于多平台(包括统信)  119
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!