- ベストアンサー
Struts の Validator について
Struts1.2.7 を使用しています。 Validator の mask を使用して下記のようなことはできますか? 正規表現に一致しない場合にエラーを返すのではなく。 正規表現に一致する場合にエラーを返すようにしたい! != みたいな感じです。 具体的にいうとクォーテーションやセミコロン等、 SQLに依存する記号を入力できないようにしたいのですが・・・ あるいは、 SQLインジェクション対策としてより一般的な方法があれば、 その方法を教えてもらえると助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
使ってみればわかると思いますが・・・、 PreparedStatementは「’」をエスケープします。 変換後のSQLを見てみてください・・・。
その他の回答 (3)
- taka451213
- ベストアンサー率47% (436/922)
さすがにそれだけでは・・・。 1.変数の中身がおかしい・・・。 2.SQL文(カラム数、位置)がおかしい・・・。 情報が少なすぎです。
お礼
ごめんなさい。 いろいろ試した結果無事動くこと確認できました。 setNull()の理解不足だったようです。
正規表現で一致が表現できれば、その逆もできますよね? SQLインジェクション対策としては、 PreparedStatementを利用するのが一般的です。
お礼
確認してみたところPreparedStatementで大丈夫みたいですね。 杞憂に終わりました。JDBCの理解不足です。。。勉強します。 SQLインジェクション対策はできたみたいですが、 やはりシングルクォーテーションを無害化してDBに反映するとかはやってくれないのですね。 皆様はシングルクォーテーション入力時にはどのような処理をしていますか? PreparedStatementの利用だけでよいのでしょうか?
補足
DBには、PostgreSQL8.0 を使用しています。 文字列をシングルクォーテーションで囲む必要があります。 PreparedStatementを利用した場合は、下記のような記述がうまくいかないと思っています。 insert into tebles values(?, ?, ?, ?); そのため文字列を含むSQL文には、PreparedStatementではなく、 普通のStatementを使用していたのですが・・・? 私の理解不足であり、 この場合もPreparedStatementでも記述できますか?
- taka451213
- ベストアンサー率47% (436/922)
maskを使ってやるなら、結局ゴリゴリ書けばできるかと・・・。 それより、FieldChecksを継承して、独自メソッド作った方がいいのでは? 拡張する方が楽かと・・・。
補足
バリデーションの自作はやったことが無いのですが・・・ ちょっと頑張ってみます。 FieldChecksのvaridateMask()の理解から始めてみます。
お礼
ありがとうございました。無事解決しました。 シングルクォーテーションが正しくエスケープされているようですので、 Validatorでシングルクォーテーションをエラーにするのはやめます。 SQLインジェクション対策としては完璧ではないかもしれませんが、 そのあたりの対策はDBまわりの調整等、別の視点で調整します。 ありがとうございました。
補足
ありがとうございます。 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()で見れると思ったのですが、 これも違うみたいですね・・・