0

私のケーキPHPアプリケーションには、「メール」フィールドが読み取り専用の編集フォームがあり、ユーザーはそれを更新できません。セキュリティの観点から考えると、ユーザーは「firebug」または他のブラウザプラグインでフィールドを更新できます。

$this->User->save($this->data)更新データの保存に使用しています。この機能によりメールの更新も可能です。

ここで引数などを渡すなどして、このフィールドが更新されるのを防ぐことができるように、cake php に何か方法はありますか?

4

4 に答える 4

3

$this->dataからメールフィールドを削除するだけです。

unset($this->data['User']['email']);
$this->User->save($this->data);
于 2012-08-29T12:18:35.207 に答える
1

次のようなことができます:

$dontUpdateField = array('email');
$this->Model->save(
           $this->data, 
           true, 
           array_diff(array_keys($this->Model->schema()),$dontUpdateField)
);
于 2012-08-29T12:15:05.433 に答える
1

セキュリティが懸念される場合は、予期しない値を持つデータを拒否してください。ケーキではこれを行うことができますが、任意のフレームワーク/cms に適応させることができます

/**
 * Checks input array against array of expected values.
 *
 * Checks single dimension input array against array of expected values.
 * For best results put this is in app_controller.
 *
 * @param array $data - 1 dimensional array of values received from untrusted source
 * @param array $expected - list of expected fields
 * @return boolean - true if all fields are expected, false if any field is unexpected.
 */
protected function _checkInput($data,$expected){
  foreach(array_keys($data) as $key){
    if (!in_array($key,$expected)){
     return;
    }
  }
  return true;
}

/** 
 * edit method.
 * 
 * put this in <Model>_controller
 * @param string $id
 * @return void
 * @todo create errors controller to handle incorrect requests
 * @todo configure htaccess and Config/routes.php to redirect errors to errors controller
 * @todo setup log functionality to record hack attempts
 * @todo populate $expected with fields relevant to current model
 */ 
function edit($id=null){
  $expected = ('expectedVal1', 'expectedVal2');
  $this->Model->id = $id;
  if (!$this->Model->exists()) {
    throw new NotFoundException(__('Invalid model'));
  }
  if ($this->request->is('post')) {
    if (!$this->_checkData($this->request->data['Model'], $expected)) {
      //log the ip address and time
      //redirect to somewhere safe
      $this->redirect(array('controller'=>'errors','action'=>'view', 405);
    }
    if ($this->Model->save($this->request->data)) {
      //do post save routines
      //redirect as necessary
    }
    else {
      $this->Session->setFlash(__('The model could not be saved. Please, try again.'));
    }
  }
  $this->set('model',$this->Model->read($expected,$id));
}
于 2012-08-31T09:28:36.310 に答える
0

セキュリティ コンポーネントを使用して、電子メールを非表示にすることができます。このコンポーネントを使用している間、隠しフィールドを変更することはできません。そうしないと、ケーキがフォームをブラックホール化します。

http://book.cakephp.org/1.3/en/view/1296/Security-Component

アプリケーションが公開されている場合は、セキュリティを使用することを強くお勧めします。それ以外の場合は、フォームに追加のフィールドを送信してモデルにデータを挿入するのは簡単です。$this->Model->save($this->data))検証の追加作業を行わない限り、追加のフィールドは保存されます。 $this->data のすべてのフィールド。

于 2012-08-30T20:18:25.187 に答える