Files
Web-Public/WEBROOT/services/DatabaseLogShow.php
T
2026-01-04 12:23:33 +01:00

216 lines
6.9 KiB
PHP

<?php
include_once '../controller/LogController.php';
include_once '../controller/DatabaseConnect.php';
logging();
$conn = db_connect();
$devips = $Whitelisted = (new getSpecificData())->getWhitelistedIPs();
$devips_sql = "'" . implode("','", $devips) . "'";
echo "<h1>Datenbank auslesen um " . date("H:i:s") . "</h1>";
echo "<h2>Excluded:</h2>";
echo '<pre>';
print_r($devips_sql);
echo '</pre>';
echo '<br>';
$filter = $_GET['filter'] ?? 'alle';
$customQuery = $_POST['custom_query'] ?? '';
$useCustom = false;
if ($customQuery) {
$forbidden = ['DELETE', 'UPDATE', 'INSERT', 'DROP', 'ALTER', 'TRUNCATE'];
$upper = strtoupper($customQuery);
foreach ($forbidden as $bad) {
if (strpos($upper, $bad) !== false) {
die("<b style='color:red'>Gefährliche Query blockiert! ($bad gefunden)</b>");
}
}
if (stripos($customQuery, "SELECT") !== 0) {
die("<b style='color:red'>Nur SELECT-Befehle sind erlaubt!</b>");
}
$sql = $customQuery;
$useCustom = true;
}
if (!$useCustom) {
switch ($filter) {
case 'today':
$sql = "
SELECT * FROM `logs`
WHERE `CLIENT-IP` NOT IN ($devips_sql)
AND DATE(`FIRST-REQUEST`) = CURDATE()
ORDER BY `FIRST-REQUEST` DESC
";
break;
case 'counterperip':
$sql = "
SELECT `CLIENT-IP`, `LAND`, `USER-AGENT`, SUM(counter) AS gesamt_counter
FROM logs
WHERE `CLIENT-IP` NOT IN ($devips_sql)
GROUP BY `CLIENT-IP`
ORDER BY gesamt_counter DESC;
";
break;
case 'node1':
$sql = "
SELECT `CLIENT-IP`, `LAND`, `USER-AGENT`, `REQUEST-URL`, `USER-COOKIE-VALUE`, `FIRST-REQUEST`, `LAST-REQUEST`, `QUERY`, `COUNTER`
FROM logs
WHERE `SERVER-IP` = 'node1'
ORDER BY `FIRST-REQUEST` DESC;
";
break;
case 'node2':
$sql = "
SELECT `CLIENT-IP`, `LAND`, `USER-AGENT`, `REQUEST-URL`, `USER-COOKIE-VALUE`, `FIRST-REQUEST`, `LAST-REQUEST`, `QUERY`, `COUNTER`
FROM logs
WHERE `SERVER-IP` = 'node2'
ORDER BY `FIRST-REQUEST` DESC;
";
break;
case 'node3':
$sql = "
SELECT `CLIENT-IP`, `LAND`, `USER-AGENT`, `REQUEST-URL`, `USER-COOKIE-VALUE`, `FIRST-REQUEST`, `LAST-REQUEST`, `QUERY`, `COUNTER`
FROM logs
WHERE `SERVER-IP` = 'node3'
ORDER BY `FIRST-REQUEST` DESC;
";
break;
case 'node4':
$sql = "
SELECT `CLIENT-IP`, `LAND`, `USER-AGENT`, `REQUEST-URL`, `USER-COOKIE-VALUE`, `FIRST-REQUEST`, `LAST-REQUEST`, `QUERY`, `COUNTER`
FROM logs
WHERE `SERVER-IP` = 'node4'
ORDER BY `FIRST-REQUEST` DESC;
";
break;
case 'alle':
default:
$sql = "
SELECT * FROM `logs`
WHERE `CLIENT-IP` NOT IN ($devips_sql)
ORDER BY `FIRST-REQUEST` DESC
";
}
}
?>
<form method="GET">
<label><b>Log-Filter auswählen:</b></label>
<select name="filter" onchange="this.form.submit()">
<option value="alle" <?= $filter == 'alle' ? 'selected' : '' ?>>Alle Logs</option>
<option value="today" <?= $filter == 'today' ? 'selected' : '' ?>>Heute</option>
<option value="node1" <?= $filter == 'node1' ? 'selected' : '' ?>>Node 1</option>
<option value="node2" <?= $filter == 'node2' ? 'selected' : '' ?>>Node 2</option>
<option value="node3" <?= $filter == 'node3' ? 'selected' : '' ?>>Node 3</option>
<option value="node4" <?= $filter == 'node4' ? 'selected' : '' ?>>Node 4</option>
<option value="counterperip" <?= $filter == 'counterperip' ? 'selected' : '' ?>>Counter per IP</option>
</select>
</form>
<br>
<form method="POST">
<label><b>Eigene SELECT-Query ausführen:</b></label><br>
<textarea name="custom_query" style="width:1200px;height:60px;"><?= htmlspecialchars($customQuery) ?></textarea><br>
<button type="submit">Query ausführen</button>
</form>
<script>
document.addEventListener("DOMContentLoaded", () => {
const ta = document.querySelector("textarea[name='custom_query']");
const keywords = [
"select", "from", "where", "group", "by",
"is", "binary", "regexp", "any", "order",
"update", "delete", "create", "drop", "limit",
"null", "and", "or", "exists", "case",
"alter", "distinct", "having", "as", "on",
"not", "in", "union", "all", "like",
"some", "as", "by", "asc", "desc",
"outer", "inner", "left", "right", "join",
];
const regex = new RegExp("\\b(" + keywords.join("|") + ")\\b", "gi");
ta.addEventListener("input", () => {
let pos = ta.selectionStart; // Cursorposition merken
ta.value = ta.value.replace(regex, m => m.toUpperCase());
// Cursor zurücksetzen
ta.selectionStart = ta.selectionEnd = pos;
});
});
</script>
<br>
<hr>
<br>
<?php
$daten = [];
if ($erg = $conn->query($sql)) {
// Query schön anzeigen
echo "<b>Query:</b><br>";
echo "<div style='background:#f4f4f4; padding:10px; border-left:5px solid #007BFF; font-family:monospace; white-space:pre-wrap; word-wrap:break-word; max-width:1200px; overflow:auto;'>$sql</div><br>";
if ($erg->num_rows) {
echo "<b>Gefundene Einträge: " . $erg->num_rows . "</b><br><br>";
} else {
echo "<b>Keine Datensätze gefunden.</b><br><br>";
}
while ($datensatz = $erg->fetch_object()) {
$daten[] = $datensatz;
}
$erg->free();
}
echo "<h2>Ergebnis:</h2>";
if (empty($daten)) {
echo "<b>Keine Daten vorhanden.</b>";
} else {
echo '<div style="max-width: 100%; overflow-x: auto;">';
echo '<table border="1" cellpadding="5" cellspacing="0" style="border-collapse:collapse; width:100%; font-family:Arial; font-size:14px;">';
echo "<tr style='background:#f0f0f0; font-weight:bold;'>";
foreach ($daten[0] as $spaltenname => $wert) {
echo "<th style='text-align:left; padding:6px; word-break:break-word; white-space:normal;'>" . htmlspecialchars($spaltenname ?? '') . "</th>";
}
echo "</tr>";
foreach ($daten as $row) {
echo "<tr>";
foreach ($row as $value) {
echo "<td style='padding:6px; word-break:break-word; white-space:normal; max-width:300px;'>" . htmlspecialchars($value ?? '') . "</td>";
}
echo "</tr>";
}
echo "</table>";
echo "</div>";
}
exit;
?>