[PHP] 纯文本查看 复制代码 <?php
// 数据库信息
$host = '127.0.0.1'; // 数据库主机名
$dbname = ''; // 数据库名称
$username = ''; // 数据库用户名
$password = ''; // 数据库密码
$key = 'fegvdvregdb';// 验证密文
// 获取 POST 请求中的 msgkey 参数
$msgkey = $_POST['msgkey'];
// 初始化返回结果
$result = array(
'code' => 200,
);
// 验证 msgkey 是否与网站内置的一致
if ($msgkey!= $key) {
// 如果不一致,返回 code 状态码为 202 和错误信息
$result['code'] = 202;
$result['message'] = 'Invalid msgkey';
} else {
// 解密 SQL 语句
$encrypted_sql = $_POST['sql'];
$decrypted_sql = openssl_decrypt($encrypted_sql, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if ($decrypted_sql === false) {
// 解密失败,返回 code 状态码为 203 和错误信息
$result['code'] = 203;
$result['message'] = 'Decryption failed';
} else {
try {
// 使用数据库连接池获取连接
$connectionPool = new ConnectionPool($host, $dbname, $username, $password);
$pdo = $connectionPool->getConnection();
// 设置连接超时时间(示例为 5 秒)
$pdo->setAttribute(PDO::ATTR_TIMEOUT, 5);
// 预处理 SQL 语句并绑定参数(如果有参数的话)
$stmt = $pdo->prepare($decrypted_sql);
// 假设 $params 是包含参数的数组
if (isset($params)) {
foreach ($params as $key => $value) {
$stmt->bindValue($key, $value);
}
}
$stmt->execute();
// 获取cha询结果
if (strpos(strtolower($decrypted_sql), 'select') === 0) {
$result['data'] = $stmt->fetchAll(PDO::FETCH_ASSOC);
} else {
$result['data'] = array('affected_rows' => $stmt->rowCount());
}
// 将连接归还到连接池
$connectionPool->releaseConnection($pdo);
} catch (PDOException $e) {
// 记录错误日志
error_log('Database error: '. $e->getMessage());
// 发生错误,设置 code 为 201 并输出错误信息
$result['code'] = 201;
$result['message'] = $e->getMessage();
}
}
}
// 输出 JSON 格式的结果
header('Content-Type: application/json');
echo json_encode($result, JSON_UNESCAPED_UNICODE);
class ConnectionPool
{
private $host;
private $dbname;
private $username;
private $password;
private $connections = [];
private $maxConnections = 10; // 设置最大连接数
public function __construct($host, $dbname, $username, $password)
{
$this->host = $host;
$this->dbname = $dbname;
$this->username = $username;
$this->password = $password;
}
public function getConnection()
{
if (empty($this->connections)) {
return new PDO("mysql:host=$this->host;dbname=$this->dbname", $this->username, $this->password);
} else {
return array_pop($this->connections);
}
}
public function releaseConnection($connection)
{
if (count($this->connections) < $this->maxConnections) {
$this->connections[] = $connection;
} else {
$connection = null;
}
}
}
?>
[color=rgba(0, 0, 0, 0.85)]此代码实现了一个与数据库交互的系统,通过验证密文来确保请求的合法性,然后对加密的 SQL 语句进行解密并执行,最后返回执行结果。同时,使用了连接池来管理数据库连接,以提高性能和资源利用率。
|