feat: add even more vulnerabilities! migrate to mysql

This commit is contained in:
2025-06-05 21:25:40 +03:00
parent 11b7696c19
commit 5bea4d52cb
10 changed files with 236 additions and 53 deletions

View File

@ -2,7 +2,11 @@
include_once 'utils.php';
$RESULT_MODE = SQLITE3_BOTH;
$RESULT_MODE = PDO::FETCH_BOTH;
$host = '127.0.0.1';
$db_user = 'root';
$db_password = 'mysql';
session_start();
@ -28,6 +32,8 @@ function connectToRedis()
function initializeNewUser()
{
global $host, $db_user, $db_password;
$redis = connectToRedis();
if (!$redis) {
return false;
@ -40,25 +46,35 @@ function initializeNewUser()
'status' => 'active'
]));
$db_file = "db/$user_id.db";
$db = new SQLite3($db_file);
/* $db_file = "db/$user_id.db"; */
$connStr = "mysql:host=$host;port=3306;charset=UTF8";
try {
$db = new PDO($connStr, $db_user, $db_password);
$schema_sql = file_get_contents('db/schema.sql');
if (!$schema_sql) {
error_log("Failed to read schema file: $schema_path");
return false;
$db->exec("CREATE DATABASE IF NOT EXISTS `$user_id`;");
$db->exec("USE `$user_id`;");
error_log("new db was created successfully! $user_id", 0);
$schema_sql = file_get_contents('db/schema.sql');
if (!$schema_sql) {
error_log("Failed to read schema file: $schema_path");
return false;
}
$db->exec($schema_sql);
}
catch(PDOException $e) {
error_log($e, 0);
throw new Exception($e->getMessage());
}
$db->exec($schema_sql);
if (!$db) {
// Cleanup Redis entry if db creation fails
$redis->hDel('users', $user_id);
return false;
}
$db->close();
return ["user_id" => $user_id, "db_file" => "db/$user_id.db"];
return ["user_id" => $user_id];
}
function initializeApp($existing_user_id = null)
@ -72,13 +88,27 @@ function initializeApp($existing_user_id = null)
function getDB($user_id = null)
{
if (!is_null($user_id)) {
$db_file = "db/$user_id.db";
if (!file_exists($db_file)) {
return createUserDatabase($user_id);
}
return new SQLite3($db_file);
global $host, $db_user, $db_password;
if (is_null($user_id)) {
error_log('user id is null', 0);
return null;
}
error_log("Global vars - host: $host, user: $db_user, password: $db_password", 0);
try {
$connStr = "mysql:host=$host;port=3306;charset=UTF8";
$pdo = new PDO($connStr, $db_user, $db_password);
} catch(PDOException $e) {
error_log($e, 0);
throw new Exception($e->getMessage());
}
/* $pdo->exec("CREATE DATABASE IF NOT EXISTS `$user_id`;"); */
$pdo->exec("USE `$user_id`;");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}
function registerUser($username, $email, $password)
@ -86,7 +116,12 @@ function registerUser($username, $email, $password)
$db = getDB($_COOKIE['user_id']);
$query = "INSERT INTO users(username, email, password) values ('$username', '$email', '$password');";
return $db->exec($query);
$res = $db->exec($query);
if ($res === false) {
$errorInfo = $db->errorInfo();
throw new Exception("MySQL Error: $errorInfo[2]. (Code: $errorInfo[1])");
}
return $res;
}
function loginUser($email, $password)
@ -94,8 +129,8 @@ function loginUser($email, $password)
global $RESULT_MODE;
$db = getDB($_COOKIE['user_id']);
$query = "SELECT username, password FROM users WHERE email = '$email';";
$result = $db->query($query)->fetchArray($RESULT_MODE);
if ($result["password"] === $password) {
$result = $db->query($query)->fetch($RESULT_MODE);
if ($result && $result["password"] === $password) {
return $result['username'];
} else {
return null;
@ -107,9 +142,10 @@ function getUserById($id)
global $RESULT_MODE;
$db = getDB($_COOKIE['user_id']);
$query = "SELECT username, email FROM users WHERE id = $id";
try {
$result = $db->query($query);
return $result->fetchArray($RESULT_MODE);
return $result->fetch($RESULT_MODE);
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
}
@ -121,6 +157,7 @@ function createProduct($title, $amountInStock)
$query = "INSERT INTO products(title, amount_in_stock) values ('$title', $amountInStock)";
try {
error_log($query, 0);
return $db->exec($query);
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
@ -138,14 +175,15 @@ function getProductsByTitle($title)
try {
$result = $db->query($query);
if ($result === false) {
error_log("{$db->lastErrorCode()}", 0);
throw new Exception($db->lastErrorMsg());
$errorInfo = $db->errorInfo();
throw new Exception($errorInfo[2]);
}
$products = [];
while ($row = $result->fetchArray($RESULT_MODE)) {
while ($row = $result->fetch($RESULT_MODE)) {
$products[] = $row;
}
$_SESSION['error_message'] = null;
return $products;
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
@ -162,9 +200,10 @@ function getAllProducts()
try {
$result = $db->query($query);
$products = [];
while ($row = $result->fetchArray($RESULT_MODE)) {
while ($row = $result->fetch($RESULT_MODE)) {
$products[] = $row;
}
return $products;
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
@ -192,7 +231,10 @@ function getOrdersForUser($userId)
try {
$result = $db->query($query);
return $result->fetchArray($RESULT_MODE);
if ($result) {
return $result->fetch($RESULT_MODE);
}
return null;
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
}
@ -207,7 +249,32 @@ function getOrdersForProduct($productId)
try {
$result = $db->query($query);
return $result->fetchArray($RESULT_MODE);
if ($result) {
return $result->fetch($RESULT_MODE);
}
return null;
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
}
}
function getAllUsers()
{
global $RESULT_MODE;
$db = getDB($_COOKIE['user_id']);
$query = "SELECT id, username, email FROM users";
try {
$result = $db->query($query);
if (!$result) {
return null;
}
$users = [];
while ($row = $result->fetch($RESULT_MODE)) {
$users[] = $row;
}
return $users;
} catch (Exception $e) {
$_SESSION['error_message'] = $e->getMessage()."\n";
}