2011-12-22 17 views
1

PHPとJqueryを使用するCodeigniterで書いたコメントスクリプトがあります。JQueryとCodeIgniterを使用して安全にDBにコメントを付けるには?

基本的には、ユーザーがコメントを書き込んだ後に送信します。次に、AJAXを使用してサーバーサイドスクリプトを呼び出して、コメントを確認、検証、挿入します。

私はCodeIgniterのを使用していますので、私はバインディング

以下のようなCodeIgniterのから提供を使用して、コメントをエスケープしています言うようにはJQueryの終わりに、私は、PHPの終わりに encodeURIComponent

$.ajax({ 
    url : 'http://domain.com/ajax/post_comment', 
    type : 'post', 
    data : encodeURIComponent($(this).val()), 
    success : function(data){ 
       //more code here 
      } 
}); 

を使用してエスケープしています

$sql = "INSERT INTO video_comments VALUES(NULL, ?); 
$this->db->query($sql,array($comment)); 

これはかなりうまく機能して脱出して挿入することができます

!"£$%^&*()_+=-}{[email protected]:?></.,#;][¬`| 

問題は、'(一重引用符)または\(バックスラッシュ)を挿入できないことです。それは彼らが適切に逃げていないので、私は推測する?

単引用符をエスケープすると思われる\'を挿入することができるかもしれません。しかし、私はCodeIgnitersバインディングがそれを世話するだろうと思っていたでしょうか?

アイデア?

+1

をあなた 'のvar_dump($コメント)'場合は、それを送信する前に、AJAXポストから値を取得した後、 DB、問題が*どこにあるかを知ることができます。あなたはそれがエスケープされていることを確認するために手動で文字列を挿入しようとしましたか?なぜあなたは 'encodeURIComponent'を使っていますか? –

答えて

1

まず、encodeURIComponentでは使用しないでください。それはそれを意図したものではありません。 編集:ここでは、その呼び出しが実際に何を話しているかについてのリンクがあります。When are you supposed to use escape instead of encodeURI/encodeURIComponent?

第2に、PHPコードのどこにエスケープしているのかわかりません。 CodeIgniterでは、escape_strのように、エスケープ機能が組み込まれています:ここ

$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')"; 

さらに詳しい情報: http://codeigniter.com/user_guide/database/queries.html

+0

これは動作しますが、それは私が避けたかったスラッシュを追加します。これを避けることはできますか?または、 '\ 'のようにエスケープされた文字を出力するにはどうすればいいですか? –

+0

私は' stripslashes'を使用しているとは限りません。 –

+2

@EricBrandelクエリバインディングは既にエスケープしています。ありがとうございます。あなたがリンクしたページに書かれています。これはescape_str()メソッドを超えた数行です。 –

4

更新:以下の説明に従って、クエリバインディングはクエリ自体を安全にするため、エスケープ関数を個別に使用する必要はありません。

IMHO、あなたはあまりにも(あまりにも多くの)パフォーマンスが心配されていない場合は、CodeIgniterアクティブレコードクラスを使用することです。 IMOでは、アクティブレコードを無効にするとわずかなパフォーマンスの改善がありますが、有効にして使用すると多くのメリットがあります。

http://codeigniter.com/user_guide/database/active_record.html

+0

これは正しい答えです。個人的にはアクティブなレコードでは十分な柔軟性が得られないと感じています –

+0

アクティブレコードは素晴らしいですが、ARはクエリバインディング/プレースホルダを使用するよりも "安全"です。 –

+0

@SeanHJenkinsアクティブレコードがサブクエリのように機能しない場合は、必要に応じて適切なサニタイズを使用してプレーンなクエリを使用できますが、上記のアクティブレコードが良い方法です。 – Usman

関連する問題