fopen() - neue Datei erzeugen
Maike
- php
0 Vinzenz Mai0 EisFuX
Nabend Zusammen,
ich hab bei meinen code das Problem, dass er sagt diese kann Datei nicht erzeugt werden. Wo liegt mein Fehler?
Die Post['field_1'] sind Datenbankeinträge. Es funktioniert immer nur bis ich POST['field_4'] einsetze - diesen mag er als Datei nicht erzeugen! Den Ordner also field_1 findet er!
$filename = "./datenbank/". $_POST['field_1']."/". $_POST['field_4'].".txt";
if (is_writable($filename)) {
if (!$handle = fopen($filename, 'a'))
{
echo "Cannot open file ($filename)";
exit;
}
if (fwrite($handle, $fileLine) === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
fclose($handle);
} else {
echo "The file is not writable";
}
Angenehme Nacht
Die Maike
Hallo
ich hab bei meinen code das Problem, dass er sagt diese kann Datei nicht erzeugt werden. Wo liegt mein Fehler?
Du behandelst Eingabedaten nicht kontextgemäß.
$filename = "./datenbank/". $_POST['field_1']."/". $_POST['field_4'].".txt";
Behandle $_POST['field_1'] und $_POST['field_4'] so, dass sie nur noch Zeichen enthalten, die in Datei- und Ordnernamen erlaubt sind.
Freundliche Grüße
Vinzenz
(Hallo|Hi(ho)|Tag|Mahlzeit) Maike,
ich hab bei meinen code das Problem, dass er sagt diese kann Datei nicht erzeugt werden. Wo liegt mein Fehler?
Die Post['field_1'] sind Datenbankeinträge. Es funktioniert immer nur bis ich POST['field_4'] einsetze - diesen mag er als Datei nicht erzeugen! Den Ordner also field_1 findet er!
$filename = "./datenbank/". $_POST['field_1']."/". $_POST['field_4'].".txt";
Naive Frage: Hast du die "Datenbankeinträge" vor dem Eintragen in deine Datenbank auf "böse" Zeichenfolgen geprüft? Wahrscheinlich nicht, denn dabei wäre dir dann sicher auch aufgefallen, dass ein Filesystem nicht alle Arten von Dateinamen mag.
if (is_writable($filename)) {
Is_writable() ist ganz nett, dass hilft dir aber nur, wenn dein PHP-Script auch wirklich keinen Schreibzugriff auf Verzeichnisse hat, in die es tunlichst nichts schreiben sollte.
Du solltest dir die eingegebenen Pfadbestandteile vor dem Zusammenkleben mal genauer anschauen. Steht in $_POST['field_4'] bspw. "../../irgendeindateiname", dann schreibt dein Script nämlich ganz woanders hin, als du vorgesehen hast:
http://www.websitesecuritybook.com/path-injection.php
http://de.wikipedia.org/wiki/Directory_Traversal
Hilfreich ist, den zusammengeklebten Pfad mit realpath() in einen absoluten Pfad umzuwandeln und den mal zur Probe auszugeben. Dabei werden Teilpfade wie "../" nämlich vorher aufgelöst:
print(realpath($filename));
Ein einfacher Workaround, der beide Probleme auf die Schnelle löst, ist die Funktion rawurlencode(). Diese wandelt (u. A.) die in Pfadangaben oft kritischen Zeichen wie "?", ":", "" und "/" um.
MffG
EisFuX