2010-12-12 8 views
2

Ich arbeite an einer Website, wo Inhaltsseiten mit mod_rewrite behandelt werden, und ich versuche, die URL mit mod_rewrite geschützt von mit einigen Char Einschränkung zu machen , da die Benutzer können Seiten Inhalt wie folgt erstellen:URL und mod_rewrite: viele spezielle Zeichen verwenden und Daten vor Angriffen schützen

http://site.com/content-type/Page-created-by-user 

Meine Zweifel kommen, wenn sie so etwas wie ein:

http://site.com/architect/Giovanni+Dall'Agata 

ich brauche ' char einfügen, weil ich Namen haben wie das zum Beispiel von berühmten Architekten, aber ich weiß nicht, ob ich Daten sicher aufbewahren kann und wie SQL injections mit diesem Charakter verhindern.

Sollte ich etwas bestimmtes tun, um Angriffe zu verhindern?

I PDO class in PHP wie diese bin mit:

$architect = strip_tags (trim ($_REQUEST["architect"])); 

// pdo class etc.. 
$pdo_stmt->bindParam (":arch", $architect, PDO::PARAM_STR); 
// and the other code here... 

Benutzer können keine Seiten mit diesen Zeichen erstellen: < >/\ * ? = sollte ich ' und " zu verbieten? Oder sollte ich nur einen von ' und " Zeichen zulassen oder kann ich sie zusammen verwenden und Server sicher halten?

+3

Was das Design angeht, wollen Sie wirklich gegen SQL-Injection zu bewachen - wie Ihr mod_rewrite Regeln - diesen Schutz bieten. Ihre Verwendung von gebundenen Parametern in PDO wird in dieser Hinsicht dringend empfohlen. – Schwartzie

Antwort

2

$stmt->bindParam (und bindValue, und im allgemeinen, Prepared Statements) ist sicher vor SQL-Injection. Alle seriösen SB-Frameworks unterstützen eine Möglichkeit, Parameter zu einer Abfrage hinzuzufügen, und auf diese Weise hinzugefügte Werte werden bereinigt. Sie sollten immer tun, und nie (siehe Kommentare) manuell in einen SQL-Abfrage-String von den Benutzern kommenden Variablen Daten einfügen.

, die noch die Frage der XSS-Injektionen Blätter, die leichter zu verpassen (obwohl auch weniger gefährlich); um sie zu vermeiden, stelle sicher, dass du immer htmlspecialchars($var,ENT_QUOTES) (oder urlencode, abhängig vom Kontext) verwendest. so nah an der Datenbank wie möglich, anstatt sich auf andere Schichten Ihrer Anwendung

+0

Allerdings müssen wir manchmal eine Variable oder zwei in Abfrage direkt hinzufügen. Es ist besser, für einen solchen Fall bewaffnet zu sein, als nur zu verbieten. –

+0

Ich würde es in der Regel vermeiden, es sei denn, es ist eine Konstante oder anderweitig offensichtlich kompromisslos durch den Benutzer. Es ist nicht genug, dass der Code sicher ist. es sollte * sicher * aussehen.Macht die Wahrscheinlichkeit von zufälligen Ausrutschungen viel kleiner. – Tgr

+0

also, fügen Sie es besser zu der Antwort hinzu oder erwähnen Sie zumindest, dass Sie nur über Daten sprechen. Denn vorbereitete Anweisungen können nur Daten schützen und können bei keinem anderen Teil der Abfrage helfen. –

0

PDO entweicht automatisch Zeichen wie ' so sollten Sie in Ordnung sein, nur sicherstellen, dass Sie haben register_globals und magic_quotes ausgeschaltet und immer bindParam für Ihre Fragen verwenden.

Auch wenn Ihr Gespräch über dynamische URL Erstellen Sie nicht sowieso in ihnen die ' Charakter haben sollte. Ich benutze immer:

$str = preg_replace("([^0-9a-zA-Z\-])", "", $str); 

Das entfernt alles, was nicht 0-9, a-z oder ein Strich aus der Zeichenfolge entfernt.

+0

Vielen Dank für Ihre Antwort, sollte ich noch strip_tags verwenden (trim ("...")) Wenn ich mit PDO Klasse arbeite? – vitto

+0

In der Tat entgeht PDO nichts. Zumindest nicht im kompatiblen Modus. Es verwendet einen anderen Mechanismus –