Ist die Verhinderung von XSS und SQL-Injection so einfach wie dieses
Frage: verhindert XSS (cross-site-scripting) so einfach mit strip_tags
auf alle gespeicherten input-Felder und laufen htmlspecialchars
auf jede angezeigte Ausgabe ... und verhindert SQL-Injection mittels PHP PDO prepared statements?
Hier ein Beispiel:
//INPUT: Input a persons favorite color and save to database
//this should prevent SQL injection ( by using prepared statement)
//and help prevent XSS (by using strip_tags)
$sql = 'INSERT INTO TABLE favorite (person_name, color) VALUES (?,?)';
$sth = $conn->prepare($sql);
$sth->execute(array(strip_tags($_POST['person_name']), strip_tags($_POST['color'])));
//OUTPUT: Output a persons favorite color from the database
//this should prevent XSS (by using htmlspecialchars) when displaying
$sql = 'SELECT color FROM favorite WHERE person_name = ?';
$sth = $conn->prepare($sql);
$sth->execute(array(strip_tags($_POST['person_name'])));
$sth->setFetchMode(PDO::FETCH_BOTH);
while($color = $sth->fetch()){
echo htmlspecialchars($color, ENT_QUOTES, 'UTF-8');
}
- Nicht ganz fangen Sie - wollen Sie an mysql_query() der $save_to_database Wert? Dann müssen Sie noch nennen
mysql_real_escape_string()
bevor Sie senden Sie Ihre Anfrage, sonst sind Sie nicht geschützt vor SQL-Injektionen (die nicht XSS, wieder) - Sind Sie sich da sicher? Er ist mit prepared statements.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es sogar noch einfacher. Nur
htmlspecialchars()
(mit Zitat-Stil und character set), die auf user-controlled input ist genug. Diestrip_tags()
ist nur sinnvoll, wenn Sie schon wollen zu bereinigen die Daten vor der Verarbeitung/speichern in der Datenbank, die oft nicht in der realen Welt. HTML-code kann nicht Schaden, im PHP-source, aber PHP-code kann dies tun, wenn Sie verwendeneval()
auf non-sanitized Benutzer-gesteuerte ein-oder jene Art von bösen Sachen.Diese jedoch nicht speichern Sie aus SQL-Injektionen, aber das ist eine andere Geschichte.
Update: um sauber Benutzereingaben aus der Anfrage zu vermeiden magic quotes in user-controlled input, können Sie folgende Funktion verwenden:
kann verwendet werden als:
(die Sie tun können, simliar für
get_number
,get_boolean
,get_array
etc)Vorbereitung der SQL-Abfrage zu vermeiden SQL-Injektionen, do:
Zur Anzeige von Benutzer-gesteuerte Eingabe zu vermeiden, XSS, do:
mysql_real_esacpe_string()
: php.net/manual/en/function.mysql-real-escape-string.php. Darüber hinaus müssen Sie auch nehmenget_magic_quotes_gpc()
berücksichtigt. Wenn diese true zurückgibt, auf die PHP-Umgebung, die Sie benötigen, um ausführenstripslashes()
auf der input-als auch.strip_tags()
, es kann OK sein (wenn magic quotes ist immer ausgeschaltet, unabhängig von der Umgebung, laufen Sie auf). @troelskn: entweder ich verstehe dich nicht oder du verstehst uns nicht. Beachten Sie, dass es war ein update nach den Kommentaren.htmlspecialchars()
tun beide XSS-Prävention (die Flucht der<
und>
) und HTML-injection-Prävention (die Flucht der"
und'
). Auch, in den meisten Fällen Sie möchten, speichern Sie die Eingabe des Benutzers unverändert wie möglich, so dass Sie wissen, was der Benutzer tatsächlich eingegeben, so dass Sie können schließlich soziale Aktionen.strip_tags()
ist nicht notwendig, es sei denn Sie wollen etwas haben wieif speed > 100
gespeichertif speed 100
. Auf der anderen Seite.. Nur versuchen XSS / SQLi-Angriffe auf Ihre webapp selbst..? 🙂Hängt es ab, wo und wie Sie wollen, verwenden Sie die Benutzer-Daten. Sie müssen wissen, der Kontext, die Sie einfügen möchten Ihre Daten in die und die meta-Zeichen sind von diesem Zusammenhang.
Wenn Sie nur wollen, um dem Benutzer zu ermöglichen, einen text auf Ihrer website,
htmlspecialchars
genügt, um zu entkommen die HTML-meta-Zeichen. Aber wenn Sie wollen es zulassen, daß bestimmte HTML-oder einbetten möchten, auf Benutzer-Daten in bestehenden HTML-Elementen (wie eine URL in eineA
/IMG
- element)htmlspecialchars
ist nicht genug, wie Sie nicht sind in der HTML-Kontext mehr, sondern in der URL-Kontext.Also die Eingabe
<script>alert("xss")</script>
in eine Bild-URL-Feld wird die Ausbeute:Aber die Eingabe
javascript:alert("xss")
gelingt:Hier sollten Sie einen Blick auf die fabelhafte XSS (Cross Site Scripting) Cheat Sheet, um zu sehen, was die Kontexte Ihrer Benutzer-Daten kann eingespritzt werden.
strip_tags ist nicht notwendig. In den meisten Fällen strip_tags ist nur irritierend, weil einige Benutzer verwenden möchten, können
<
und>
in Ihren Texten. Verwenden Sie einfach htmlspecialchars (oder htmlentities, wenn Sie bevorzugen), bevor man das echo der Texte an den browser.(Vergessen Sie nicht mysql_real_esacpe_string, bevor Sie etwas einfügen in Ihre Datenbank!)
Die Allgemeine Regel/mem "Filter Input, Escape Output." Mit
strip_tags
auf Ihre Eingabe zu entfernen beliebigen HTML ist eine gute Idee für den input filtern, aber Sie sollten so streng wie möglich, in welchen input Sie ermöglichen. Zum Beispiel, wenn ein input-parameter ist eigentlich nur ein integer sein, nur akzeptieren numerische Eingabe und immer konvertieren in eine Ganzzahl, bevor Sie alles mit ihm. Gut-geprüft-Filterung im Eingang der Bibliothek wird Ihnen helfen, eine Menge hier; eine, die nicht spezifisch für ein bestimmtes framework ist Inspekt (die ich geschrieben habe, so bin ich ein wenig voreingenommen).Für die Ausgabe
htmlspecialchars
sollte in der Lage zu entkommen XSS-Angriffe, aber nur wenn Sie die richtigen Parameter. Du musst das Zitat Flucht style und ein charset.Im Allgemeinen, diese sollte entfernen XSS-Angriffe:
Ohne
ENT_QUOTES
als zweiten parameter einfache Anführungszeichen chars sind nicht codiert. Darüber hinaus XSS-Angriffe haben gezeigt, wenn der richtige Zeichensatz ist nicht bestanden (in der Regel UTF-8 ist ausreichend).htmlspecialchars
sollte immer aufgerufen werden, mit ENT_QUOTES und eine charset-parameter.Beachten Sie, dass PHP 5.2.12 enthält eine Korrektur für ein multibyte-XSS-Angriff.
Finden Sie die OWASP ESAPI PHP port interessant und nützlich, obwohl die PHP-version ist nicht komplett, soweit ich weiß.
strip_tags
ist eine gute Idee. Es bricht einige legitime Eingang, ist aber nicht ausreichend für die Sicherheit. Nurhtmlspecialchars()
genügt, und es ist nicht verlustbehaftet.Ja, mit PDO prepared statements schützt vor SQL-injection. Die SQL-injection-Angriff beruht auf der Tatsache, dass die Daten, die vom Angreifer behandelt, als ein Teil der Abfrage. Zum Beispiel, der Angreifer sendet den string "a" oder 'a'='a", wie sein Passwort. Statt die gesamte string verglichen, um die Passwörter in der Datenbank, es wird in der Abfrage enthalten, so dass die Abfrage wird "SELECT * FROM users WHERE login='joe' AND password='a' oder 'a'='a'". Der Teil der Angreifer-Eingabe wird interpretiert als ein Teil der Abfrage. Jedoch, im Falle von prepared statements, Sie erzählt die SQL-engine, die speziell, welche Rolle die Abfrage, und welche Daten (die von der Einstellung der Parameter), also keine solche Verwechslung möglich ist.
Nein, mit strip_tags nicht immer schützen Sie sich vor cross-site-scripting. Betrachten Sie das folgende Beispiel. Angenommen, Ihre Seite enthält:
Den Angreifer sendet die Anfrage mit "Sprache" festgelegt "';somethingevil();'" . die Funktion strip_tags() gibt an, diese Daten so wie Sie ist (es gibt keine tags). Der erzeugte code Seite wird:
somethingevil() ausgeführt wird. Ersetzen somethingevil() durch tatsächliche XSS-exploit-code.
Deinem letzten Beispiel mit htmlspecialchars() werden Sie schützen gegen dieses, weil es zu entkommen einfache Anführungszeichen. Ich habe jedoch gesehen, noch seltsamer Fälle von vom Benutzer gelieferten Daten in JavaScript-code, wo es nicht einmal innerhalb einer in Anführungszeichen eingeschlossenen Zeichenkette haben. Ich glaube, es war in den Variablen-oder Funktionsnamen. In letzterem Fall wird kein Betrag der Flucht, wird es wahrscheinlich helfen. Ich glaube, es ist am besten zu vermeiden, die Verwendung von Benutzer-Eingabe zu erzeugen JavaScript-code.
<script>
hat CDATA-Inhalt-Modell, das unterstützt keine Entitäten. Sie haben zu entkommen</
als<\/
.json_encode()
dies tut.Einfache Antwort : Nein
Längere Antwort : Es gibt Möglichkeiten, um zu injizieren, xss, PHP strip_stags nicht zu vermeiden.
Besser zu schützen versuchen HTML purifier
<?echo strip_tags($_GET['query']);?>
in seinem Körper. Was die Injektionen sind hier möglich?strip_tags()
verwendet wird ohnehtmlspecialchars()
.strip_tags
(abgesehen vom setzen von Benutzer-Eingaben innerhalb einessrc
/href
- Attribut, das würde nicht wirklich Sinn machen, verwenden Sie es auf)?