暇な時間があり、楽しみのために新しいプロジェクトを選ぶことを考えています。私は大学生で、毎年オンラインでピッチ コンテストを開催しています。今から約9か月後のこのピッチコンペのプロジェクトを作成したいと考えています。問題は、プロジェクトが非常に高度なセキュリティを必要とし、競争が非常に激しいことです。
私ができるようにする必要があること: 1. HIPAA または ePHI (.pdf|.gif|.jpg|.doc) を保存する 2. 強力なアクセス制御 3. 多数のユーザーとファイル (100 万以上) をサポートする 4. フル監査レポート (ePhi さん、大変ですね) 5. 暗号化
提案された解決策
0) ファイアウォールの背後にある安全な専用サーバーに Web アプリを配置する
1) ファイルを「secure_files/」というファイルに保存し、mod_rewrite を使用してこのディレクトリへのアクセスを制限します。
次の行に何か:
#Removes access to the secure_files folder by users.
RewriteCond %{REQUEST_URI} ^secure_files.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
次に、ユーザーに権限がある場合は、php スクリプトを使用してファイルを開きます。だから私はちょうど使用できますか:
------
-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) CI セッション クラスを使用して、セッションに「ユーザー」を追加します。
コントローラーは、セッションが設定されているかどうかを確認します。
<?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) 複数の Web サーバー間でラウンド ロビンをローテーションします。私はこれをやったことがないので、これを行う方法がわかりません。複数のデータベース サーバーを処理する方法がわかりません。アイデア/提案はありますか?
4) Oracle Enterprise Standard Database 監査を使用します。MySQL を使用できればよいのですが、監査サポートが見つかりません。MySQL と PITA を使用できます。MySQL でポイントインタイム アーキテクチャ (PITA) を使用した人はいますか? あなたの経験を共有できますか?
5) したがって、明らかに、一方向のソルト付きハッシュでパスワードをハッシュできます。しかし、すべてを暗号化する必要がありますか? また、 AES_ENCRYPT(str,key_str) がセキュリティを向上させる方法がまったくわかりません。管理者がデータベースを見るのを妨げる可能性があると思いますか? 「secure_files/」フォルダー内のすべてを暗号化できますか? BitLocker のようなフル ディスク暗号化を使用できますか?
基本的に、php と CI でオンライン バンク レベルのセキュリティを実現できますか? 価値のない「あなたは何も知らないから専門家にお金を払ってください」という提案以外に、他に何か提案をすることはできますか?
ここまでお読みいただきありがとうございました。
Redux Auth から採用
一方向ハッシュに関して。暗号化と言う私の間違い。私は通常、次のようなことをします:
ソルトの長さ = '9'; } public function hash($password = false) { $salt_length = $this->salt_length; if ($password === false) { return false; $salt = $this->salt(); $password = $salt . substr(hash('sha256',$salt.$password), 0, -$salt_length); $パスワードを返します。} private function salt() { return substr(md5(uniqid(rand(), true)), 0, $this->salt_length); } } ?>