diff --git a/actions/channel_sync.php b/actions/channel_sync.php index d14dd9d..2f11e65 100644 --- a/actions/channel_sync.php +++ b/actions/channel_sync.php @@ -5,7 +5,7 @@ if (isset($_POST['sync'])) { - foreach ($_POST as $key => $value) { + foreach ($_POST as $key => $value) { if (substr($key, 0, 7) == "target_") { $target = ltrim($key, 'target_'); $target_fields = explode("|", $target); @@ -13,6 +13,13 @@ $target_id=$target_fields[1]; $target_id=str_replace("_com", ".com", $target_id); + // Database names cannot be parameterized in prepared statements (they are identifiers, not values) + // so we use a whitelist to validate the database name before using string interpolation + $allowed_dbs = explode(",", $dbname); + if (!in_array($target_db, $allowed_dbs)) { + die("Invalid database"); + } + // Delete All Previous Trackings $stmt = $conn->prepare("DELETE FROM ".$target_db.".monsters WHERE id = ?"); $rs = $stmt->bind_param("s", $target_id); diff --git a/actions/set_language.php b/actions/set_language.php index 492b43b..335230b 100644 --- a/actions/set_language.php +++ b/actions/set_language.php @@ -11,8 +11,10 @@ // Update Language in DB -$sql = "UPDATE humans set language = '".$_GET['lng']."' WHERE id = '" . $_SESSION['id'] . "'"; -$result = $conn->query($sql) or die(mysqli_error($conn)); +$stmt = $conn->prepare("UPDATE humans SET language = ? WHERE id = ?"); +$stmt->bind_param("ss", $_GET['lng'], $_SESSION['id']); +$stmt->execute() or die(mysqli_error($conn)); +$stmt->close(); header("Location: $redirect_url"); diff --git a/actions/set_location.php b/actions/set_location.php index 9b8cd47..ed8f32a 100644 --- a/actions/set_location.php +++ b/actions/set_location.php @@ -10,16 +10,26 @@ $lat = "0.0000000000"; $lon = "0.0000000000"; - $sql = "UPDATE monsters set distance = 0 WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '".$_SESSION['profile']."'"; - $result = $conn->query($sql); - $sql = "UPDATE raid set distance = 0 WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '".$_SESSION['profile']."'"; - $result = $conn->query($sql); - $sql = "UPDATE egg set distance = 0 WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '".$_SESSION['profile']."'"; - $result = $conn->query($sql); - $sql = "UPDATE quest set distance = 0 WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '".$_SESSION['profile']."'"; - $result = $conn->query($sql); - $sql = "UPDATE invasion set distance = 0 WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '".$_SESSION['profile']."'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("UPDATE monsters set distance = 0 WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $stmt->close(); + $stmt = $conn->prepare("UPDATE raid set distance = 0 WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $stmt->close(); + $stmt = $conn->prepare("UPDATE egg set distance = 0 WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $stmt->close(); + $stmt = $conn->prepare("UPDATE quest set distance = 0 WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $stmt->close(); + $stmt = $conn->prepare("UPDATE invasion set distance = 0 WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $stmt->close(); } else if ( isset($_GET['lat']) && isset($_GET['lon']) ) { diff --git a/actions/switch_profile.php b/actions/switch_profile.php index c99b9d4..8fa6d2e 100644 --- a/actions/switch_profile.php +++ b/actions/switch_profile.php @@ -11,23 +11,23 @@ $_SESSION['profile'] = $_POST['profile']; } - if ( isset($_POST['activate']) ) { - - $sql = "SELECT area, latitude, longitude from profiles WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '".$_POST['profile']."'"; - $result = $conn->query($sql); - while ($row = $result->fetch_assoc()) { - $area = $row['area']; - $latitude = $row['latitude']; - $longitude = $row['longitude']; + if ( isset($_POST['activate']) ) { + + $stmt = $conn->prepare("SELECT area, latitude, longitude from profiles WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_POST['profile']); + $stmt->execute(); + $result = $stmt->get_result(); + while ($row = $result->fetch_assoc()) { + $area = $row['area']; + $latitude = $row['latitude']; + $longitude = $row['longitude']; } + $stmt->close(); - $sql = "UPDATE humans - SET area = '".$area."', - latitude = '".$latitude."', - longitude = '".$longitude."', - current_profile_no = '".$_POST['profile']."' - WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("UPDATE humans SET area = ?, latitude = ?, longitude = ?, current_profile_no = ? WHERE id = ?"); + $stmt->bind_param("ssdis", $area, $latitude, $longitude, $_POST['profile'], $_SESSION['id']); + $stmt->execute(); + $stmt->close(); header("Location: $redirect_url?type=display&page=profiles&return=success_switch_profile_activate"); @@ -41,27 +41,32 @@ // Get Next Profile Number #$sql = "SELECT IFNULL(max(profile_no),0)+1 next_profile from profiles WHERE id = '" . $_SESSION['id'] . "'"; - $sql = "SELECT MIN(t1.profile_no + 1) AS nextID - FROM (select profile_no from profiles WHERE id = '".$_SESSION['id']."' UNION select 0 profile_no) t1 - LEFT JOIN (select profile_no from profiles WHERE id = '".$_SESSION['id']."' UNION select 0 profile_no) t2 + $stmt = $conn->prepare("SELECT MIN(t1.profile_no + 1) AS nextID + FROM (select profile_no from profiles WHERE id = ? UNION select 0 profile_no) t1 + LEFT JOIN (select profile_no from profiles WHERE id = ? UNION select 0 profile_no) t2 ON t1.profile_no + 1 = t2.profile_no - WHERE t2.profile_no IS NULL"; - - $result = $conn->query($sql); + WHERE t2.profile_no IS NULL"); + $stmt->bind_param("ss", $_SESSION['id'], $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $next_profile = $row['nextID']; } + $stmt->close(); if ( $next_profile == 1 ) { // Get Info on currently active Profile - $sql = "SELECT area, latitude, longitude from humans WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT area, latitude, longitude from humans WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $area = $row['area']; $latitude = $row['latitude']; $longitude = $row['longitude']; $_SESSION['profile_name'] = $_POST['profile_name']; } + $stmt->close(); } else { $area = "[]"; $latitude = "0.0000000000"; @@ -153,26 +158,32 @@ // Change Active Profile if Deleting Active one - $sql = "select current_profile_no FROM humans WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT current_profile_no FROM humans WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $current_profile = $row['current_profile_no']; } + $stmt->close(); if ( $current_profile == $_SESSION['profile']) { - $sql = "UPDATE humans set current_profile_no = - (select IFNULL(min(profile_no),1) from profiles where id = '".$_SESSION['id']."') - WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("UPDATE humans set current_profile_no = (select IFNULL(min(profile_no),1) from profiles where id = ?) WHERE id = ?"); + $stmt->bind_param("ss", $_SESSION['id'], $_SESSION['id']); + $stmt->execute(); + $stmt->close(); } // Check for smaller Profiles and redirect - $sql = "select IFNULL(min(profile_no),1) min from profiles WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT IFNULL(min(profile_no),1) min from profiles WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $_SESSION['profile'] = $row['min']; } + $stmt->close(); header("Location: $redirect_url?type=display&page=profiles&return=success_delete_profile"); diff --git a/admin_connect.php b/admin_connect.php index 9bdf287..74fd96e 100644 --- a/admin_connect.php +++ b/admin_connect.php @@ -46,8 +46,10 @@ } $conn = new mysqli($dbhost.":".$dbport, $dbuser, $dbpass, $_SESSION['dbname']); -$sql = "select id, name, type, notes FROM humans WHERE id = '".$search_id."'"; -$result = $conn->query($sql); +$stmt = $conn->prepare("SELECT id, name, type, notes FROM humans WHERE id = ?"); +$stmt->bind_param("s", $search_id); +$stmt->execute(); +$result = $stmt->get_result(); if ($result->num_rows == 0) { header("Location: $redirect_url?return=user_not_found"); @@ -60,6 +62,7 @@ $_SESSION['type']=$row['type']; $_SESSION['notes']=$row['notes']; } +$stmt->close(); // Get Config Items from API and Store in Session Variables @@ -108,11 +111,14 @@ // Switch to active Profile -$sql = "SELECT current_profile_no FROM humans WHERE id = '" . $_SESSION['id'] . "'"; -$result = $conn->query($sql); +$stmt = $conn->prepare("SELECT current_profile_no FROM humans WHERE id = ?"); +$stmt->bind_param("s", $_SESSION['id']); +$stmt->execute(); +$result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $_SESSION['profile'] = $row['current_profile_no']; } +$stmt->close(); header("Location: $redirect_url"); diff --git a/admin_sync.php b/admin_sync.php index c6176ca..2b5a0a5 100644 --- a/admin_sync.php +++ b/admin_sync.php @@ -94,8 +94,10 @@ foreach ($dbnames as &$db) { $conn = new mysqli($dbhost.":".$dbport, $dbuser, $dbpass, $db); - $sql = "select id, name, type FROM humans WHERE type like 'discord:channel' AND id <> '".$_SESSION['id']."' ORDER by name"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT id, name, type FROM humans WHERE type like 'discord:channel' AND id <> ? ORDER by name"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); ?> num_rows <> 0) { ?> @@ -145,8 +147,10 @@ foreach ($dbnames as &$db) { $conn = new mysqli($dbhost.":".$dbport, $dbuser, $dbpass, $db); - $sql = "select id, name, type FROM humans WHERE type in ('telegram:channel','telegram:group') AND id <> '".$_SESSION['id']."' ORDER by name"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT id, name, type FROM humans WHERE type in ('telegram:channel','telegram:group') AND id <> ? ORDER by name"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); ?> num_rows <> 0) { ?> @@ -196,8 +200,10 @@ foreach ($dbnames as &$db) { $conn = new mysqli($dbhost.":".$dbport, $dbuser, $dbpass, $db); - $sql = "select id, name, type FROM humans WHERE type like 'webhook' AND id <> '".$_SESSION['id']."' ORDER by name"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT id, name, type FROM humans WHERE type like 'webhook' AND id <> ? ORDER by name"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); ?> num_rows <> 0) { ?> diff --git a/header.php b/header.php index dcc8b8d..b6e407a 100644 --- a/header.php +++ b/header.php @@ -31,26 +31,34 @@ // Set Profile to current if not yet set if (!isset($_SESSION['profile']) && isset($_SESSION['id'])) { - $sql = "SELECT current_profile_no FROM humans WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT current_profile_no FROM humans WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $_SESSION['profile'] = $row['current_profile_no']; } + $stmt->close(); } // Check if user has Multiple Profiles if (isset($_SESSION['id'])) { - $sql = "SELECT name FROM profiles WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT name FROM profiles WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); $_SESSION['number_of_profiles'] = $result->num_rows; + $stmt->close(); } // Get Profile Name if (isset($_SESSION['id'])) { - $sql = "SELECT name FROM profiles WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '" . $_SESSION['profile'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT name FROM profiles WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $_SESSION['profile_name'] = $row['name']; @@ -58,68 +66,95 @@ } else { $_SESSION['profile_name'] = i8ln("Default"); } + $stmt->close(); } // Get Active Profile if (isset($_SESSION['id'])) { - $sql = "SELECT current_profile_no from humans WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT current_profile_no from humans WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $_SESSION['current_profile'] = $row['current_profile_no']; } + $stmt->close(); } // Check for Cleaned if (isset($_SESSION['id'])) { - $sql = "select min(clean) clean FROM monsters WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT min(clean) clean FROM monsters WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_mon_cleaned = $row['clean']; } - - $sql = "select min(clean) clean FROM (select id, clean from raid UNION select id, clean from egg) raidegg WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt->close(); + + $stmt = $conn->prepare("SELECT min(clean) clean FROM (select id, clean from raid UNION select id, clean from egg) raidegg WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_raid_cleaned = $row['clean']; } - - $sql = "select min(clean) clean FROM quest WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt->close(); + + $stmt = $conn->prepare("SELECT min(clean) clean FROM quest WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_quest_cleaned = $row['clean']; } + $stmt->close(); - $sql = "select min(clean) clean FROM invasion WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT min(clean) clean FROM invasion WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_invasion_cleaned = $row['clean']; } + $stmt->close(); - $sql = "select min(clean) clean FROM lures WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT min(clean) clean FROM lures WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_lures_cleaned = $row['clean']; } + $stmt->close(); - $sql = "select min(clean) clean FROM nests WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT min(clean) clean FROM nests WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_nests_cleaned = $row['clean']; } + $stmt->close(); - $sql = "select min(clean) clean FROM gym WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT min(clean) clean FROM gym WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $all_gyms_cleaned = $row['clean']; } + $stmt->close(); // Get Areas, Lat, long and Enabled from Humans Table - $sql = "select area, latitude, longitude, enabled, admin_disable, disabled_date from humans WHERE id = '" . $_SESSION['id'] . "'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT area, latitude, longitude, enabled, admin_disable, disabled_date from humans WHERE id = ?"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $area_set = $row['area']; $latitude = $row['latitude']; @@ -128,11 +163,14 @@ $admin_disable = $row['admin_disable']; $disabled_date = $row['disabled_date']; } + $stmt->close(); // Overwrite with Profile info if a profile is available - $sql = "select area, latitude, longitude from profiles WHERE id = '" . $_SESSION['id'] . "' AND profile_no = '". $_SESSION['profile'] ."'"; - $result = $conn->query($sql); + $stmt = $conn->prepare("SELECT area, latitude, longitude from profiles WHERE id = ? AND profile_no = ?"); + $stmt->bind_param("si", $_SESSION['id'], $_SESSION['profile']); + $stmt->execute(); + $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { @@ -141,6 +179,7 @@ $longitude = $row['longitude']; } } + $stmt->close(); } @@ -159,17 +198,20 @@ if (isset($enable_admin_dis) && $enable_admin_dis == "False" && isset($_SESSION['admin_id']) && $_SESSION['id'] <> $_SESSION['admin_id']) { - $subs_clause .= " AND admin_disable = 0"; + $stmt = $conn->prepare("SELECT * from humans WHERE id = ? AND admin_disable = 0"); + } else { + $stmt = $conn->prepare("SELECT * from humans WHERE id = ?"); } - - $sql = "SELECT * from humans WHERE id = '" . $_SESSION['id'] . "' ".@$subs_clause; - $result = $conn->query($sql); - if ($result->num_rows == 0) { - if (strpos($_SERVER['REQUEST_URI'],$redirect_page) == false) { - header("Location: $redirect_url/$redirect_page"); + $stmt->bind_param("s", $_SESSION['id']); + $stmt->execute(); + $result = $stmt->get_result(); + if ($result->num_rows == 0) { + if (strpos($_SERVER['REQUEST_URI'],$redirect_page) == false) { + header("Location: $redirect_url/$redirect_page"); exit(); - } - } + } + } + $stmt->close(); } else { // If not logged in import login page @@ -231,11 +273,14 @@ // Check if IV + PvP is used $sql = "SELECT * FROM monsters - WHERE (min_iv > 0 or max_iv < 100 or atk > 0 or def > 0 or sta > 0 or max_atk < 15 or max_def < 15 or max_sta < 15) + WHERE (min_iv > 0 or max_iv < 100 or atk > 0 or def > 0 or sta > 0 or max_atk < 15 or max_def < 15 or max_sta < 15) AND pvp_ranking_league <> 0 - AND id = '" . $_SESSION['id'] . "'"; + AND id = ?"; -$result = $conn->query($sql); +$stmt = $conn->prepare($sql); +$stmt->bind_param("s", $_SESSION['id']); +$stmt->execute(); +$result = $stmt->get_result(); if (!empty($result) && $result->num_rows > 0) { $config_alarm="