.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
14 人のユーザが現在オンラインです。 (13 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 14

もっと...

.
.リンク集

メイン
   helper,component,script
     hidden値=0の時の、Securityコンポーネントチェック
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
crays
投稿日時: 2008-6-23 17:00
Baker スタート
登録日: 2008-5-7
居住地: 大阪
投稿: 20
hidden値=0の時の、Securityコンポーネントチェック
こんにちわ。
現在、RC1にて製造を行っています。

とあるフォームにて以下のようなhidden値を出力しました。

<?php
echo $form->input(
    
'dummy'
  
, array('type'=>'hidden''value'=>'0')
);
?>



このフォームはSecurityコンポーネントにおけるチェックを行います。

つまり、以下のようなフォームでPOSTされます。

<?php
<form action="/sample/add/" method="post">
  <
input type="hidden" name="_method" value="POST" />
  <
input type="hidden" name="data[__Token][key]" value="***">
  <
input type="hidden" name="data[_form][dummy]" value="0">
  <
input type="hidden" name="data[__Token][fields]" value="***">
</
form>
?>



しかし、このPOSTリクエストはセキュリティーチェックエラーとなります。

原因を調べていくと、フォーム内data[__Token][fields]値とセキュリティコンポーネントが生成したfields値が異なっていた為と判明しました。
両者のfields値は項目のhash値なのですが、フォーム出力時のhash化対象配列が

<?php
Array(
  [
_form] => Array
    (
      [
dummy] => 0
    
)
)
?>


なのに対し、セキュリティコンポーネントでは

<?php
Array(
  [
_form] => Array
    (
      [
dummy] => 0
    
)
  [
form] => Array
    (
      [
0] => dumm
    
)
)
?>


だったからです。
(hiddenに0以外の値を入れると問題ありません)

みなさん、hiddenに0は入れないのでしょうか?
それとも、私の使い方に間違いがあるのでしょうか?

宜しくお願いします。
pikapika
投稿日時: 2008-7-7 9:25
Baker ユーザ
登録日: 2008-4-20
居住地:
投稿: 33
Re: hidden値=0の時の、Securityコンポーネントチェック
当方も同じところでつまっております。
その後、解決方法は見いだせましたでしょうか?
よろしくお願いします。
crays
投稿日時: 2008-7-7 10:15
Baker スタート
登録日: 2008-5-7
居住地: 大阪
投稿: 20
Re: hidden値=0の時の、Securityコンポーネントチェック
改善策が見当たらなかった為、以下のようにしました。
参考までに手法を載せておきます。

・hiddenに入れるはずの値一式をSessionに保持。
・Sessionに保持した値のhash値をhiddenに出力。
・FormからのPOSTリクエストを受け取るコントローラでSessionに保持した値のHash値とPOSTリクエストのHash値が一致するか判定。
・一致したら、Sessionに存在する値を使用していく。

ご参考になればと思います。
また、別の手法を考えられて方がいましたら、投稿願えたらと思います。
shun
投稿日時: 2008-7-7 22:46
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
Re: hidden値=0の時の、Securityコンポーネントチェック
こちらでも確認できました。
チケットか、テストケースを書いたほうがよいと思いますが、書けますか?

views/add.ctp

<?php
echo $form->input('dummy2',array('type'=>'hidden''value'=>1)); //failed
echo $form->input('nanika',array('type'=>'hidden''value'=>0)); //failed

echo $form->input('dummy',array('type'=>'hidden''value'=>"00")); //OK
echo $form->input('dummy2',array('type'=>'hidden''value'=>"6")); //OK

//上書きするとOK.
echo $form->input('dummy2',array('type'=>'hidden''value'=>1));
echo 
$form->input('dummy2',array('type'=>'hidden''value'=>" ")); //OK
?>



posts_controller.php

<?php
class PostsController extends AppController {

    var 
$name 'Posts';
    var 
$helpers = array('Html''Form');
    var 
$components = array('Security');

    function 
beforeFilter(){
        
$this->Security->requirePost('add2');
    }

    function 
add2(){
        
$this->Post->create();
        if (
$this->Post->save($this->data)) {
            
$this->Session->setFlash(__('The Post has been saved'true));
            
$this->redirect(array('action'=>'index'));
        } else {
            
$this->Session->setFlash(__('The Post could not be saved. Please, try again.'true));
        }
    }

    function 
add() {
        if (!empty(
$this->data)) {
            
$this->setAction("add2");
        }
    }
?>



shun
投稿日時: 2008-7-7 23:12
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
Re: hidden値=0の時の、Securityコンポーネントチェック
Securityコンポーネントの __validatePost() と、 Formヘルパーの secure() を比較すると答えが出そうです。
(また明日。)
crays
投稿日時: 2008-7-8 0:10
Baker スタート
登録日: 2008-5-7
居住地: 大阪
投稿: 20
Re: hidden値=0の時の、Securityコンポーネントチェック
shun様、返答をいただきありがとう御座います。

早速ではありましたが、本家のtracにてBUGチケットを切ってきました。
英語は苦手で、本当ならshun様にお願いしようかとも思いましたが、「何事も勉強」の気持ちで登録してきました。

https://trac.cakephp.org/ticket/5061#preview
shun
投稿日時: 2008-7-8 17:05
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
Re: hidden値=0の時の、Securityコンポーネントチェック
Ticketありがとうございました。
とりあえずは、value="0" になるときには、value="" としてしまう、などで逃げ切れるでしょうか。
pikapika
投稿日時: 2008-7-24 14:58
Baker ユーザ
登録日: 2008-4-20
居住地:
投稿: 33
Re: hidden値=0の時の、Securityコンポーネントチェック
複数選択可能なチェックボックスやリストメニューで、なにも選択しなかった場合も、同様の現象が起こりました。
やはり原因は
$formと$checkが一致しないことのようです。

セキュリティコンポーネントまわりは、まだまだバグが多いですね・・・
dododo
投稿日時: 2008-7-26 22:52
Baker スタート
登録日: 2008-5-14
居住地:
投稿: 13
Re: hidden値=0の時の、Securityコンポーネントチェック
私の場合は、次のような複数チェックボックスで、何かひとつでも選択するとエラーになってしまいました。

<input type="hidden" name="data[_User][prefecture]" value="" />
<div class="checkbox"><input type="checkbox" name="data[User][prefecture][]" value="1" id="UserPrefecture1" /><label for="UserPrefecture1">北海道</label></div>
<div class="checkbox"><input type="checkbox" name="data[User][prefecture][]" value="2" id="UserPrefecture2" /><label for="UserPrefecture2">青森県</label></div>
<div class="checkbox"><input type="checkbox" name="data[User][prefecture][]" value="3" id="UserPrefecture3" /><label for="UserPrefecture3">岩手県</label></div>
....

最新版(公式リリースでない)でも同様でした。仕様なのでしょうか?

私には解決できません;

shunさん、あとはお任せします・・・w
crays
投稿日時: 2008-8-10 23:50
Baker スタート
登録日: 2008-5-7
居住地: 大阪
投稿: 20
Re: hidden値=0の時の、Securityコンポーネントチェック
その後、修正パッチが公開されましたので報告します。
公式パッチなのか否かは僕には分かりませんのでご了承ください。

https://trac.cakephp.org/ticket/5061
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .