Moin
Achso, klar. Naja wie schon erwähnt, eigentlich alles was ich mit Formularen und
$_POST
Variablen mache landet in einem SQL-Statement. Und alles was Ausgegeben wird kommt aus der DB.Und du meinst nun, weil sie aus der DB kommen, sind die Daten "sicher"?
Naja wenn sie maskiert/codiert eingefügt wurden?
Das versuche ich dir ja zu erklären, dass die Herkunft der Daten keine Rolle spielt und nur das Ziel entscheidend ist, für die Art und Weise, wie bestimmte Zeichen maskiert werden müssen. Auch ein harmloses < in einer mathematischen Gleichung beispielsweise, ist in HTML ein Zeichen mit besonderer Bedeutung. Das muss nicht der Anfang eines XSS-Versuchs sein, um den Browser dazu zu bringen, Zeichen entgegen der eigentlichen Intention zu interpretieren. Wenn ein < einfach nur als solches ausgegeben werden soll, muss es als < notiert werden (abgesehen von Fehlerkorrekturversuchen der Browser in manchen Fällen). Es spielt keine Rolle, ob es aus der Datenbank kommt oder aus einer Nutzereingabe oder aus einer Nutzereingabe, die in einer Datenbank abgelegt wurde.
Das verstehe ich wohl aber ich will ja verhindern das ein < oder ähnliches in die Datenbank kommt.
Darum der Gedanke, warum nicht gleich jede
$_POST
Variable für das SQL_Statement Zentral prüfen.Weil das zwar in deinem einfachen Fall zielführend ist, aber sobald deine Projekte komplexer werden, bekommst du mit der Herangehensweise immer mehr Probleme. Bitte lies den bereits verlinkten Kontextwechsel-Artikel. Der ist zweiteilig und in seiner Fortsetzung gibt es den Abschnitt HTML in der Datenbank. Darin kannst du Beispiele für ganz harmlose (also nicht sicherheitsrelevante) Probleme finden, wenn du Daten zu früh für einen bestimmten Ausgabekontext vorbereitest.
Warum sollte man Markup in einer DB speichern? Natürlich gehe ich von meinem einfachen Fall aus und es ist interessant das einem noch viel mehr Möglichkeiten zu Verfügung stehen bei denen man dann auch einiges beachten muss. Nur ich sehe im Moment nicht die Notwendigkeit mir alles aneignen zu müssen was möglich und erst damit nötig ist.
Und es wäre hilfreich wenn mal ein Beispiel kommt was ich auch versteh und nicht eine Erklärung mit der verlinkung zu immer dem gleichen Artikel, den ich jetzt schon gelesen habe.
Also Wenn zum Beispiel:
if(isset($_POST['chat']) && !empty($_POST['chat']))
{
$writer = mysqli_real_escape_string($_SESSION['user_name']);
$chat = mysqli_real_escape_string($_POST['chat']);
$insert_message = sprintf(
'INSERT INTO chat ('
. 'message_writer, message, message_date'
. ') VALUES ('
. '\'%1$s\', \'%2$s\', \'%3$s\''
. ')',
$_SESSION['user_name'],
$_POST['chat'],
time());
if($db -> query($insert_message) === TRUE)
{
$db -> commit();
}
else
{
//error_log! $create_db_connect->error.
}
exit();
}
Und in der $_POST['chat']
steht meinetwegen <script>böser.pfad</script>, was kommt in der Datenbank an?
Und wieso entschärft:
$output = "";
require_once('db_connect_function.php');
$get_messages = "Select * FROM (Select message_writer, message, message_date FROM chat ORDER BY message_date DESC Limit 50 ) chat ORDER BY message_date ASC";
if ($result = $db->query($get_messages)):
while ($row = $result->fetch_assoc()):
?>
<article>
<footer>
<time datetime="<?php echo date('c', $row['message_date']); ?>"><?php echo date('H:i:s', $row['message_date']); ?></time>
<span class="author"><?php echo htmlspecialchars($row['message_writer']); ?></span>
</footer>
<p class="message"><?php echo htmlspecialchars($row['message']); ?></p>
</article>
<?php
endwhile;
else:
//error_log! $create_db_connect->error.
endif;
das nicht die Ausgabe?
Ich glaube mehr will ich überhaupt nicht. Also mir würde kein Beispiel einfallen wo ich etwas anderes machen möchte. Bzw. doch, eigentlich schon, vorher würde gern noch prüfen ob etwas derartiges in dem Formularfeld steht und dann die weiterleitung direkt unterbinden. Oder zumindest wenn nicht das drin steht was ich erwarte dann eben die weiterleitung unterbinden. Sprich, wenn ich in dem Formularfeld eine Zahl erwarte, dann hat das gefälligst auch eine zahl zu sein und kein String. Aber das ist Javascript, dass hab ich zwar schon irgendwo gefunden, aber mich noch nicht mit beschäftigt.
Gruß Jo