2010-12-29 13 views
1

Iveに問題があり、修正方法がわかりません。 私のサイトでは、いくつかのデータを表示するモジュールで、jquery domを使用し、javascript配列からいくつかの要素を作成します。魔法使いにはjavascriptオブジェクトが含まれています。 この配列はphpで生成され、postgresデータベースからデータを取得します。jQuery、JavaScriptの配列/オブジェクトのSQLインジェクションの問題

ユーザーがデータベースを挿入しようとすると、データベースは文字列を通常のエントリとして保存しますが、問題はありません。 コンテンツを一覧表示するときに問題が表示されます。しかし、クライアント側でのみ。リストが完了し、文字列が生成され、クライアント側に渡され、DOM要素が作成されますが、内容はありません。私はエスケープをエスケープするためにPHP関数addslashes()を使っていますが、私は困ってしまいます。だから、

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

これが生成されます:あなたは、最後の1は、テスト注入に

編集
HTMLコードが含まれて見ることができるように、ここで配列

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

ですjQueryを使用します。

JSの一部:

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); 
} 

そして結果は、アレイが正常に見える、何も表示されていないが、テキストがあるべき正常にすべての場所は空です。問題はなぜですか?

+0

何?注射の問題はどこで起こっていますか?あなたはこれを言い返す必要があります、それは理にかなっていません。 – profitphp

+0

ですから、pg_escape_string()関数で回避するために注入が行われないようにするため、入力データはdbに格納されて格納されます。問題はリスティングにあります。それは、DOMオブジェクトを作成しますが、私はラベルフィールドに何も取得しません。元の投稿を編集して構造を表示します。 –

答えて

1

まあ、スラッシュ(\)をシングルクォートをエスケープするようにポストしているようですね。

Mysqlと他のデータベースでは、二重引用符(' x 2)を格納するために、二重引用符を使用してvarchar値を格納します。この化します

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

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

あなたはさておき、PHP/JavaScriptのエスケープ文字(\)を残したほうが良い、とのいずれかによってエスケープ引用に自分自身を制限したい:

a)parameterized queryを使用すると、エスケープされているかどうか心配する必要がないので、これが最善の方法です。

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

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

$rows = $preparedStatement->fetchAll(); 

それらを倍にすることによって、単一引用符の交換B):"マーク二重引用については

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

:再びあなたは文句を言わないあなたは上記のパラメータ化クエリを使用している場合心配する必要がありますが、あなたは文字を交換する予定がある場合SQL文字列では、INSERT/UPDATEスクリプト内で二重引用符を使用して文字列を区切る場合にのみ、関連性が高くなります。すなわち:

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

そして:あなただけのJavaScriptの問題を抱えているよう

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

ありがとうございました!バックスラッシュ:) –

+0

Np。それを解決してうれしい。 –

1

が鳴ります。良い方法として、DOMアイテムの配列を作成して、DOMメソッドの実行を1つ追加することで、DOM操作アクションを最小限に抑える必要があります。この方法を試してください。

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

関連する問題