文章851
标签121
分类10

PHP 中接入 Firebase 实时活动

2024-12-30T14:33:08.png

Firebase 是一个强大的平台,提供实时数据库功能,使开发者能够轻松构建和管理实时应用程序。本文将介绍如何在 PHP 中接入 Firebase 实时数据库,以实现数据的实时更新和管理。

前期准备

1. 创建 Firebase 项目

  • 登录 Firebase 控制台
  • 创建一个新的项目。
  • 在项目设置中找到您的项目的 Web API 密钥和数据库 URL。

2. 安装 Firebase PHP SDK

可以使用 Composer 安装 Firebase PHP SDK。首先确保您已经安装了 Composer,然后在项目目录中运行以下命令:

composer require kreait/firebase-php

连接 Firebase 实时数据库

1. 配置 Firebase

创建一个 PHP 文件(如 firebase.php),并添加以下代码:

<?php

require 'vendor/autoload.php'; // 包含 Composer 自动加载文件

use Kreait\Firebase\Factory;
use Kreait\Firebase\ServiceAccount;

// 设置 Firebase 认证
$serviceAccount = ServiceAccount::fromJsonFile(__DIR__.'/path/to/your-service-account.json');

$firebase = (new Factory)
    ->withServiceAccount($serviceAccount)
    ->withDatabaseUri('https://<your-database-name>.firebaseio.com/')
    ->create();

$database = $firebase->getDatabase();

?>

2. 读取和写入数据

写入数据

您可以使用以下代码将数据写入 Firebase 实时数据库:

// 写入数据
$newPost = $database
    ->getReference('posts')
    ->push([
        'title' => 'Hello World',
        'body' => 'This is my first post!',
    ]);

echo 'New post created with ID: '.$newPost->getKey();

读取数据

要读取数据,可以使用以下代码:

// 读取数据
$snapshot = $database->getReference('posts')->getSnapshot();

if ($snapshot->exists()) {
    $posts = $snapshot->getValue();
    print_r($posts);
} else {
    echo 'No data found.';
}

3. 实时监听数据变化

虽然 PHP 本身不支持实时监听,但您可以使用 Firebase 提供的 JavaScript SDK 在前端实现实时监听。以下是一种常见的做法:

在前端使用 Firebase JavaScript SDK

  1. 在 HTML 文件中引入 Firebase SDK:
<script src="https://www.gstatic.com/firebasejs/9.0.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.0.0/firebase-database.js"></script>
  1. 初始化 Firebase:
<script>
    const firebaseConfig = {
        apiKey: "YOUR_API_KEY",
        authDomain: "YOUR_PROJECT_ID.firebaseapp.com",
        databaseURL: "https://<your-database-name>.firebaseio.com/",
        projectId: "YOUR_PROJECT_ID",
        storageBucket: "YOUR_PROJECT_ID.appspot.com",
        messagingSenderId: "YOUR_SENDER_ID",
        appId: "YOUR_APP_ID"
    };

    // 初始化 Firebase
    const app = firebase.initializeApp(firebaseConfig);
    const database = firebase.database(app);

    // 监听数据变化
    const postsRef = database.ref('posts');
    postsRef.on('value', (snapshot) => {
        const data = snapshot.val();
        console.log(data);
    });
</script>

EvilBox Vulnhub 攻略:EvilBox One靶机

2024-12-30T12:42:41.png

EvilBox One 是一款在 Vulnhub 上提供的靶机,旨在帮助安全研究人员和渗透测试人员提高其技能。本文将详细介绍如何成功攻克 EvilBox One 靶机,包括信息收集、漏洞利用和获取根权限的步骤。

环境准备

1. 下载靶机

Vulnhub 下载 EvilBox One 的镜像文件(通常为 OVA 格式)。

2. 设置虚拟机

  • 使用 VirtualBoxVMware 导入下载的镜像。
  • 配置网络为“桥接模式”或“仅主机模式”,以便与主机进行通信。

3. 启动靶机

启动虚拟机后,使用 ifconfigip a 命令在靶机上查看其 IP 地址。

信息收集

1. 扫描开放端口

使用 Nmap 对靶机进行端口扫描,以识别开放的服务:

nmap -sV -p- <靶机IP>
sudo nmap -sS -sV -sC -p- 192.168.56.103 -oN nmap_full_scan
[sudo] password for kali: 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-25 02:01 EDT
Nmap scan report for bogon (192.168.56.103)
Host is up (0.00030s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 44:95:50:0b:e4:73:a1:85:11:ca:10:ec:1c:cb:d4:26 (RSA)
|   256 27:db:6a:c7:3a:9c:5a:0e:47:ba:8d:81:eb:d6:d6:3c (ECDSA)
|_  256 e3:07:56:a9:25:63:d4:ce:39:01:c1:9a:d9:fe:de:64 (ED25519)
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:3A:ED:42 (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.19 seconds

2. 识别服务

根据 Nmap 的输出,确定运行的服务和版本。重点关注常见的漏洞服务(如 SSH、HTTP、FTP 等)。

漏洞分析

1. Web 服务

如果发现 HTTP 服务,访问靶机的 IP 地址,检查有无网站或应用程序。使用以下工具进行进一步的测试:

  • DirbGobuster:用于目录和文件枚举。

    dirb http://<靶机IP>/
  • Burp Suite:用于拦截和修改 HTTP 请求。

2. 识别潜在漏洞

搜索发现的服务和应用程序的已知漏洞。可以参考 CVE 数据库或 Exploit-DB

漏洞利用

1. 利用 Web 漏洞

如果网站存在 SQL 注入、XSS 或文件上传漏洞,尝试利用这些漏洞获取敏感信息或执行代码。

2. SSH 登录

如果 Nmap 扫描中发现 SSH 服务,可以尝试使用默认凭据进行登录:

ssh <用户名>@<靶机IP>

常见的默认凭据包括:

  • 用户名:root / admin
  • 密码:toor / admin

3. 利用已知漏洞

如果识别到特定服务的已知漏洞,可以使用 Metasploit 等工具进行漏洞利用。例如:

msfconsole
use exploit/linux/http/<vulnerability_module>
set RHOST <靶机IP>
set RPORT <port>
exploit

获取根权限

1. 提权

一旦获取到低权限的 shell,检查系统以寻找提权路径。常见的方法包括:

  • SUID/GUID 文件:查找具有 SUID 权限的可执行文件。
find / -perm -4000 -type f 2>/dev/null
  • cron 作业:检查是否有可被利用的 cron 作业。
cat /etc/crontab

2. 获取根权限

利用发现的提权漏洞,获取根权限。可以尝试使用 python, bash 等方法执行提权命令。

python -c 'import os; os.setuid(0); os.system("/bin/sh")'

EvilBox One 靶机提供了一个很好的学习和实践渗透测试技能的机会。通过信息收集、漏洞分析和利用,您可以逐步攻克这款靶机。建议在实践中保持耐心,并不断学习新的工具和技术,以提升自身的安全技能。

参考资料

解决 MySQL 中的字符集冲突问题:Illegal mix of collations

2024-12-30T10:20:36.png
在使用 MySQL 进行数据查询时,尤其是涉及到 JOIN 操作时,您可能会遇到以下错误信息:

Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='

这个错误通常表明在进行连接操作时,涉及的字段使用了不同的字符集或排序规则(collation),导致查询失败。本文将探讨这个问题的根源,并提供解决方案和示例。

问题背景

在 MySQL 中,字符集(Character Set)和排序规则(Collation)用于定义如何存储和比较字符串数据。常见的字符集包括 utf8mb4,而排序规则则决定了字符串比较的规则,如 utf8mb4_unicode_ciutf8mb4_0900_ai_ci

当您在 JOIN 查询中使用不同字符集或排序规则的字段时,MySQL 将无法正确执行比较,进而导致上述错误。

示例场景

假设我们有两个表 usersorders,它们的结构如下:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    order_number VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
);

在这个示例中,users.username 使用的是 utf8mb4_unicode_ci 排序规则,而 orders.order_number 使用的是 utf8mb4_0900_ai_ci 排序规则。

执行查询

当我们尝试执行以下查询时:

SELECT u.username, o.order_number 
FROM users u
LEFT JOIN orders o ON u.username = o.order_number;

将会出现如下错误:

Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='

解决方案

方法 1:统一字符集和排序规则

最直接的方法是确保两个表中参与比较的字段使用相同的字符集和排序规则。您可以通过以下命令修改表的列:

ALTER TABLE orders 
MODIFY order_number VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

或者,您也可以将 users.username 修改为 utf8mb4_0900_ai_ci

ALTER TABLE users 
MODIFY username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

方法 2:在查询中强制转换字符集

如果您不想或不能修改表结构,可以在查询中使用 COLLATE 关键字来强制转换字符集。例如:

SELECT u.username, o.order_number 
FROM users u
LEFT JOIN orders o ON u.username COLLATE utf8mb4_0900_ai_ci = o.order_number;

方法 3:使用 BINARY 运算符

另一种方法是使用 BINARY 运算符,这将强制将比较转换为字节比较:

SELECT u.username, o.order_number 
FROM users u
LEFT JOIN orders o ON BINARY u.username = BINARY o.order_number;

如何使用 Composer 导入与本地项目匹配的 PHP 7.2 版本的包

2024-12-24T06:43:49.png

在 PHP 开发中,使用 Composer 是管理项目依赖关系的常用工具。当您需要导入与本地项目匹配的 PHP 7.2 版本的包时,可以通过指定版本要求来确保 Composer 安装符合要求的包。本文将向您展示如何使用 Composer 来实现这一目标。

步骤 1: 准备工作

确保您已经在本地项目目录下创建了 composer.json 文件,并且已经正确配置了 PHP 环境变量以便在命令行中使用 Composer。

步骤 2: 批量导入包并指定 PHP 版本

在命令行中运行以下命令,以导入多个包并指定 PHP 7.2 版本:

composer require package1:^version1 package2:^version2 php:^7.2
  • package1:^version1package2:^version2 分别代表您要安装的包及其版本要求。
  • php:^7.2 表示指定 PHP 的 7.2 版本或更高版本。

示例

假设您想要导入 google/cloud-vision 包,并且需要确保您的项目与 PHP 7.2 版本兼容,可以运行以下命令:

composer require google/cloud-vision:^1.0 php:^7.2

这将安装 google/cloud-vision 包的 1.0 版本或更高版本,并同时确保 PHP 版本为 7.2。

记录 PT-Online-Schema-Change 在线优化内存碎片失败 , 大表生产优化方案

1.2亿数据量 , 删除到2w条后
2024-12-16T09:38:23.png

2024-12-16T08:46:22.png

异步的修复内存碎片失败 , 最后只能使用老办法 , rename table 了

执行方案如下 :

  1. 对外公告维护
  2. 关闭所有写入脚本和接口
  3. 确认待维护表无新增数据
  4. rename table table_name to new_table_name
    这一步非常快 就算有非常大的数据量更换也只用了1秒不到
  5. 导出从库中的 table_name 表记录, 在主库创建 新的 table_name ,新创建表 子增ID + 10w 保证ID 唯一 , insert 从库数据.

为什么不使用 INSERT INTO table_name SELECT * FROM new_table_name ?
因为执行太慢了, 在维护公告之前 我就已经测试了 上面的 sql 执行时间 , 非常的漫长 还搞不定. 维护时间肯定不能等那么久. 所以采用上面的老方案 替换表从库导入.

">