J'ai quelques temps morts et je pense à choisir un nouveau projet pour le plaisir. Je suis un étudiant et chaque année nous avons un concours de pitch en ligne. Je veux créer un projet pour ce concours de pitch qui aura lieu dans environ 9 mois. Le problème est que le projet nécessite une très haute sécurité et que la concurrence est très compétitive.Sécurité HIPAA ePHI Encryption
choses que je dois être en mesure de le faire: 1. magasin HIPAA ou ePHI (.pdf | .gif | .jpg | .doc) 2. Contrôle d'accès fort 3. Soutenir le grand nombre d'utilisateurs et les fichiers (1 million +) 4. Rapports d'audit complet (oh Ephi vous êtes une telle douleur) 5. le cryptage
Solutions proposées
0) Placez l'application Web sur un sever dédié sécurisé derrière un pare-feu
1 Stocker les fichiers dans un fichier nommé "secure_files /", puis utiliser mod_rewrite pour restreindre l'accès à ce l'irectory.
Quelque chose sur les lignes de:
#Removes access to the secure_files folder by users.
RewriteCond %{REQUEST_URI} ^secure_files.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
Ensuite, utilisez un script php pour ouvrir les fichiers si l'utilisateur dispose des droits pour le faire. Alors Pourrais-je simplement utiliser:
------
-SQL
------
------
- create files table
-----
CREATE TABLE `files` (
id INT NOT NULL AUTO_INCREMENT,
file_name VARCHAR(50) NOT NULL,
PRIMARY KEY('id')
);
------
- create files table
-----
CREATE TABLE `privileges` (
uesr_id INT NOT NULL,
file_id INT NOT NULL,
);
------
- create users table
-----
CREATE TABLE `users` (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
email VARCHAR(50) NOT NULL,
password CHAR(40) NOT NULL,
PRIMARY KEY('id')
);
<?php
public function get_user_files($filename)
{
//this is set during login
$user_id = $this->session->userdata('user_id');
//check to see if the user has privileges to access the file and gets the file name
$query = $this->db->join('privileges','privileges.id = files.id')
->select('files.file_name')
->where('privileges.user_id',$user_id)
->where('files.file_name',$file_name)
->limit(1)
->get('files');
$file = $query->row()->files.file_name;
if($file)
{
//user has privileges to access the file so include it
$handle = fopen($file, "rb");
$data['file'] = fread($handle, filesize($file));
fclose($handle);
}
$this->load->view('files',$data);
}
?>
2) Utiliser la classe sessions CI pour ajouter un "utilisateur" à la session.
Le contrôleur vérifie pour voir si la session est défini:
<?php
public function __construct()
{
parent::__construct();
if($this->secure(array('userType' => 'user')) == FALSE)
{
$this->session->set_flashdata('flashError', 'You must be logged into a valid user account to access this section.');
$this->session->sess_destroy();
redirect('login');
}
}
function secure($options = array())
{
$userType = $this->session->userdata('userType');
if(is_array($options['userType']))
{
foreach($options['userType'] as $optionUserType)
{
if($optionUserType == $userType) return true;
}
}
else
{
if($userType == $options['userType']) return true;
}
return false;
}
?>
3) Faire tourner la ronde entre plusieurs Severs Web. Je n'ai jamais fait ça alors je n'ai aucune idée de comment faire ça. Je n'ai aucune idée de la façon de traiter les multiples serveurs de bases de données. Des idées/suggestions?
4) Utilisez l'audit de base de données Oracle Enterprise Standard. J'aimerais pouvoir utiliser MySQL, mais je ne trouve aucun support d'audit. Je pourrais utiliser MySQL et utiliser PITA. Quelqu'un at-il utilisé l'architecture PITA (point-in-time) avec MySQL? peux-tu partager ton expérience?
5) Donc, évidemment, je peux hacher les mots de passe avec un hash salé à sens unique. Mais dois-je tout crypter? Aussi, je ne vois pas comment AES_ENCRYPT (str, key_str) améliore la sécurité du tout. Je suppose que cela pourrait empêcher un administrateur de regarder une base de données? Est-ce que je peux/dois-je tout chiffrer dans le dossier "secure_files /"? Pourrais-je simplement utiliser le cryptage de disque complet comme BitLocker?
Fondamentalement, puis-je obtenir une sécurité bancaire en ligne avec php et CI? Pouvez-vous faire d'autres suggestions en plus de l'inutile "votre idiot va payer un expert parce que vous ne savez rien" des suggestions?
Merci d'avoir pris le temps de lire ceci.
adopté de Redux Auth
En ce qui concerne hachage à sens unique. Mon erreur pour dire cryptage.Je fais habituellement le faire quelque chose de semblable à:
salt_length = '9'; } hachage de fonction publique ($ password = false) { $ salt_length = $ this-> salt_length; if ($ password === false) { return false; } $ salt = $ this-> salt(); $ password = $ salt. substr (hash ('sha256', $ salt. $ mot de passe), 0, - $ salt_length); return $ mot de passe; } private function salt() { return substr (md5 (uniqid (rand(), true)), 0, $ this-> salt_length); }} >
À l'avenir, vous devriez essayer de diviser de grandes questions comme celle-ci en plus petits morceaux. Il sera plus facile de répondre et vous obtiendrez plus de points :) – rook