216 lines
6.9 KiB
PHP
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;
|
|
?>
|