| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

03-07-2009, 20:59
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von RamonaS
zu 3:
Damit ich auch sicher bin das die varablen/arrays sich nicht addieren oder sowas in der art.
|
Wenn die Funktion so groß ist, dass du den Überblick über deine Variablen verlierst, machst du irgendwas falsch.
|

03-07-2009, 21:33
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Zitat:
|
Was macht ihr da an stelle von PHP_SELF ?
|
Ich?
Einfach nur weglassen.
|

04-07-2009, 00:54
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Du kannst PHP_SELF benutzen, darfst es nur nicht unbehandelt im Kontext HTML ausgeben - htmlspecialchars hilft.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

04-07-2009, 11:29
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
$_SERVER['SCRIPT_NAME'] ist meist sicherer. Prüfe vor der Verwendung ob das auf deinem System auch so ist.
Aber wie schon gesagt: Enfach weglassen wäre das Einfachste.
|

04-07-2009, 12:52
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von combie
$_SERVER['SCRIPT_NAME'] ist meist sicherer.
|
Und beide nur brauchbar, wenn es auch eine direkte Beziehung URL <-> Scriptname gibt.
REQUEST_URI, ggf. zerlegt, ist manchmal als Alternative brauchbar.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

04-07-2009, 14:14
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Hallo,
Ok die vorschläge schein sich ja ganz vielfältig zu sein.
Ich würde das mal von der anderen seite angehen, also Frage zu Punkt 2 von combie:
>2. PHP_SELF ermöglicht u.U. XSS Attacken
Was für Schaden kann man jetzt hier überhaupt anrichten?
|

04-07-2009, 14:16
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
|

04-07-2009, 15:12
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Zitat:
Zitat von combie
|
Ähmm nicht kaputt, aber ich befasse mich weniger mit schlechtigkeites dieser art...auf was menschen für ideen kommen - fantastisch!
Ok ich lese mir das mal durch, scheint aber ne komplizierte sache zu sein.
Im notfall erlaube ich in eingabefelder nur die zeichen die man da drin wirklich braucht.
|

04-07-2009, 15:24
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von RamonaS
Ähmm nicht kaputt, aber ich befasse mich weniger mit schlechtigkeites dieser art...auf was menschen für ideen kommen - fantastisch!
|
Gehe prinzipiell immer davon aus, dass alles, was nicht unter deiner Kontrolle steht, böse sein kann. Und was der Benutzer auf seiner Seite im Browser (oder mit anderer Software) macht, kannst du nicht kontrollieren, somit erwarte immer das Schlimmste.
Wer im Internet gutgläubig ist, handelt sehr fahrlässig. Es gibt 99,9% "ordentliche" Menschen und 0,1% "böse" Menschen. Und diese 0,1% haben sich zur Aufgabe gemacht, die 99,9% auszunehmen. Logischerweise sind die auch nicht ganz blöd und probieren das zuerst bei denen, die "schwach" erscheinen. Wenn du also eine öffentliche (!!!) Webseite betreibst, dir aber um Sicherheit keine Gedanken machst, bist du "schwach" und somit ein leichtes und einfaches Angriffsziel.
|

05-07-2009, 00:10
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von RamonaS
Naja, ich hab eigentlich keine daten von der zeit als timestamp noch kürzer als 10 zeichen war.
|
Genau so eine Antwort hatte ich erwartet.
Zitat:
|
...aber ich werde die "unvermeidliche preg_replace()-Lösung" von dir zum einsatz bringen.
|
Das "unvermeidlich" bezog sich einerseits darauf, dass mir diese Lösung als erstes eingefallen ist (bevor ich auf die Suche nach Lösungen mit den str_ schlagmichtot-Funktionen gegangen bin); und andererseits darauf, dass man so eine Lösung wohl von mir erwartet (hätte).
Zitat:
|
Ich muß dir allerdings gestehen, die regex sind für mich noch viel schlimmer als mit arrays rum zu handieren.
|
Das lernt man mit der Zeit. Der RegEx ist doch eigentlich ganz simpel: Ein bisschen Patternmatching -- keinmal bis vielmal ein fast beliebiges Zeichen außer "|" und danach ein "|" -- und davor eine Verankerung am Stringanfang "\A".
Zitat:
|
Ich lass die dann gleich so denn wenn ich da dran fummel tut sie garantiert nicht mehr.
|
Aber nur durchs Dranrumfummeln lernt man, wie sie funktionieren.
Zitat:
Zitat von wahsaga
Das ist in so einem simplen Fall keine gute Idee.
explode leistest hier ganz simpel das gewünschte.
|
Ganz offensichtlich nicht, denn es liefert ein Array zurück, wir wollten doch aber mit echo eine Zeichenkette ausgeben, oder hab ich was übersehen?
Das es sicher schneller als preg_split() ist, ist eine andere Sache.
Zitat:
|
Reguläre Ausdrücke sind i.a.R. kostenintensiver als einfache Stringfunktionen.
|
Schön, dass du die Pauschalaussage mit "i.a.R." abgeschwächt hast.
Ich hab das jetzt mal durchgetestet:
PHP-Code:
$zt = '1234567890|gaga|gogo|tralafitti'; // teststring
// 1 100_000
// durchlauf durchläufe durchläufe
// in ms in ms pro s
list (, $out) = preg_split('/\|/', $zt, 2); // 0.004 377.204 265108
preg_replace('/\A[^|]*\|/', '', $zt); // 0.003 330.124 302916
list (, $out) = explode('|', $zt, 2); // 0.002 248.582 402281
substr($zt, strpos($zt, '|') + strlen('|')); // 0.002 234.148 427080
substr($zt, strpos($zt, '|') + 1); // 0.002 174.253 573878
Die Variante mit preg_replace() läuft im Schnitt ca. 30 Prozent langsamer als die mit explode(). Kostenintensiv ist was anderes.
Kommen wir nun von der Geschwindigkeit zur Schönheit. Die liegt bekanntlich im Auge des Betrachters und ist daher schwerer messbar ... :-P
Zitat:
Zitat von RamonaS
@fireweasel
So ich hab das jetzt so gemacht:
PHP-Code:
if(isset($_GET['uo']) and $_GET['uo']=="s") # Link wurde geklickt
{echo "<br /><br />";
$arr=explode("\n",file_get_contents($_SERVER["DOCUMENT_ROOT"]."/useronline.txt"));
foreach($arr as $line)
{echo "<br />".preg_replace('/\A[^|]*\|/','',$line),"\n";} # Ganze Zeile anzeigen, ausser Arayy Index 0
}
else
{echo "<a href='".$_SERVER['PHP_SELF']."?uo=s'>(".$all.")</a>";}
unset($dx,$arr,$line,$zt);
Würdest du sagen das dieser scriptteil jetzt perfekt ist oder nur zu 100% ok?
|
Ich habe mal die schon gegebenen Vorschläge eingearbeitet:
PHP-Code:
define('cgi_user_online', 'uo');
// ...
function blarg() {
// ...
$file_user_online = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'useronline.txt';
$url_self = $_SERVER['PHP_SELF']; // oder ein sinnvollerer Wert
// ...
// empty () funktioniert fast immer
// Ausnahme: '0' gehoert zu den erwuenschten Benutzereingaben
if (!empty ($_GET[cgi_useronline])) {
echo '<br /><br />';
// Datei zeilenweise in Array einlesen
// Leerzeilen werden ausgelassen
// Zeilenumbrueche entfernt
$arr = file($file_useronline, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
if (empty ($arr)) {
// Datei konnte nicht gelesen werden oder war leer, also brechen wir hier ab
return false;
}
foreach ($arr as $line) {
// entfernt das erste Feld des "Datensatzes" und Trennzeichen "|"
echo '<br />', preg_replace('/\A[^|]*\|/', '', $line), "\n";
}
}
else {
echo sprintf(
'<a href="%s"?%s=s>(%s)</a>',
htmlspecialchars($url_self, ENT_QUOTES),
cgi_user_online,
htmlspecialchars($all)
);
}
// ...
return true; // oder ein sinnvollerer Rueckgabewert
}
So in etwa würde ich das machen. Es gibt da sicher immer noch Verbesserungsmöglichkeiten, aber um die umzusetzen, müsste man mehr über das gesamte Script wissen. Was mir vor allem nicht gefällt, sind die ganzen festverdrahteten Zeichenketten. Wer sowas mal an andere Dateinamen, Pfade oder CGI-Parameter anpassen muss, darf fleißig das ganze Script umkrempeln. Viele (Quelltext-)Editoren bieten zu diesem Zweck in ihren Search-n-Replace-Dialogen übrigens Reguläre Ausdrücke an. Auf diese Weise kann man die auch üben.
Zitat:
Für änderungsvorschläge hab ich immer ein offenes auge.
|
Offenes Auge? Oder meintest du eher ein offenes Ohr?
Naja, immer noch besser als ein offenes Bein ...
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (05-07-2009 um 00:13 Uhr)
|

05-07-2009, 02:04
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von fireweasel
Ganz offensichtlich nicht, denn es liefert ein Array zurück, wir wollten doch aber mit echo eine Zeichenkette ausgeben, oder hab ich was übersehen?
|
Ganz zum Anfang des Threads hiess es:
Zitat:
|
Ich möchte per echo den inhalt aller array-elemente ausgeben, ausser dem ersten elemend - index 0
|
Das mit dem Array kam hier höchstvermutlich daher, dass es schon explode genutzt wurde - aber eigentliches Anliegen wahr wohl, von einer vorliegenden Zeile nur den Rest ab einer bestimmten Position auszugeben.
Und je nachdem, wie einfach diese Position bestimmbar ist, wären hier weder RegEx noch explode meine erste Wahl, sondern simple Zeihenkettenfunktionen (wie strpos und substr).
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

06-07-2009, 15:19
|
|
RamonaS
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 177
|
|
Zitat: Was macht ihr da an stelle von PHP_SELF ?
Zitat:
Zitat von combie
Ich?
Einfach nur weglassen.
|
Da wollte ich nochmal nachhacken:
Soviel ich weiß ist das nicht valide, ausserdem ist das doch genau so gefährlich als vorher, ainschläußen kann man dort auch fremden code, oder?
<a href="">Link</a>
<a href="#">Link</a>
Beide varianten sind laut w3c in xhtml nicht zuläßig, ein link muß auch eine eindeutige linkadresse beinhalten!
|

06-07-2009, 15:29
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von RamonaS
<a href="">Link</a>
<a href="#">Link</a>
Beide varianten sind laut w3c in xhtml nicht zuläßig,
|
Wo hast du denn die Info her?
Zitat:
|
ein link muß auch eine eindeutige linkadresse beinhalten!
|
Ein leeres href/action-Attribut wird automatisch zur Adresse, von der das Dokument angefordert wurde, aufgelöst.
Zitat:
|
ausserdem ist das doch genau so gefährlich als vorher, ainschläußen kann man dort auch fremden code, oder?
|
Wo soll denn etwas eingeschleust werden, wenn gar nichts ausgegeben wird?
Hast du verstanden, worauf XSS beruht ...?
(Davon abgesehen verstehe ich die Panik, die einige hier machen, was Werte wie PHP_SELF, REQUEST_URI etc. angeht, nicht.
Vernünftig kontextgerecht behandelt stellt keiner davon eine XS-Gefahr dar.)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

06-07-2009, 15:31
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Zitat:
|
Soviel ich weiß ist das nicht valide,
|
Was ist da nicht valide?
Das action oder href Attribut MUSS vorhanden sein, aber es darf leer bleiben!
Zitat:
|
ainschläußen kann man dort auch fremden code, oder?
|
Dann aber nicht mehr über PHP_SELF.
 Besser eine Tür mehr zu, als eine mehr offen.
Zitat:
|
Vernünftig kontextgerecht behandelt stellt keiner davon eine XS-Gefahr dar.
|
Nach entsprechnder Ausbildung, bei bestimmungsgemäßer Anwendung und mit richtiger Schutzkleidung ist eine 70cm 3.8PS Kettensäge auch recht ungefährlich.
Aber das alles ist bei RamonaS offensichtlich nicht gegeben.
Geändert von combie (06-07-2009 um 15:39 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|