Ist mein Ansatz sicher genug gegen SQL-Injection und andere Angriffe, oder sollte ich zusätzliche Sicherheitsmaßnahmen ergreifen?
<?php
session_start();
include('connection.php');
if (!isset($_SESSION['username'])) {
die("Session abgelaufen. Bitte loggen Sie sich erneut ein.");
}
$username_input = $_SESSION['username'];
// SQL-Abfrage abhängig davon, ob der Benutzer Trainer ist
if ($_SESSION["Trainer"] == false) {
$sql = "
SELECT
u.username,
k.kursbezeichnung,
i.nachname AS trainer_name,
d.path,
d.displayname
FROM user u
JOIN kurs k ON u.kurs_idkurs = k.idkurs
JOIN internal_user i ON k.internal_user_idinternal = i.idinternal
JOIN dokumente d ON d.kurs_idkurs = k.idkurs
WHERE u.username = ?
";
} else {
$sql = "
SELECT
u.username,
k.kursbezeichnung,
i.nachname AS trainer_name,
d.path,
d.displayname
FROM internal_user u
JOIN kurs k ON u.idinternal = k.internal_user_idinternal
JOIN internal_user i ON k.internal_user_idinternal = i.idinternal
JOIN dokumente d ON d.kurs_idkurs = k.idkurs
WHERE u.username = ?
";
}
if ($stmt = mysqli_prepare($conn, $sql)) {
mysqli_stmt_bind_param($stmt, "s", $username_input);
if (mysqli_stmt_execute($stmt)) {
mysqli_stmt_store_result($stmt);
mysqli_stmt_bind_result($stmt, $username, $kursbezeichnung, $trainer_name, $path, $displayname);
$documents = [];
$course_name = null;
while (mysqli_stmt_fetch($stmt)) {
$course_name = $kursbezeichnung;
$documents[] = [
'trainer_name' => $trainer_name,
'path' => $path,
'displayname' => $displayname
];
}
} else {
die("Fehler bei der Abfrageausführung: " . mysqli_error($conn));
}
mysqli_stmt_close($stmt);
} else {
die("Fehler bei der Abfragevorbereitung: " . mysqli_error($conn));
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kursübersicht</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f9;
margin: 0;
padding: 20px;
text-align: center;
}
.course-container {
margin-top: 20px;
}
h1 {
font-size: 2em;
color: #2c3e50;
}
h2 {
font-size: 1.5em;
color: #2980b9;
}
h3 {
font-size: 1.2em;
color: #7f8c8d;
}
.document-list {
list-style-type: none;
padding: 0;
}
.document-list li {
margin-bottom: 10px;
}
.document-list li a {
text-decoration: none;
color: #3498db;
font-weight: bold;
}
.document-list li a:hover {
color: #e74c3c;
}
</style>
</head>
<body>
<h1>Willkommen, <?= htmlspecialchars($_SESSION['vorname'] ?? 'Nutzer') ?>!</h1>
<?php if ($course_name): ?>
<div class="course-container">
<h2>Kurs: <?= htmlspecialchars($course_name) ?></h2>
<h3>Trainer: <?= htmlspecialchars($documents[0]['trainer_name']) ?></h3>
<h3>Dokumente für diesen Kurs:</h3>
<ul class="document-list">
<?php foreach ($documents as $doc): ?>
<li><a href="<?= htmlspecialchars($doc['path']) ?>" download><?= htmlspecialchars($doc['displayname']) ?></a></li>
<?php endforeach; ?>
</ul>
</div>
<?php else: ?>
<p>Keine Dokumente für den Benutzer gefunden.</p>
<?php endif; ?>
</body>
</html>
2 Antworten
SQL Injection funktioniert nur, wenn Sie den SQL String zusammenbauen. Bei der Parameterübergabe mit ? funktioniert SQL Injection nicht, zumindest solange die Treiber richtig implementiert sind. Insoweit ist das kein Angriffpunkt.
Was man noch machen kann, ist die Länge des Nutzernamens zu begrenzen. Also z.B. bei Nutzernamen die länger als 200 Zeichen sind abzubrechen.
Woher ich das weiß:Recherche
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
Programmiersprache, Informatik
Du greifst nicht auf Daten zu, die vom Nutzer eingegeben wurden, zumindest nicht in diesem Script.
Die SESSION-Variablen hast du selber zuvor gesetzt.