2010-12-29 5 views
1

Ich habe ein Problem und ich habe keine Ahnung, wie Sie es beheben. Ive ein Modul auf meiner Website, die einige Daten zeigt, verwendet es jquery dom und es erstellt einige Elemente aus einem Javascript-Array, das JavaScript-Objekte enthält. Dieses Array wird mit PHP generiert und ruft die Daten aus einer Postgres-Datenbank ab.jQuery, Javascript Array/Objekt SQL Injection Ausgabe

Wenn also ein Benutzer versucht, die Datenbank zu injizieren, speichert die Datenbank die Zeichenfolge als einen normalen Eintrag, ich habe keine Probleme damit. Das Problem tritt auf, wenn ich den Inhalt auflisten möchte. Aber nur auf der Client-Seite. Die Auflistung ist fertig, ich habe die Zeichenfolge generiert, ich übergebe sie an die Client-Seite, die Dom-Elemente werden erstellt, aber sie haben keinen Inhalt. Ich benutze die PHP-Funktion addslashes(), um die Escape-Zeichen zu entkommen, aber ich bekomme nur Ärger.

So, hier ist das Array

[ 
    {"id": "26", "text": "RSS Feed collection"}, 
    {"id": "50", "text": "\\ \' "} 
] 

Wie Sie das letzte sehen kann, enthält die Testinjektion

bearbeiten
HTML-Code:

<div class="item"> 
    <span>Text</span> 
</div> 

Dies erzeugt wird jQuery verwenden.

JS Teil:

var myArray = [the upper array]; 
var container = $("#container"); 

for(nI=0, nC = myArray.length; nI<nC; nI++) { 
    var currentObj = myArray[nI]; 
    var newItem = $("<div />").appendTo(container); 
    $("<span />").appendTo(item).html(currentObj.text); 
} 

Und das Ergebnis ist nichts sichtbar, das Array sieht gut aus, aber jeder Ort, an dem normalerweise der Text sein sollte, ist leer. Die Frage ist warum?

+0

Was? Wo passiert das Problem der Injektion? Sie müssen dies neu formulieren, es ergibt keinen Sinn. – profitphp

+0

Ok, wahr! Die Injection erfolgt also nicht, weil ich sie mit der Funktion pg_escape_string() vermeide, damit die eingehenden Daten so gespeichert werden, wie sie in die db gehen. Das Problem ist mit der Auflistung. Es erzeugt die dom-Objekte, aber ich bekomme nichts in das Beschriftungsfeld. Ich bearbeite meinen ursprünglichen Beitrag, um dir die Struktur zu zeigen. –

Antwort

1

Hmm, klingt wie Sie den Schrägstrich (\) in die Datenbank posten, um einzelne Zitate zu entkommen.

Mysql und andere Datenbanken verwenden wiederholte Anführungszeichen zum Speichern von Varchar-Werten (siehe unten, das ist ein doppeltes einzelnes Zitat: ' x 2).

INSERT INTO jsonTable (`ID`, `Json`) 
VALUES (5, 
'{ "field": "value with escaped ''single'' quotation marks"}'); 

, die in diese eingeschaltet wird:

ID Json 
----------------------------------- 
5  { "field": "value with escaped 'single' quotation marks" } 

würden Sie beiseite die PHP/Javascript-Escape-Zeichen (\) verlassen besser dran, und beschränken Sie sich entweder durch austretendes Zitate:

a) Mit einem parameterized query ist dies der beste Weg, da Sie sich nicht darum kümmern müssen, was Sie entkommen lassen oder nicht:

$preparedStatement = 
    $db->prepare('INSERT INTO jsonTable (`ID`, `Json`) VALUES (5, :json'); 

$preparedStatement->execute(array(':json' => $json)); 

$rows = $preparedStatement->fetchAll(); 

b) einzelne Zitate Ersetzen von ihnen verdoppeln:

$sqlEscaped = str_replace("'", "''", $json); 

Was doppelte Anführungszeichen " Noten: Sie wieder gewohnt haben, um Sorgen, wenn Sie über eine parametrisierte Abfrage verwendet haben, aber wenn Sie planen, Zeichen zu ersetzen In der SQL-Zeichenfolge werden sie nur relevant, wenn Sie innerhalb Ihres INSERT/UPDATE-Skripts doppelte Anführungszeichen verwenden, um eine Zeichenfolge zu begrenzen.dh:

INSERT INTO jsonTable (`ID`, `Json`) 
VALUES (5, 
/* Note how the string below begins and ends with (") */ 
"{ ""field"": ""value with escaped \\""double\\"" quotation marks""}"); 

Und:

ID Json 
----------------------------------- 
5  { "field": "value with escaped \"double\" quotation marks" } 
+0

Danke, das war's! der Backslash :) –

+0

Nr. Freut mich, dass es gelöst wurde. –

1

klingt wie Sie nur eine JavaScript-Problem haben. Als eine gute Vorgehensweise sollten Sie die DOM-Manipulationsaktionen minimieren, indem Sie ein Array der HTML-Elemente erstellen, um sie mit einer einzigen DOM-Methodenausführung anzufügen. Versuchen Sie dieses:

var myArray = [{"text": "First"}, {"text": "Second"}, {"text": "\\ \' "}], 
items = []; 

for(nI = 0, nC = myArray.length; nI < nC; nI++) { 
    items.push('<div><span>' + myArray[nI].text + '</span></div>'); 
} 

$('#container').append(items.join("")); 

Test it here