AJAX POST und Pluszeichen (+) - Wie verschlüsseln?


98

Ich poste den Inhalt eines Formularfeldes über AJAX in ein PHP-Skript und verwende JavaScript dazu escape(field_contents). Das Problem ist, dass alle Pluszeichen entfernt und durch Leerzeichen ersetzt werden. Wie kann ich das Pluszeichen sicher "codieren" und es dann auf der PHP-Seite entsprechend "decodieren"?


Zur Verdeutlichung habe ich Escape (field_contents) verwendet, nicht codiert
— Jalperin

Antworten:


155

Verwenden Sie encodeURIComponent()in JS und in PHP sollten Sie die richtigen Werte erhalten.

Hinweis: Wenn Sie auf oder in PHP zugreifen $_GET, rufen Sie Werte ab, die bereits dekodiert wurden.$_POST$_REQUEST

Beispiel:

In Ihrem JS:

// url encode your string
var string = encodeURIComponent('+'); // "%2B"
// send it to your server
window.location = 'http://example.com/?string='+string; // http://example.com/?string=%2B

Auf Ihrem Server:

echo $_GET['string']; // "+"

Nur die rohe HTTP-Anforderung enthält die URL-codierten Daten.

Für eine GET-Anfrage können Sie diese aus dem URI. $_SERVER['REQUEST_URI']oder abrufen $_SERVER['QUERY_STRING']. Für einen urlencodierten POSTfile_get_contents('php://stdin')

NB:

decode()funktioniert nur für Einzelbyte-codierte Zeichen. Es funktioniert nicht für den gesamten UTF-8-Bereich.

z.B:

text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100 
// correct
encodeURIComponent(text); // "%C4%80"

Hinweis: "%C4%80"entspricht:escape('\xc4\x80')

Welches ist die Byte-Sequenz ( \xc4\x80), die Āin UTF-8 darstellt. Wenn Sie also encodeURIComponent()Ihre Serverseite verwenden, müssen Sie wissen, dass sie UTF-8 empfängt. Andernfalls wird PHP die Codierung entstellen.


Ein Follow-up: Wenn ich UKomponente (Text) codiere und Text Zeichen wie das intelligente Anführungszeichen (& rsqo;) enthält, scheint das PHP-Skript Junk-Zeichen zu sehen. Ich nehme an, es ist ein Zeichensatzproblem, aber ich weiß nicht, wie ich es lösen soll. Ich mache den AJAX POST mit "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8" und verwende PHP5 auf der Serverseite.
— Jalperin

Wie sehen Sie diese Charaktere? Sie müssen sicherstellen, dass der Browser weiß, dass es sich um UTF-8 handelt. In HTML können Sie festlegen <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">oder <meta charset="UTF-8">Sie können es auch in PHP mit dem HTTP-Header vom Inhaltstyp festlegen. header('Content-Type: text/html;charset=UTF-8');PS: & rsqo; dekodiert nicht im Browser (FF3.5).
— Bucabay

5
Ich hatte ein Problem mit dem Pluszeichen (+), das sich in ein Leerzeichen verwandelt. Alles andere lief gut in UTF8. Ich hatte viel Glück mit encodeURIComponent (JSON.stringify (rootObject)). Danke dir!
— Zneo

Als ich auf dieses Problem mit Passwörtern stieß (die über ein Javascript-Formular gesammelt wurden), löste ich es mit password = encodeURIComponent (Passwort). Bei der Übergabe an PHP funktioniert der codierte POST-Wert des Kennworts korrekt.
— Lowcrawler

19

Versuchen Sie in JavaScript:

encodeURIComponent() 

und in PHP:

urldecode($_POST['field']);

7
encodeURIComponent ist die richtige Antwort - aber da es URL-codierte Daten und keine HTML-codierten Daten generiert, ist html_entity_encode weit davon entfernt.
— Quentin

1
urldecodeist auch weit weg, da PHP es automatisch dekodiert, bevor es aufgefüllt wird $_POST.
— Quentin

5

Der gesuchte Hexadezimalwert ist %2B

Um es automatisch in PHP zu bekommen, führen Sie Ihren String durch urlencode($stringVal). Und dann laufen Sie es durch urldecode($stringVal), um es zurück zu bekommen.

Wenn Sie möchten, dass das JavaScript damit umgeht, verwenden Sie escape( str )

Bearbeiten

Nach dem Kommentar von @ bobince habe ich mehr gelesen und er hat Recht. Verwenden Sie encodeURIComponent(str)und decodeURIComponent(str). Escape konvertiert die Zeichen nicht, sondern maskiert sie nur mit \'s


1
Sie nicht verwenden escape(oder unescape) in JavaScript; Sie sind nicht mit der URL-Codierung identisch und gehen bei + und allen Nicht-ASCII-Unicode-Zeichen schief. encodeURIComponent / decodeURIComponent ist fast immer das, was Sie wollen.
— Bobince

4

Um es interessanter zu machen und hoffentlich weniger Haare ziehen für jemand anderen zu ermöglichen. Mit Python erstelltes Wörterbuch für ein Gerät, das wir mit Curl konfigurieren können.

Problem: {"timezone":"+5"} //throws an error " 5"

Lösung: {"timezone":"%2B"+"5"} //Works

Also auf den Punkt gebracht:

var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])

Danke an diesen Beitrag!


0

Wenn Sie eine Locke in PHP machen müssen, sollten Sie urlencode()von PHP aber individuell verwenden!

strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")

Wenn Sie dies tun urlencode(strPOST), werden Sie ein weiteres Problem bekommen, Sie werden einen Item1 haben und & werden% xx Wert ändern und als ein Wert sein, siehe hier unten die Rückgabe!

Beispiel 1

$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B

Beispiel 2

$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B

Beispiel 1 ist der gute Weg, um einen String für POST in Curl vorzubereiten

Beispiel 2 zeigt, dass der Rezeptor nicht das gleiche und das kaufmännische Und sieht, um beide Werte zu unterscheiden!


-1

Mein Problem war mit den Akzenten (á É ñ) und dem Pluszeichen (+), als ich versuchte, Javascript "Codebeispiele" in MySQL zu speichern:

meine Lösung (nicht der bessere Weg, aber es funktioniert):

Javascript:

function replaceAll( text, busca, reemplaza ){
  while (text.toString().indexOf(busca) != -1)
  text = text.toString().replace(busca,reemplaza);return text;
}


function cleanCode(cod){
code = replaceAll(cod , "|", "{1}" ); // error | palos de explode en java
code = replaceAll(code, "+", "{0}" ); // error con los signos mas   
return code;
}

Funktion zum Speichern:

function save(pid,code){
code = cleanCode(code); // fix sign + and |
code = escape(code); // fix accents
var url = 'editor.php';
var variables = 'op=save';
var myData = variables +'&code='+ code +'&pid='+ pid +'&newdate=' +(new Date()).getTime();    
var result = null;
$.ajax({
datatype : "html",
data: myData,  
url: url,
success : function(result) {
    alert(result); // result ok                     
},
}); 
} // end function

Funktion in PHP:

<?php
function save($pid,$code){
    $code= preg_replace("[\{1\}]","|",$code);
    $code= preg_replace("[\{0\}]","+",$code);
    mysql_query("update table set code= '" . mysql_real_escape_string($code) . "' where pid='$pid'");
}
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.