Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #4330 > unrolled thread

PHP speichert manche Dateien mit ?-Suffix ab.

Started byTom Wallenfang <tom@wallenfang.de>
First post2018-04-07 20:14 +0200
Last post2018-04-08 06:03 +0000
Articles 15 — 6 participants

Back to article view | Back to de.comp.lang.php


Contents

  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

#4330 — PHP speichert manche Dateien mit ?-Suffix ab.

FromTom Wallenfang <tom@wallenfang.de>
Date2018-04-07 20:14 +0200
SubjectPHP 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]


#4331

From"Christoph M. Becker" <cmbecker69@arcor.de>
Date2018-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]


#4336

FromTom Wallenfang <tom@wallenfang.de>
Date2018-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]


#4337

From"Christoph M. Becker" <cmbecker69@arcor.de>
Date2018-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]


#4332

FromArno Welzel <usenet@arnowelzel.de>
Date2018-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]


#4335

FromTom Wallenfang <tom@wallenfang.de>
Date2018-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]


#4338

From"Christoph M. Becker" <cmbecker69@arcor.de>
Date2018-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]


#4340

FromTom Wallenfang <tom@wallenfang.de>
Date2018-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]


#4342

From"Christoph M. Becker" <cmbecker69@arcor.de>
Date2018-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]


#4339

FromArno Welzel <usenet@arnowelzel.de>
Date2018-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]


#4341

From"Christoph M. Becker" <cmbecker69@arcor.de>
Date2018-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]


#4343

FromThomas 'PointedEars' Lahn <PointedEars@web.de>
Date2018-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]


#4344

From"Christoph M. Becker" <cmbecker69@arcor.de>
Date2018-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]


#4333

FromClaus Reibenstein <4spamersonly@kabelmail.de>
Date2018-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]


#4334

FromStefan+Usenet@Froehlich.Priv.at (Stefan Froehlich)
Date2018-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