• ベストアンサー

Struts の Validator について

Struts1.2.7 を使用しています。 Validator の mask を使用して下記のようなことはできますか? 正規表現に一致しない場合にエラーを返すのではなく。 正規表現に一致する場合にエラーを返すようにしたい! != みたいな感じです。 具体的にいうとクォーテーションやセミコロン等、 SQLに依存する記号を入力できないようにしたいのですが・・・ あるいは、 SQLインジェクション対策としてより一般的な方法があれば、 その方法を教えてもらえると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

使ってみればわかると思いますが・・・、 PreparedStatementは「’」をエスケープします。 変換後のSQLを見てみてください・・・。

ssm3u
質問者

お礼

ありがとうございました。無事解決しました。 シングルクォーテーションが正しくエスケープされているようですので、 Validatorでシングルクォーテーションをエラーにするのはやめます。 SQLインジェクション対策としては完璧ではないかもしれませんが、 そのあたりの対策はDBまわりの調整等、別の視点で調整します。 ありがとうございました。

ssm3u
質問者

補足

ありがとうございます。 PreparedStatementの記述方法はわかったつもりだったのですが、 結局うまくいきません・・・・すいませんが下記どこがおかしいかわかりますか? 「テーブルA」の構造 列1 smallint 列2 character(50) 列3 date String sql_s = "insert into テーブルA values(?,?,?);"; Pstmt = conn.prepareStatement(sql_s); Pstmt.setShort(1,Short.parseShort(this.snumber)); Pstmt.setString(2,this.title); Pstmt.setDate(3,java.sql.Date.valueOf(this.e_date)); int up_cnt = Pstmt.executeUpdate();  ←ここで実行時エラー PstmtがPreparedStatementで、conn は Connection、 this.snumber, this.title, this.e_date は String です。 (null値だったり、型が違ったりはしていません。) 変換後のSQLは Pstmt.toString()で見れると思ったのですが、 これも違うみたいですね・・・

その他の回答 (3)

回答No.4

さすがにそれだけでは・・・。 1.変数の中身がおかしい・・・。 2.SQL文(カラム数、位置)がおかしい・・・。 情報が少なすぎです。

ssm3u
質問者

お礼

ごめんなさい。 いろいろ試した結果無事動くこと確認できました。 setNull()の理解不足だったようです。

noname#14768
noname#14768
回答No.2

正規表現で一致が表現できれば、その逆もできますよね? SQLインジェクション対策としては、 PreparedStatementを利用するのが一般的です。

ssm3u
質問者

お礼

確認してみたところPreparedStatementで大丈夫みたいですね。 杞憂に終わりました。JDBCの理解不足です。。。勉強します。 SQLインジェクション対策はできたみたいですが、 やはりシングルクォーテーションを無害化してDBに反映するとかはやってくれないのですね。 皆様はシングルクォーテーション入力時にはどのような処理をしていますか? PreparedStatementの利用だけでよいのでしょうか?

ssm3u
質問者

補足

DBには、PostgreSQL8.0 を使用しています。 文字列をシングルクォーテーションで囲む必要があります。 PreparedStatementを利用した場合は、下記のような記述がうまくいかないと思っています。 insert into tebles values(?, ?, ?, ?); そのため文字列を含むSQL文には、PreparedStatementではなく、 普通のStatementを使用していたのですが・・・? 私の理解不足であり、 この場合もPreparedStatementでも記述できますか?

回答No.1

maskを使ってやるなら、結局ゴリゴリ書けばできるかと・・・。 それより、FieldChecksを継承して、独自メソッド作った方がいいのでは? 拡張する方が楽かと・・・。

ssm3u
質問者

補足

バリデーションの自作はやったことが無いのですが・・・ ちょっと頑張ってみます。 FieldChecksのvaridateMask()の理解から始めてみます。

関連するQ&A