0

ここの 3dgoo からの多大な支援により、Silverstripe に機密データを格納するために 、この Dataobject を作成して ClientPasswords を格納することができました -> http://www.sspaste.com/paste/show/5257a5ccdf990

問題は、getCMSFieldsでフィールドを作成した後、de/and 暗号化が機能しなくなり、パスワードがデータベースにプレーンテキストとして保存されることです:/

誰かがそれを修正するのを手伝ってくれますか? バグはどこですか?

4

1 に答える 1

1

あなたがイデオロギー的なものと呼ばなければ、あなたには何もないので、そこにバグ自体を見つけることはできません。

テキストフィールドを使用する場合、実際にはパスワードをハッシュ化されたバージョンに書き換えることはありません。

これは、db 要素の実際のフィールドに関連しています。

new TextField('Password', _t('Dict.PASSWORD', 'Password'))

したがって、暗号化または復号化を特徴とする書き込みまたは読み取りをキャッチしていません。

それを機能させる1つの方法は、テキストフィールドをdbリレーションではないカスタムゲッター/セッターに直接バインドしてから、実際のdbフィールドを取得および設定することです。

そのサンプルは次のとおりです。

1)このようにフィールドを追加します

$fields->addFieldToTab("Root.Main", new TextField('CusotomgetterSetter', "Set the password")

2) クラスへのセッターを作成します。

public function setCusotomgetterSetter($value){
    if(!$this->Salt){
        $this->Salt = uniqid(mt_rand());
    }
    $test = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->Salt), $value, MCRYPT_MODE_CBC, md5(md5($this->Salt))));
    $this->Password = $test;
}

public function getCusotomgetterSetter(){
    return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->Salt), base64_decode($this->Password), MCRYPT_MODE_CBC, md5(md5($this->Salt))), "\0");
}

3) データベースに新しいソルト フィールドを追加します。忘れずに /dev/build を実行してください。

static $db = array (
    'Type' => 'Text', 
    'Username' => 'Text', 
    'Password' => 'Text',
    'URL' => 'Text',
    'Webadmin' => 'Text',
    'Editable' => 'Text',
"Salt" => "Text"
);

ここで作成したソルトを使用するように get フィールドと set フィールドを修正しました。メンバーで見つかったものではありません。その時点で実際にはメンバー関係がない可能性があるため、$this->Member() が null である可能性があります。

「動作する」サンプルhttp://www.sspaste.com/paste/show/5257f7743cf0b

于 2013-10-11T07:48:40.280 に答える