2024-08-07

在PHP中,静态方法和非静态方法(也称为实例方法或对象方法)之间的主要区别在于它们的调用方式和访问权限。

静态方法:

  • 使用::关键字调用。
  • 可以在类的外部直接调用,无需创建对象。
  • 可以通过类名直接访问,不需要实例化对象。
  • 访问静态方法不需要实例化对象,因此它们不能通过$this访问对象的属性或方法。

非静态方法(实例方法):

  • 使用->关键字调用。
  • 必须通过对象调用,不能在类外部直接调用。
  • 可以通过类的实例访问。
  • 访问非静态方法需要实例化对象,因此它们可以通过$this访问对象的属性和方法。

感悟:

  • 当你需要无需实例化对象就能调用方法时,使用静态方法。
  • 当你需要访问或修改对象的状态时,使用非静态方法。
  • 如果一个方法与它所属的类的具体实例无关,那么它很可能应该是静态的。

下面是一个简单的例子,演示了静态方法和非静态方法的使用:




class MyClass {
    public static function staticMethod() {
        echo "这是一个静态方法。";
    }
 
    public function instanceMethod() {
        echo "这是一个非静态方法。";
    }
}
 
// 调用静态方法
MyClass::staticMethod();
 
// 调用非静态方法需要实例化对象
$instance = new MyClass();
$instance->instanceMethod();
2024-08-07

在PHP中搭建一个Web服务器可以使用PHP的内置服务器,但它主要用于开发和测试。不建议在生产环境中使用,因为它不支持并发连接和生产级的稳定性。

以下是使用PHP内置服务器的基本命令:




php -S localhost:8000

这将启动一个Web服务器,监听本机的8000端口。

如果你想要使用更健壮的Web服务器,可以考虑使用Apache或Nginx,这两者都是使用PHP时广泛使用的Web服务器软件。

以下是一个简单的Apache配置示例,用于运行PHP:

  1. 安装Apache(如果尚未安装):



sudo apt-get update
sudo apt-get install apache2
  1. 安装PHP(如果尚未安装):



sudo apt-get install php libapache2-mod-php
  1. 重新启动Apache:



sudo systemctl restart apache2
  1. 创建一个简单的PHP文件,例如index.php,并将其放置在Web服务器的文档根目录中,通常是/var/www/html



<?php
echo "Hello, World!";
  1. 在浏览器中访问http://localhost,你应该能看到输出。

确保Web服务器的配置文件(Apache的配置文件通常位于/etc/apache2/sites-available/000-default.conf)中有一个指向文档根目录的DocumentRoot指令,并且该目录具有适当的读取权限。

2024-08-07

在Windows系统中,可以使用命令行工具netsh来指定连接到特定的WiFi网络。以下是一个简单的批处理脚本示例,它会连接到一个名为“ExampleSSID”的WiFi网络,并且假设网络使用WPA2-PSK加密,密码为“examplepassword”。




@echo off
 
:: 设置WiFi网络的名称和密码
set SSID=ExampleSSID
set PASSWORD=examplepassword
 
:: 删除旧的WiFi配置
netsh wlan delete profile name="%SSID%"
 
:: 创建新的WiFi配置
netsh wlan save profile name="%SSID%" keyMaterial="%PASSWORD%" folder="."
 
:: 连接到WiFi网络
netsh wlan connect name="%SSID%"
 
:: 结束
echo WiFi connection process completed.
pause

请确保将SSIDPASSWORD变量的值替换为实际的网络名称和密码。

注意:这个脚本会删除旧的WiFi配置文件,创建一个新的配置文件,并尝试连接到指定的WiFi网络。如果WiFi网络是开放的(不需要密码),可以省略密码设置步骤。

2024-08-07

要使用phpStudy在本地搭建网站并通过内网穿透进行远程访问,您需要完成以下步骤:

  1. 安装phpStudy。
  2. 配置网站。
  3. 安装并设置内网穿透软件。

以下是具体操作步骤和示例代码:

  1. 安装phpStudy:

    访问phpStudy官网下载最新版本,按照引导进行安装。

  2. 配置本地网站:

    打开phpStudy,启动服务,并通过浏览器访问本地服务器。

  3. 安装内网穿透软件:

    例如,使用ngrok,需要访问ngrok官网注册账户并下载对应的软件。

  4. 设置内网穿透:

    在命令行中运行ngrok,并提供授权令牌和要暴露的端口号。




ngrok authtoken <YOUR_AUTHTOKEN>
ngrok http 80
  1. 访问您的网站:

    启动内网穿透后,ngrok会提供一个外网可访问的地址,使用这个地址就可以在远程设备上访问您的本地网站。

请注意,内网穿透服务如ngrok可能需要一个付费账户来获得稳定的链接,而且在使用时需要确保您的外网可访问地址不会导致安全问题。

2024-08-07

这是一个BugKu平台的PHP题目,名为“聪明的PHP”。这个问题涉及到PHP代码审计和安全性。

题目描述:




<?php
$flag = "bugku{*****************}";
if (isset ($_GET['password'])) {
    if (eregi ("iloveyou", $_GET['password'])) {
        echo 'YOU SHOULD NOT LOVE ME';
        exit;
    }
    if (eregi ('[a-zA-Z0-9]', $_GET['password'])) {
        echo 'ONLY NUMBERS AND LETTERS';
        exit;
    }
    $password = $_GET['password'];
    if ($password == "1314520") {
        echo $flag;
    } else {
        echo 'WRONG PASSWORD';
    }
} else {
    highlight_file(__FILE__);
}
?>

解决方法:

这个问题的关键在于绕过三层过滤。第一层是eregi函数,它检查$\_GET['password']是否包含"iloveyou"字符串。第二层过滤检查是否只包含字母和数字。最后一层是检查密码是否等于1314520。

  1. 绕过eregi函数的"iloveyou"检查,可以使用unicode字符集,例如I\u006Cove\u006Fyou
  2. 绕过只包含字母和数字的检查,可以使用特殊字符,例如1314520a

因此,构造的payload为:




password=I\u006Cove\u006Fyou1314520a

将此payload作为URL参数传递,即可得到flag。

注意:eregi函数在PHP 7.0.0版本后已被废弃,并在PHP 7.3.0中完全移除。在实际应用中,应该使用preg_match函数和i修饰符来进行不区分大小写的正则表达式匹配。

2024-08-07

在PHP中处理高并发主要有两种方法:多进程和多线程。以下是使用多线程处理高并发的示例代码:




class AsyncOperation extends Thread {
    public $url;
 
    public function __construct($url) {
        $this->url = $url;
    }
 
    public function run() {
        if ($this->url) {
            $response = file_get_contents($this->url);
            // 处理响应
        }
    }
}
 
// 使用ThreadPool处理并发
$pool = new Pool(4); // 最多并发4个线程
 
// 添加任务到线程池
for ($i = 0; $i < 10; $i++) {
    $url = "http://example.com/api/data?id=" . $i;
    $worker = new AsyncOperation($url);
    $pool->submit($worker);
}
 
// 等待所有线程完成
$pool->shutdown();

这段代码使用了Pthreads扩展来创建多线程环境。AsyncOperation类继承自Thread,实现了线程要执行的任务。然后,我们创建了一个Pool对象,限制最多并发执行4个线程。我们将需要并发执行的任务通过submit方法提交到线程池,并在所有任务完成后调用shutdown方法等待线程池关闭。

请注意,Pthreads扩展在PHP 7.4之后不再被官方支持,因此在使用时需要考虑兼容性问题。此外,多线程在处理共享资源时可能会遇到同步和竞态条件的问题,需要特别注意线程安全性。

2024-08-07

array_reduce() 函数在PHP中是用来通过使用用户自定义的函数来减少数组,从而将数组简化为单一值的。这个函数会对数组中的每个元素应用回调函数,并且将上次的回调函数结果与当前的元素组合起来。

下面是一个使用 array_reduce() 函数的例子,它将一个整数数组中的所有元素相加,从而得到数组元素的总和。




<?php
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function ($carry, $item) {
    return $carry + $item;
});
 
echo $sum; // 输出 15
?>

在这个例子中,array_reduce() 函数的第二个参数是一个匿名函数,它接受两个参数:$carry(进位值)和 $item(当前元素)。这个匿名函数的作用是将当前元素加到进位值上,并返回新的进位值。在第一次迭代时,$carry 的值是数组的第一个元素,而 $item 是第二个元素。随着迭代的进行,$carry 的值会不断更新,最终计算出数组的总和。

2024-08-07

在CTF中,PHP可能会有一些函数和正则表达式的限制,以至于我们需要找到绕过的方法。以下是一些常见的PHP函数和正则表达式的绕过方法:

  1. preg_match()preg_replace():

    • 利用点.匹配换行符绕过,如果正则表达式中使用了s修饰符,点就会匹配换行符。
    • 使用\R来匹配所有的换行符,这在PHP 7.2.0以上版本中可用。
    • 利用(?s)来启用preg_match()中的.匹配换行符。
  2. eval():

    • 使用其他代码执行函数如assert()create_function()array_map()call_user_func()替换eval()进行绕过。
  3. disable_functions:

    • 如果eval()或其他函数被禁用,可以使用base64编码来执行代码。
  4. shell_exec(), exec(), system(), passthru():

    • 使用PHP的内置函数如pcntl_exec() (需要proc\_open函数开启),或者使用文件包含漏洞来运行外部程序。
  5. file_get_contents(), fopen(), file(), readfile():

    • 使用PHP的内置函数如fsockopen()配合file_get_contents()或者fopen()来读取远程文件。
  6. parse_str():

    • 使用%00截断的方法绕过,如?var=something&something=%00
  7. escapeshellarg(), escapeshellcmd():

    • 使用特殊构造的字符串绕过,比如用单引号替代双引号,或者使用管道操作符(|)和后台命令。
  8. preg_replace()e修饰符:

    • 在PHP 5.5.0以上,preg_replace()/e修饰符被移除,但可以使用preg_replace_callback()代替。

以上是一些常见的PHP函数和正则表达式的绕过方法,具体情况还需要根据CTF题目的具体限制来选择合适的绕过方式。

2024-08-07

在PHP中实现文件上传功能,需要使用超全局变量$_FILES,它包含了所有上传的文件信息。以下是一个简单的例子:

  1. HTML表单代码(upload\_form.html):



<form action="upload.php" method="post" enctype="multipart/form-data">
  选择文件:<input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="上传文件" name="submit">
</form>
  1. PHP处理上传(upload.php):



<?php
$target_dir = "uploads/"; // 指定上传目录
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); // 目标文件路径
 
// 检查文件大小
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "抱歉,文件过大。";
  exit;
}
 
// 允许的文件格式
$allowed_types = array("jpg", "png", "jpeg", "gif");
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
if (!in_array($imageFileType, $allowed_types)) {
  echo "抱歉,只允许 JPG, JPEG, PNG & GIF 文件格式。";
  exit;
}
 
// 检查是否有错误
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
  echo "文件上传成功。";
} else {
  echo "上传失败。";
}
?>

确保服务器配置文件php.ini中已经正确设置了文件上传的相关配置项,如upload_max_filesizepost_max_size,以及确保上传目录有足够的权限。

2024-08-07



<?php
// 高精度加法
function bcadd($left_operand, $right_operand, $scale = 0) {
    return $left_operand + $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 高精度减法
function bcsub($left_operand, $right_operand, $scale = 0) {
    return $left_operand - $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 高精度乘法
function bcmul($left_operand, $right_operand, $scale = 0) {
    return $left_operand * $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 高精度除法
function bcdiv($left_operand, $right_operand, $scale = 0) {
    return $left_operand / $right_operand; // 示例代码,实际应使用BCMath库
}
 
// 比较高精度数字
function bccomp($left_operand, $right_operand, $scale = 0) {
    return $left_operand <=> $right_operand; // PHP 7+ 的 spaceship 运算符用于比较
}
 
// 高精度取模
function bcmod($left_operand, $modulus) {
    return $left_operand % $modulus; // 示例代码,实际应使用BCMath库
}
 
// 高精度指数运算
function bcpow($left_operand, $right_operand, $scale = 0) {
    return pow($left_operand, $right_operand); // 示例代码,实际应使用BCMath库
}
 
// 高精度平方根
function bcsqrt($operand, $scale = 0) {
    return sqrt($operand); // 示例代码,实际应使用BCMath库
}
 
// 将字符串转换为高精度数字
function bcadd($number, $scale = 0) {
    return floatval($number); // 示例代码,实际应使用BCMath库
}
 
// 设置全局精度和小数点位数
function bcscale($scale) {
    return ini_set('bcscale', $scale); // 示例代码,实际应使用BCMath库
}
 
// 以下是使用示例
$result1 = bcadd(1.234, 4.567);
$result2 = bcsub(2.345, 1.234);
$result3 = bcmul(3.456, 7.890);
$result4 = bcdiv(10.000, 3.000);
$compare = bccomp(5.555, 5.554);
$modulus = bcmod(123, 10);
$power = bcpow(2, 8);
$sqrt = bcsqrt(16);
$str2num = bcadd('123.456');
$scale = bcscale(4);
 
// 打印结果
print_r($result1);
print_r($result2);
print_r($result3);
print_r($result4);
print_r($compare);
print_r($modulus);
print_r($power);
print_r($sqrt);
print_r($str2num);
print_r($scale);
 
// 注意:以上代码只是为了展示函数的使用方式,实际上这些函数需要PHP的BCMath扩展支持。
// 在实际应用中,应确保BCMath库已经安装并启用。
?>

这段代码展示了如何使用PHP中的高精度计算函数。每个函数都是一个简单的示例,说明了它们的功能和用法。注意,这