У меня немного простоя, и я думаю выбрать новый проект для развлечения.Я студент колледжа, и каждый год мы проводим онлайн-конкурс.Я хочу создать проект для этого конкурса, который будет через 9 месяцев.Проблема в том, что проект требует очень высокой безопасности, а конкуренция очень конкурентная.
Что мне нужно сделать: 1. Хранить HIPAA или ePHI (.pdf | .gif | .jpg | .doc) 2. Надежный контроль доступа 3. Поддержка большого количества пользователей и файлов (1миллионов +) 4. Полные аудиторские отчеты (о, черт возьми, ты такая боль) 5. Шифрование
Предлагаемые решения
0) Разместите веб-приложение на защищенном выделенном сервере за брандмауэром
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) Поверните циклический перебор между несколькими веб-серверами.Я никогда не делал этого, поэтому понятия не имею, как это сделать.Я понятия не имею, как бороться с несколькими серверами баз данных.Любые идеи / предложения?
4) Использовать аудит базы данных Oracle Enterprise Standard.Я хотел бы использовать MySQL, но я не могу найти поддержку аудита.Я мог бы использовать MySQL и PITA.Кто-нибудь использовал точечную архитектуру (PITA) с MySQL?Можете ли вы поделиться своим опытом?
5) Так что, очевидно, я могу хэшировать пароли с односторонним хэшированием.Но нужно ли мне все шифровать?Также я не вижу, как AES_ENCRYPT (str, key_str) вообще улучшает secuirty.Я думаю, это может помешать администратору смотреть на базу данных?Могу ли я / должен зашифровать все в папке «secure_files /»?Могу ли я просто использовать полное шифрование диска, например BitLocker?
В принципе, могу ли я достичь уровня безопасности онлайн-банка с помощью php и CI?Можете ли вы сделать какие-либо другие предложения, кроме бесполезных предложений «ваш идиот, платите эксперту, потому что вы ничего не знаете»?
Спасибо, что нашли время, чтобы прочитать это.
взято из Redux Auth
Относительно одностороннего хеширования.Моя ошибка в том, что я сказал шифрование.Я обычно делаю что-то похожее на:
salt_length = '9';} открытый хэш функции ($ password = false) {$ salt_length = $ this-> salt_length;if ($ password === false) {return false;} $ salt = $ this-> salt ();$ пароль = $ соль.substr (хеш ('sha256', $ salt. $ password), 0, - $ salt_length);вернуть $ пароль;} приватная функция salt () {return substr (md5 (uniqid (rand (), true)), 0, $ this-> salt_length);}}?>