Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4330 > unrolled thread
| Started by | Tom Wallenfang <tom@wallenfang.de> |
|---|---|
| First post | 2018-04-07 20:14 +0200 |
| Last post | 2018-04-08 06:03 +0000 |
| Articles | 15 — 6 participants |
Back to article view | Back to de.comp.lang.php
PHP speichert manche Dateien mit ?-Suffix ab. Tom Wallenfang <tom@wallenfang.de> - 2018-04-07 20:14 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-04-07 20:34 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Tom Wallenfang <tom@wallenfang.de> - 2018-04-08 15:36 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-04-08 16:40 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Arno Welzel <usenet@arnowelzel.de> - 2018-04-07 20:58 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Tom Wallenfang <tom@wallenfang.de> - 2018-04-08 15:29 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-04-08 16:41 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Tom Wallenfang <tom@wallenfang.de> - 2018-04-08 18:09 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-04-08 18:19 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Arno Welzel <usenet@arnowelzel.de> - 2018-04-08 18:05 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-04-08 18:17 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-04-08 19:55 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-04-08 20:35 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Claus Reibenstein <4spamersonly@kabelmail.de> - 2018-04-07 21:20 +0200
Re: PHP speichert manche Dateien mit ?-Suffix ab. Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2018-04-08 06:03 +0000
| From | Tom Wallenfang <tom@wallenfang.de> |
|---|---|
| Date | 2018-04-07 20:14 +0200 |
| Subject | PHP speichert manche Dateien mit ?-Suffix ab. |
| Message-ID | <pab1r0$umo$1@news.albasani.net> |
Hallo. Ich versuche derzeit, in PHP Strings als Dateien abzuspeichern. Die Namen sind simple Zahlen, die jeweils addiert werden, die aktuelle Zahl wird in einer Datei namens "n" (für Nummer) abgespeichert, aus der jedesmal, wenn eine Datei abgespeichert werden soll, gelesen wird. Die Dateien werden via fwrite erstellt. Die Dateien 0 - 2 habe ich manuell erstellt, um zu sehen, wie das Zählen funktioniert. Normalerweise sollte nun eine Datei 3 erstellt werden, doch speichert PHP den Text nicht als 3, sondern als "3?" ab. Ich habe dann versucht, via shell_exec einen mv Befehl auszuführen, der das 3? in 3 umbenennt. Der Befehl sieht so aus: "mv test/3* test/3". Ich habe ihn in PHP als String gesetzt, doch wenn ich ihn ausgebe, erhalte ich: "mv test/3 * test/3", was nicht den gewünschten Effekt erzielt. Gibt es eine Möglichkeit, dies zu umgehen? Vielen Dank im Voraus, Tom
[toc] | [next] | [standalone]
| From | "Christoph M. Becker" <cmbecker69@arcor.de> |
|---|---|
| Date | 2018-04-07 20:34 +0200 |
| Message-ID | <pab2ul$ts8$1@solani.org> |
| In reply to | #4330 |
Am 07.04.2018 um 20:14 schrieb Tom Wallenfang: > Ich versuche derzeit, in PHP Strings als Dateien abzuspeichern. > Die Namen sind simple Zahlen, die jeweils addiert werden, die aktuelle > Zahl wird in einer Datei namens "n" (für Nummer) abgespeichert, aus der > jedesmal, wenn eine Datei abgespeichert werden soll, gelesen wird. Die > Dateien werden via fwrite erstellt. > > Die Dateien 0 - 2 habe ich manuell erstellt, um zu sehen, wie das Zählen > funktioniert. Normalerweise sollte nun eine Datei 3 erstellt werden, > doch speichert PHP den Text nicht als 3, sondern als "3?" ab. Hm, sehr eigenartig. Laß dir doch zur Kontrolle mal den Dateinamen per var_dump() ausgeben. -- Christoph M. Becker
[toc] | [prev] | [next] | [standalone]
| From | Tom Wallenfang <tom@wallenfang.de> |
|---|---|
| Date | 2018-04-08 15:36 +0200 |
| Message-ID | <pad5tn$6ou$1@news.albasani.net> |
| In reply to | #4331 |
Am 07.04.2018 um 20:34 schrieb Christoph M. Becker: > Hm, sehr eigenartig. Laß dir doch zur Kontrolle mal den Dateinamen per > var_dump() ausgeben. $url ist in diesem Fall "test/3", ich habe var_dump($url); eingegeben und bekam ,,string(7) "test/3 "´´. Ich bin noch Laie und kann das mit bloßem Auge nicht entschlüsseln, aber möglicherweise hilft es. MfG, Tom PS: echo $url; gibt bei mir "test/3" aus.
[toc] | [prev] | [next] | [standalone]
| From | "Christoph M. Becker" <cmbecker69@arcor.de> |
|---|---|
| Date | 2018-04-08 16:40 +0200 |
| Message-ID | <pad9l6$bk0$1@solani.org> |
| In reply to | #4336 |
Am 08.04.2018 um 15:36 schrieb Tom Wallenfang: > Am 07.04.2018 um 20:34 schrieb Christoph M. Becker: > >> Hm, sehr eigenartig. Laß dir doch zur Kontrolle mal den Dateinamen per >> var_dump() ausgeben. > > $url ist in diesem Fall "test/3", ich habe var_dump($url); eingegeben > und bekam ,,string(7) "test/3 "´´. Aha, da befindet sich also noch ein (Leer-?)Zeichen am Ende des Strings, das wohl nicht erwünscht sein dürfte. -- Christoph M. Becker
[toc] | [prev] | [next] | [standalone]
| From | Arno Welzel <usenet@arnowelzel.de> |
|---|---|
| Date | 2018-04-07 20:58 +0200 |
| Message-ID | <fisimqF8i7jU2@mid.individual.net> |
| In reply to | #4330 |
Tom Wallenfang: > Ich versuche derzeit, in PHP Strings als Dateien abzuspeichern. > Die Namen sind simple Zahlen, die jeweils addiert werden, die aktuelle > Zahl wird in einer Datei namens "n" (für Nummer) abgespeichert, aus der > jedesmal, wenn eine Datei abgespeichert werden soll, gelesen wird. Die > Dateien werden via fwrite erstellt. > > Die Dateien 0 - 2 habe ich manuell erstellt, um zu sehen, wie das Zählen > funktioniert. Normalerweise sollte nun eine Datei 3 erstellt werden, > doch speichert PHP den Text nicht als 3, sondern als "3?" ab. Zeige den relevanten Code. -- Arno Welzel https://arnowelzel.de https://de-rec-fahrrad.de http://fahrradzukunft.de
[toc] | [prev] | [next] | [standalone]
| From | Tom Wallenfang <tom@wallenfang.de> |
|---|---|
| Date | 2018-04-08 15:29 +0200 |
| Message-ID | <pad5f6$7vn$1@news.albasani.net> |
| In reply to | #4332 |
Am 07.04.2018 um 20:58 schrieb Arno Welzel:
> Zeige den relevanten Code.
<?php
$txt = shell_exec('ls -d */');
echo $txt;
echo "<form action=\"write.php\" method=\"post\">";
echo "<input type=\"text\" name=\"ornder\" /><br />";
echo "<textarea name=\"input\"
style=\"width:250px;height:150px\"></textarea><br />";
echo "<input type=\"Submit\" value=\"Submit\" />";
echo "</form>";
$ordner = "test/"; // Normalerweise ebenfalls $_POST[], aber zum
testen umgeändert
$text = $_POST["input"];
if($text!="") // bzw. wenn Seite zum ersten mal aufgerufen wird.
{
$urln = $ordner . "n"; // "test/n" enthält die Nummerdatei bzw.
den Dateinamen für den neuen Eintrag
$readnum = fopen("$urln", "r") or die("Tot.");
$nummerp = fread($readnum,filesize($urln));
fclose($readnum);
$nummer = $nummerp;
$nummerp = $nummerp + 1;
$url = $ordner . $nummer; // Der Dateiname
$fixurl = "$url*";
$command = "mv $fixurl $url"; // Besagter Befehl mv test/3* test/3
echo "$command<br />";
$savenum = fopen("$urln", "w"); // Speichert die neue Nummer in
"test/n"
fwrite($savenum, $nummerp);
fclose($savenum);
$texts = fopen("$url", "w"); // Schreibt den Text
fwrite($texts, $text);
fclose($texts);
echo shell_exec($command); // echo damit mögliche Fehler gezeigt
werden (z.B.: cannot stat)
echo "Fertig!<br />";
}
?>
Eine Merkwürdigkeit die mir noch aufgefallen ist, ist, dass das Problem
nur bei der ersten durch PHP erstellten Datei auftritt, jede Datei die
danach erstellt wird, ist davon nicht betroffen.
[toc] | [prev] | [next] | [standalone]
| From | "Christoph M. Becker" <cmbecker69@arcor.de> |
|---|---|
| Date | 2018-04-08 16:41 +0200 |
| Message-ID | <pad9mc$bk0$2@solani.org> |
| In reply to | #4335 |
Am 08.04.2018 um 15:29 schrieb Tom Wallenfang:
> Am 07.04.2018 um 20:58 schrieb Arno Welzel:
>
>> Zeige den relevanten Code.>
>
> $ordner = "test/"; // Normalerweise ebenfalls $_POST[], aber zum
> testen umgeändert
Dann aber höllisch aufpassen, dass der $_POST Parameter gründlich
validiert und/oder bereinigt wird!
> $readnum = fopen("$urln", "r") or die("Tot.");
> $nummerp = fread($readnum,filesize($urln));
> fclose($readnum);
> $nummer = $nummerp;
> $nummerp = $nummerp + 1;
> $url = $ordner . $nummer; // Der Dateiname
Was passiert, wenn die Datei ($urln) am Ende noch einen Zeilenumbruch
enthält? Außerdem ist diese aufwendige Variante eine Datei zu lesen,
seit PHP 4.3.0 nicht mehr nötig. Verwende statt dessen:
$nummerp = (int) file_get_contents($urln);
$nummerp = $nummerp + 1;
$url = $ordner . $nummer; // Der Dateiname
Für den Produktionscode sollten natürlich mögliche Fehler noch behandelt
werden.
--
Christoph M. Becker
[toc] | [prev] | [next] | [standalone]
| From | Tom Wallenfang <tom@wallenfang.de> |
|---|---|
| Date | 2018-04-08 18:09 +0200 |
| Message-ID | <padesj$m4m$1@news.albasani.net> |
| In reply to | #4338 |
Am 08.04.2018 um 16:41 schrieb Christoph M. Becker: > $nummerp = (int) file_get_contents($urln); > $nummerp = $nummerp + 1; > $url = $ordner . $nummer; // Der Dateiname > > Für den Produktionscode sollten natürlich mögliche Fehler noch behandelt > werden. Dies war wohl der Fehler, habe die entsprechende Codezeile geändert und nun funktioniert es. Offensichtlich hängt es mit dem alten Ladeverfahren zusammen. Vielen Dank, Tom
[toc] | [prev] | [next] | [standalone]
| From | "Christoph M. Becker" <cmbecker69@arcor.de> |
|---|---|
| Date | 2018-04-08 18:19 +0200 |
| Message-ID | <padfdj$g0r$2@solani.org> |
| In reply to | #4340 |
Am 08.04.2018 um 18:09 schrieb Tom Wallenfang: > Am 08.04.2018 um 16:41 schrieb Christoph M. Becker: >> $nummerp = (int) file_get_contents($urln); >> $nummerp = $nummerp + 1; >> $url = $ordner . $nummer; // Der Dateiname > > Dies war wohl der Fehler, habe die entsprechende Codezeile geändert und > nun funktioniert es. Offensichtlich hängt es mit dem alten Ladeverfahren > zusammen. Nein, das hat nichts mit dem Ladeverfahren zu tun, sondern liegt daran, dass die gesamte Datei gelesen wird, und diese nicht unbedingt nur eine Zahl enthält (sondern z.B. noch ein Newline am Ende). -- Christoph M. Becker
[toc] | [prev] | [next] | [standalone]
| From | Arno Welzel <usenet@arnowelzel.de> |
|---|---|
| Date | 2018-04-08 18:05 +0200 |
| Message-ID | <fiusujFo8aiU1@mid.individual.net> |
| In reply to | #4335 |
Tom Wallenfang:
> Am 07.04.2018 um 20:58 schrieb Arno Welzel:
>> Zeige den relevanten Code.
>
> <?php
> $txt = shell_exec('ls -d */');
> echo $txt;
> echo "<form action=\"write.php\" method=\"post\">";
> echo "<input type=\"text\" name=\"ornder\" /><br />";
> echo "<textarea name=\"input\"
> style=\"width:250px;height:150px\"></textarea><br />";
> echo "<input type=\"Submit\" value=\"Submit\" />";
> echo "</form>";
> $ordner = "test/"; // Normalerweise ebenfalls $_POST[], aber zum
> testen umgeändert
Aua!
Nein - sowas bitte NIEMALS machen! Inahlte von außen, wie $_POST[...]
darf man grundsätzlich NIEMALS direkt als Vorlage für Dateinamen etc.
nutzen.
Ein Angreifer kann dein Script ebenfalls aufrufen und für die
entsprechenden Parameter *beliebigen* Inhalt übergeben, auch solchen,
die Pfadtrenner "/" oder "\" und ".." oder "..." enthalten.
> $text = $_POST["input"];
> if($text!="") // bzw. wenn Seite zum ersten mal aufgerufen wird.
> {
> $urln = $ordner . "n"; // "test/n" enthält die Nummerdatei bzw.
> den Dateinamen für den neuen Eintrag
>
> $readnum = fopen("$urln", "r") or die("Tot.");
Besser:
$readnum = fopen($urln, "r") or die("Tot.");
Es gibt keinen vernünftigen Grund, eine einzelne Variable in
Anführungszeichen zu setzen, wenn man als Parameter den Inhalt der
Variablen nutzen will.
Mir scheint auch, Du zeigst nicht den wirklichen Code. Denn das gezeigte
legt einfach nur die Datei "n" im Ordner "test" an. Wo da noch ein "?"
herkommen soll, ist völlig unklar.
> $nummerp = fread($readnum,filesize($urln));
> fclose($readnum);
> $nummer = $nummerp;
> $nummerp = $nummerp + 1;
> $url = $ordner . $nummer; // Der Dateiname
[...]
> $texts = fopen("$url", "w"); // Schreibt den Text
Auch hier wieder: warum "$url" und nicht einfach $url?
Und wer garantiert, dass der Inhalt der gelesenen Datei wirklich eine
Zahl enthält und $nummer korrekt gesetzt ist?
Ich glaube, Du hast PHP nicht wirklich verstanden. Kann das sein, das Du
noch ein Anfänger bist?
--
Arno Welzel
https://arnowelzel.de
https://de-rec-fahrrad.de
http://fahrradzukunft.de
[toc] | [prev] | [next] | [standalone]
| From | "Christoph M. Becker" <cmbecker69@arcor.de> |
|---|---|
| Date | 2018-04-08 18:17 +0200 |
| Message-ID | <padfa8$g0r$1@solani.org> |
| In reply to | #4339 |
Am 08.04.2018 um 18:05 schrieb Arno Welzel:
> Tom Wallenfang:>
>> $readnum = fopen("$urln", "r") or die("Tot.");
>
> Besser:
>
> $readnum = fopen($urln, "r") or die("Tot.");
>
> Es gibt keinen vernünftigen Grund, eine einzelne Variable in
> Anführungszeichen zu setzen, wenn man als Parameter den Inhalt der
> Variablen nutzen will.
Ich glaube, dass man das ganz früher gemacht hat, um eine Konvertierung
zu String zu erzwingen. Schon lange steht aber der (string) Cast zur
Verfügung, der hier allerdings nicht einmal nötig sein dürfte (selbst im
Falle von strict_types=1).
--
Christoph M. Becker
[toc] | [prev] | [next] | [standalone]
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
|---|---|
| Date | 2018-04-08 19:55 +0200 |
| Message-ID | <1926965.3Lj2Plt8kZ@PointedEars.de> |
| In reply to | #4341 |
Christoph M. Becker wrote: > Am 08.04.2018 um 18:05 schrieb Arno Welzel: >> Es gibt keinen vernünftigen Grund, eine einzelne Variable in >> Anführungszeichen zu setzen, wenn man als Parameter den Inhalt der >> Variablen nutzen will. > > Ich glaube, dass man das ganz früher gemacht hat, um eine Konvertierung > zu String zu erzwingen. Wann soll das gewesen sein? > […] strict_types=1). Danke für den Hinweis. -- PointedEars Zend Certified PHP Engineer <http://www.zend.com/en/yellow-pages/ZEND024953> <https://github.com/PointedEars> | <http://PointedEars.de/wsvn> Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.
[toc] | [prev] | [next] | [standalone]
| From | "Christoph M. Becker" <cmbecker69@arcor.de> |
|---|---|
| Date | 2018-04-08 20:35 +0200 |
| Message-ID | <padndm$ltj$1@solani.org> |
| In reply to | #4343 |
Am 08.04.2018 um 19:55 schrieb Thomas 'PointedEars' Lahn: > Christoph M. Becker wrote: > >> Am 08.04.2018 um 18:05 schrieb Arno Welzel: >>> Es gibt keinen vernünftigen Grund, eine einzelne Variable in >>> Anführungszeichen zu setzen, wenn man als Parameter den Inhalt der >>> Variablen nutzen will. >> >> Ich glaube, dass man das ganz früher gemacht hat, um eine Konvertierung >> zu String zu erzwingen. > > Wann soll das gewesen sein? Ich hatte es in 10+ Jahre altem Code gesehen. Aber wie ich nun feststelle, gibt es strval() und settype() bereits seit PHP/FI Version 2.0[1], so dass man sich schon "immer" hätte deutlicher ausdrücken können. [1] <http://php.net/manual/phpfi2.php> -- Christoph M. Becker
[toc] | [prev] | [next] | [standalone]
| From | Claus Reibenstein <4spamersonly@kabelmail.de> |
|---|---|
| Date | 2018-04-07 21:20 +0200 |
| Message-ID | <fisjv5F8tt1U1@mid.individual.net> |
| In reply to | #4330 |
Tom Wallenfang schrieb am 07.04.2018 um 20:14: > Ich versuche derzeit, in PHP Strings als Dateien abzuspeichern. > Die Namen sind simple Zahlen, die jeweils addiert werden, die aktuelle > Zahl wird in einer Datei namens "n" (für Nummer) abgespeichert, aus der > jedesmal, wenn eine Datei abgespeichert werden soll, gelesen wird. Die > Dateien werden via fwrite erstellt. Wie genau sieht dieser fwrite-Aufruf aus? > Die Dateien 0 - 2 habe ich manuell erstellt, um zu sehen, wie das Zählen > funktioniert. Normalerweise sollte nun eine Datei 3 erstellt werden, > doch speichert PHP den Text nicht als 3, sondern als "3?" ab. Vermutlich ein Programmfehler. Genaueres lässt sich ohne Kenntnis des PHP-Codes nicht sagen. > Ich habe dann versucht, via shell_exec einen mv Befehl auszuführen, der > das 3? in 3 umbenennt. Der Befehl sieht so aus: "mv test/3* test/3". > Ich habe ihn in PHP als String gesetzt, doch wenn ich ihn ausgebe, > erhalte ich: "mv test/3 * test/3", was nicht den gewünschten Effekt erzielt. Vermutlich noch ein Programmfehler. > Gibt es eine Möglichkeit, dies zu umgehen? Programmfehler umgeht man nicht, sondern korrigiert sie. Gruß Claus
[toc] | [prev] | [next] | [standalone]
| From | Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) |
|---|---|
| Date | 2018-04-08 06:03 +0000 |
| Message-ID | <1t5ac9b05ei5eebn3e8%sfroehli@Froehlich.Priv.at> |
| In reply to | #4330 |
On Sat, 07 Apr 2018 20:14:55 Tom Wallenfang wrote: > Die Dateien 0 - 2 habe ich manuell erstellt, um zu sehen, wie das > Zählen funktioniert. Normalerweise sollte nun eine Datei 3 > erstellt werden, doch speichert PHP den Text nicht als 3, sondern > als "3?" ab. Diesen Fehler solltest Du suchen und beheben - das passiert nicht "einfach so", sondern weil es irgendwo ein Problem gibt. > Ich habe dann versucht, via shell_exec einen mv Befehl > auszuführen, der das 3? in 3 umbenennt. Der Befehl sieht so aus: > "mv test/3* test/3". Ich habe ihn in PHP als String gesetzt, doch > wenn ich ihn ausgebe, erhalte ich: "mv test/3 * test/3", was nicht > den gewünschten Effekt erzielt. Dann hast Du hier einen weiteren Fehler eingebaut. Da es nur darum geht, das Resultat eines vorherigen Fehlers zu korrigieren: Warum bennenst Du diese Datei nicht händisch um bzw. löscht sie einfach im Zuge der Fehlerbehebung? Servus, Stefan -- http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich Offizieller Erstbesucher(TM) von mmeike Stefan - besengte Liebe, die selten knackt. (Sloganizer)
[toc] | [prev] | [standalone]
Back to top | Article view | de.comp.lang.php
csiph-web