sql >> Database teknologi >  >> RDS >> Mysql

Gem følsomme data i Silverstripe 3.1

Hvad du kan gøre er at oprette en Password DataObject med Member objekt, der har et et til mange forhold til Password objekt. Du kan bruge saltet af det loggede medlem med en 2-vejs php-krypteringsfunktion til at kryptere og dekryptere en adgangskode.

Dette eksempelkode bruger php mcrypt med medlemmet salt til at kryptere og dekryptere adgangskoden.

Adgangskodeklassen har en beskrivelse, en url, brugernavn og adgangskode. Den indeholder en funktion til at kryptere en given streng ved hjælp af en given nøgle. Den indeholder også en dekrypteringsfunktion til at dekryptere den lagrede adgangskode ved hjælp af det tilsluttede medlemssalt.

Adgangskodeklasse

<?php
class Password extends DataObject
{
    static $db = array (
        'Description' => 'Text', 
        'URL' => 'Text', 
        'Username' => 'Text', 
        'Password' => 'Text'
    );

    static $has_one = array (
        'Member' => 'Member'
    );

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

    public function encryptPassword($key, $password) {
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $password, MCRYPT_MODE_CBC, md5(md5($key))));
    }

}

Vi er nødt til at udvide Member-objektet til at have et has_many-forhold til Password-objektet:

MemberPasswordListExtension

<?php
class MemberPasswordListExtension extends DataExtension {

    private static $has_many = array(
        'Passwords' => 'Password'
    );
}

Dette er nødvendigt i din konfiguration for at tilføje udvidelsen:

_config.php

...
Member::add_extension('Member', 'MemberPasswordListExtension');
...

Følgende er en formular til at tilføje en adgangskode. Ved indsendelse krypterer vi adgangskoden ved hjælp af medlemssaltet og krypteringsfunktionen fra Password-klassen.

Page_Controller

...

public function AddPasswordForm() {
    // Create fields
    $fields = new FieldList(
        new TextField('Description'),
        new TextField('URL'),
        new TextField('Username'),
        new TextField('Password')
    );

    // Create actions
    $actions = new FieldList(
        new FormAction('AddPassword', 'Submit')
    );

    return new Form($this, 'AddPasswordForm', $fields, $actions);
}

public function AddPassword($data, $form) {
    if($member = Member::currentUser()) {
        $password = new Password();
        $form->saveInto($password);
        $password->MemberID = $member->ID;
        $password->Password = $password->encryptPassword($member->Salt, $password->Password);
        $password->write();
    }
    return $this->redirectBack();
}

...

I sideskabelonen kalder vi formularen og gennemgår de adgangskoder, der er gemt under denne bruger. Vi viser brugernavnet, den krypterede adgangskode og den dekrypterede adgangskode, bare for at vise os, at dette har virket:

Page.ss-skabelon

...

<% if $CurrentMember %>
$AddPasswordForm
<% end_if %>

<% with $CurrentMember %>
<h3>Passwords</h3>
<% if $Passwords %>
<ul>
<% loop $Passwords %>
    <li>$Username $Password $DecryptedPassword</li>
<% end_loop %>
</ul>
<% else %>
<p>No passwords saved</p>
<% end_if %>
<% end_with %>

...

Dette bør give dig en base for, hvad du vil gøre, og du bør være i stand til at ændre det til dine behov.

Krypteringsmetoden blev taget fra dette stackoverflow-svar:Simpelste to-vejs kryptering ved hjælp af PHP

Du kan nemt erstatte en anden kryptering/dekrypteringsmetode med resten af ​​denne kode, som du ønsker.



  1. PDO sløjfe igennem og udskrive fetchAll

  2. Få alle poster fra MySQL-databasen, der er inden for Google Maps .getBounds?

  3. SQL Cross Join

  4. MySQL vælg alle rækker fra sidste måned indtil (nu() - 1 måned), til sammenligningsformål