2

Lithium と mongoDB を使用して、初めてのコミュニティ ページを作成しています。私は mongo のスキーマを使用しない方法が本当に気に入っていますが、スキーマがないと作業できないという問題が 1 つあります。

たとえば、次のような単純なフォームがあります。

<?=$this->form->create();?>
<?=$this->form->field('name',array('label' => 'Topic title'));?>
<?=$this->form->field('text',array('label' => 'Content'));?>
<?=$this->form->submit('create');?>

これにより、さらに簡単に保存できます:

if($this->request->is('post')) {
    $board_post = BoardPosts::create($this->request->data);
    $board_post->save();
}

今では、誰もが Firebug や Developer Tools などを使用した DOM 操作によっていくつかのフォーム入力を追加することが可能です。もちろん、それはデータベース内の無意味なフィールドである可能性がありますが、実際に使用されるフィールドを誰かが追加する可能性があります。これを防ぐ唯一の方法は、モデルにスキーマを作成することです。しかし、私にとっては、スキーマのないデータベースという考え全体が役に立たなくなりますよね? また、いくつかのフィールドが発生してはならない場合、さまざまな状況/アクションのスキーマを作成する方法は?

4

1 に答える 1

4

このメソッドは、オプションでパラメーターをModel::save()受け入れます。http://li3.me/docs/lithium/data/Model::save()'whitelist'を参照してください

$whitelist = array(
    'title',
    'text'
);
$post = BoardPosts::create();
$post->save($this->request->data, compact('whitelist')); 

protected $_schemaモデルでprotected $_meta = array('locked' => true);定義して、スキーマで定義されたフィールドにホワイトリストを自動的に設定するように設定することもできます。ただし、説明したような攻撃を避けるために、コントローラーでホワイトリストを定義することをお勧めします。

この問題は一括割り当ての脆弱性と呼ばれ、開発者が注意しないと多くのフレームワークに存在します。

于 2012-10-14T14:02:55.777 に答える