Wie entkomme ich nur einfachen Anführungszeichen?

71

Ich schreibe einen JavaScript-Code, der eine mit PHP gerenderte Zeichenfolge verwendet. Wie kann ich einfache Anführungszeichen (und nur einfache Anführungszeichen) in meiner PHP-Zeichenfolge umgehen?

<script type="text/javascript">
    $('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>');
</script>
Andrew
quelle
8
Sie müssen mehr als nur einfache Anführungszeichen verwenden. Zum einen Newlines. Sie könnten gut mit so etwas wieaddcslashes($mystringWithSingleQuotes, "'\"\r\n\\\t\0..\37")
Frank Farmer
2
Verwenden Sie json_encode(), um eine gültige Javascript-Zeichenfolge abzurufen (und entfernen Sie Ihre äußeren einfachen Anführungszeichen), anstatt die Flucht selbst zu behandeln.
Mario
1
@Frank: Kannst du deine Antwort als Antwort anstatt als Kommentar posten? Richtige Antworten in Kommentaren können nicht ausgewählt werden und erzeugen daher falsche "unbeantwortete Fragen".
Sylverdrag
Warum können Sie nicht einfach doppelte Anführungszeichen einfügen, .html()anstatt einfache Anführungszeichen einzugeben? Die PHP-Erweiterung wird unabhängig davon stattfinden. Dies wurde für alles getan, von Attributen für Elemente und Importe bis hin zu Variablenzuweisungen in Skriptblöcken.
Mark Carpenter Jr

Antworten:

67

Ganz einfach: echo str_replace('\'', '\\\'', $myString); Ich würde jedoch die Verwendung von JSON und der json_encode()Funktion vorschlagen, da diese zuverlässiger ist (zitiert beispielsweise neue Zeilen):

<?php $data = array('myString' => '...'); ?>

<script>
   var phpData = <?php echo json_encode($data) ?>;
   alert(phpData.myString);
</script>
Crozin
quelle
5
Alle Antworten str_replace("'","\\'", $string)und Ähnliches sind falsch. Betrachten Sie die Zeichenfolge \ 'Sie wird durch \\' ersetzt, und dies führt zu einer Sicherheitsanfälligkeit durch Injektion. Verwenden Sie stattdessen json_encode, wie Crozin vorschlägt.
David M.
1
Vielen Dank. Ich wusste das, aber ich hatte ein Problem, weil ich es versuchte, JSON.parse('<?php echo json_encode($data);?>');und es schlug fehl, weil die Daten ein einziges Anführungszeichen enthielten. Später erfuhr ich, dass hier keine Verwendung erforderlich JSON.parseist.
Ravi Dhoriya
json_encode könnte Sie in Schwierigkeiten bringen, wenn die json-Erweiterung nicht installiert wurde. Lesen Sie meine Lösung unten mit strtr (..)
Basil Musa
2
@BasilMusa Ab PHP 5.2 wird die JSON-Erweiterung standardmäßig gebündelt ( Quelle ), daher würde ich mir darüber keine Sorgen machen.
Crozin
1
@ DavidM. außer dass das OP JSON nie erwähnt und sehr spezifisch war, was er braucht.
Julian
23

Wenn Sie Zeichen mit einem entkommen möchten \, haben Sie addcslashes(). Wenn Sie beispielsweise nur einfache Anführungszeichen wie die Frage vermeiden möchten, können Sie Folgendes tun:

echo addcslashes($value, "'");

Und wenn Sie entfliehen wollen ', ", \, und nul(das Byte null), können Sie verwenden addslashes():

echo addslashes($value);
PhoneixS
quelle
1
Vielen Dank, dass Sie auf zusätzliche Schrägstriche hingewiesen haben , um beliebigen Zeichen zu entgehen.
Kai Noack
18
str_replace("'", "\'", $mystringWithSingleQuotes);
julianisch
quelle
14

In einigen Fällen konvertiere ich es einfach in ENTITIES:

                        // i.e.,  $x= ABC\DEFGH'IJKL
$x = str_ireplace("'",  "&apos;", $x);
$x = str_ireplace("\\", "&bsol;", $x);
$x = str_ireplace('"',  "&quot;", $x);

Auf der HTML-Seite ist die visuelle Ausgabe dieselbe:

ABC\DEFGH'IJKL

Es ist jedoch in der Quelle bereinigt.

T.Todua
quelle
8

Verwenden Sie diese einfache Anweisung, um nur einfache Anführungszeichen zu ersetzen:

$string = str_replace("'", "\\'", $string);
DevelRoot
quelle
7

Verwenden Sie die native Funktion htmlspecialchars. Es wird allen Sonderzeichen entkommen. Wenn Sie speziell aus einem Angebot entkommen möchten, verwenden Sie mit ENT_COMPAToder ENT_QUOTES. Hier ist das Beispiel:

$str = "Jane & 'Tarzan'";
echo htmlspecialchars($str, ENT_COMPAT); // Will only convert double quotes
echo "<br>";

echo htmlspecialchars($str, ENT_QUOTES); // Converts double and single quotes
echo "<br>";

echo htmlspecialchars($str, ENT_NOQUOTES); // Does not convert any quotes

Die Ausgabe wäre wie folgt:

Jane &amp; 'Tarzan'<br>
Jane &amp; &#039;Tarzan&#039;<br>
Jane &amp; 'Tarzan'

Lesen Sie mehr in der PHP htmlspecialchars () Funktion

Nishad Up
quelle
5

Sie können die Funktion addcslashes verwenden, um dies folgendermaßen zu erledigen:

echo addcslashes($text, "'\\");
Junior
quelle
2

Nach langer Zeit mit diesem Problem zu kämpfen, denke ich, ich habe eine bessere Lösung gefunden.

Die Kombination zweier Funktionen ermöglicht es, eine Zeichenfolge zu maskieren, die als HTML verwendet werden soll.

Erstens, um doppelte Anführungszeichen zu vermeiden, wenn Sie die Zeichenfolge in einem JavaScript-Funktionsaufruf verwenden. und ein zweites, um dem einfachen Anführungszeichen zu entkommen und die einfachen Anführungszeichen zu vermeiden, die das Argument umgehen.

Lösung:

mysql_real_escape_string(htmlspecialchars($string))

Lösen:

  • eine PHP-Zeile erstellt, um eine JavaScript-Funktion wie aufzurufen

echo 'onclick = "javascript_function (\' '. mysql_real_escape_string (htmlspecialchars ($ string))"

arturocu81
quelle
0

Hier ist, wie ich es gemacht habe. Dumm, aber einfach.

$singlequote = "'";
$picturefile = getProductPicture($id);

echo showPicture('.$singlequote.$picturefile.$singlequote.');

Ich habe an der Ausgabe von HTML gearbeitet, das JavaScript-Code heißt, um ein Bild anzuzeigen ...

Paisano Centobie
quelle
0

Ich bin nicht sicher, was genau Sie mit Ihren Daten machen, aber Sie könnten immer versuchen:

$string = str_replace("'", "%27", $string);

Ich benutze dies immer dann, wenn Zeichenfolgen zur Speicherung an eine Datenbank gesendet werden.

% 27 ist die Codierung für das Zeichen 'und hilft auch, die Unterbrechung von GET-Anforderungen zu verhindern, wenn ein einzelnes 'Zeichen in einer an Ihren Server gesendeten Zeichenfolge enthalten ist. Ich würde 'in JavaScript und PHP durch% 27 ersetzen, nur für den Fall, dass jemand versucht, einige Daten manuell an Ihre PHP-Funktion zu senden.

Um es für Ihren Endbenutzer schöner zu machen, führen Sie einfach eine inverse Ersetzungsfunktion für alle Daten aus, die Sie von Ihrem Server zurückerhalten, und ersetzen Sie alle% 27-Teilzeichenfolgen durch '.

Fröhliche Injektion vermeiden!

Mike
quelle
0

Ich habe die folgende Funktion geschrieben. Es ersetzt Folgendes:

Einfaches Anführungszeichen ['] mit einem Schrägstrich und einem einfachen Anführungszeichen [\'].

Backslash [\] mit zwei Backslashes [\\]

function escapePhpString($target) {
    $replacements = array(
            "'" => '\\\'',
            "\\" => '\\\\'
    );
    return strtr($target, $replacements);
}

Sie können es ändern, um Zeichenersetzungen im Array $ replace hinzuzufügen oder zu entfernen. Um beispielsweise \ r \ n zu ersetzen, wird es zu "\ r \ n" => "\ r \ n" und "\ n" => "\ n".

/**
 * With new line replacements too
 */
function escapePhpString($target) {
    $replacements = array(
            "'" => '\\\'',
            "\\" => '\\\\',
            "\r\n" => "\\r\\n",
            "\n" => "\\n"
    );
    return strtr($target, $replacements);
}

Das nette Merkmal von strtr ist, dass es lange Ersetzungen bevorzugt.

Beispiel: "Cool \ r \ nFeature" wird ausgeblendet, anstatt zu entkommen.

Basilikum Musa
quelle