2016-11-18 42 views
-2

基本的に私はString str="That's an apple and that's not an apple, hah. Not funny."です。参考:文字列はランダムで、任意のUnicode文字を含むことができます。私は\の前にすべてを追加する必要があります' & "私は行の値として私のmysqlのdbに保存することができます。もしあなたがそうであれば、他のキャラクターが私に\を加えるのに必要なものを教えてください。javaを使用してmysqlの文字列として引用符を保存する方法は?

誰でも私に\を追加する方法を教えてもらうと本当にありがたいです。' & "です。勧告に基づいて


あなたは私がこれを行うに来て起こる与えた:

public String UpdateDBQuery(String query, int hm) throws IOException{ 
    try { 
     DBConnect mysql_DB = new DBConnect(); 
     PreparedStatement ps = con.prepareStatement(query); 
     for(int i=0;i<hm;i++){ 
      ps.setString(i, query); 
     } 

     int ursa = ps.executeUpdate(query); 
     if (ursa == 0) { 
      throw new SQLException("Creating user failed, no rows affected."); 
     } else { 
      return "succeed"; 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

そして、私が呼び出していたクエリ:

mysql.UpdateDBQuery("UPDATE tb1 SET ste='"+str1+"' WHERE pd='"+pd+"'", 1); 

そして

mysql.UpdateDBQuery("INSERT INTO list(str, str1, str2, str3, str4, str5) VALUES ('"+str+"', '"+str1+"', '"+str2+"', '"+str3+"', '"+str4+"','stackdefaultimage.png')", 6); 

しかし、私は例外を取得しています

java.sql.SQLException:パラメータインデックスが範囲外です(0 <)。

+2

"私はそれをカラム値として自分のmysqlデータベースに保存することができます" - あなたはSQL文に値を埋め込むように思えます。 **これをしないでください。**代わりにパラメータ化されたSQLを使用して、パラメータの値を元の文字列として設定します。これはより簡単で信頼性が高く、SQLインジェクション攻撃を避ける最良の方法です。 –

+1

なぜそれをしないのか、そして何をする代わりにどうすればいいのですか?http://bobby-tables.com –

+0

@JonSkeet申し訳ありませんが、私は行の価値を意味していました。私は直接mysqlの出力結果をクライアントに送信しません。mysqlから必要なデータを取得してクライアントに送信しています。例外が発生した場合、何かに返信しています。私はそれがmysqlの注射の権利からperventかもしれないと思いますか? –

答えて

1

私はので、私はそれが列の値としての私のMySQL DBに保存することができるすべての' & "\を追加する必要があります。

いいえ、そうする必要はありません。代わりに、パラメータ化された文(PreparedStatementなど)を使用する必要があります。 '"をエスケープするだけで、コードをSQLインジェクションだけでなく悪意のあるエラーにさらすことができます。代わりに

PreparedStatement ps = connection.prepareStatement("INSERT INTO Table (Column) VALUES (?)"); 
ps.setString(1, yourString); 
ps.executeUpdate(); 

...または類似。 ?をプレースホルダとして使用することに注意してください。プレースホルダの値を設定するときは、期待通りに0ではなく1で開始します。

ここ

より:http://bobby-tables.com/


あなたには、いくつかの理由(SQLの文字列を準備中とは関係ありません)のために\'\"を持つすべての"を持つすべての'を交換するために必要な場合、あなたは可能性がありreplaceAllで行う:

str = str.replaceAll("([\"'])", "\\\\$1"); 

b ut SQLの値を前処理することはしないでください。置換正規表現内の()はキャプチャグループを作成し、$1はその置換グループ内の値を使用します。置換文字列にバックスラッシュを挿入するには、文字列リテラルを置換文字列でエスケープする必要があるため、ダブルエスケープする必要があります(そうしないと、$をエスケープし、グループ置換を防ぎます)。

再度:Do notこれは、SQL文の値を準備するためのものです。 PreparedStatementなどを使用してください。

+0

返事をいただきありがとうございます、私はあなたに言ったことがありますが、私はあなたの質問で更新を読むことができます例外が発生しています。 –

+0

@mrjorden:もっと慎重に読んでください。答え:* "そして、プレースホルダの値を設定するときは、期待通りに0ではなく1で始まることに注意してください。"# –

+0

@mrjorden:そして、文字列を個別に渡す必要があります。クエリ文字列。あなたのコードがしようとしているのは、すべてのパラメータに同じ文字列を使用することです。 –

関連する問題