コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

意図しないパラメータ

SAStrutsだと出力データもActionのフィールドとして定義するんだけど、そのデータの初期値をリクエストパラメータで設定できるっていうことになると思うんだけど・・

ユースケース単位でActionを用意するんであれば、意図しないパラメータがセットされてうんこーとかなる可能性もありそう。

これってどうなん? - ぱる日記

S2の管理下にあるクラス内であればBindingアノテーションを使って取得するこ
とができるので、Bindingアノテーションを使ってprivateにしておけばよいかと
思います。

> public class HogeAction {
@Binding
  private JdbcManager jdbcManager;
^^^^^^
>
> public String index(){
> ・・・
> }
> }

ページ上に表示するもの以外をpublicにしておくと今回のように外から叩けたり
してしまうので上記の形で対応されるのが良いかと思います。この形ならsetter
を書く必要もないですし。

http://ml.seasar.org/archives/seasar-user/2008-June/014752.html

ソース中に、

public JdbcManager jdbcManger;

と書いた場合には、URLに

/hoge/?jdbcManager=1

と手で入力すると、予期せぬインジェクションが発生すると言う話。
例では、JdbcMangerだけですが、ユースケース単位にアクションを作成すれば特定のアクションで使用しないフィールドに変な値を入れられかねないと言うこと。
確かに、その通りで作りによっては問題が起こりえます。
これは、結構初期の段階で気づいていて私は以下の方針で対応しています。

  • FormはDtoを作成しActionのクラスに入れない。Formの項目以外は、Actionのクラスに置くことで不要な値を入れられることがなくなります。
  • Formはリクエストスコープだけにする。あるActionで必要なFormデータは、通常Validator等で入力チェックするため、不正な値が入ることはありえません(不具合はしらない)。また、Formは全てString型で定義するのがStrutsの場合には(たぶん)普通なので、あるActionで使用しないフィールドに不正なデータが入っても例外が発生することもなく、スルー(リクエストなので消えるし)されるだけなので問題がありません。

なので、あまり意識しなくてもいいかなと考えています。