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"?

Jalperin
quelle
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.

bucabay
quelle
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']);
Deniss Kozlovs
quelle
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

Rob Allen
quelle
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!

Pawr
quelle
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!

Marc
quelle
-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'");
}
?>
BX16Soupapes
quelle