Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как разграничить полномочия между php-скриптами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: обсуждение способов защиты от злобных эр-эн-эр-программистов-инсайдеро в
timix
Отправлено: 17 Апреля, 2009 - 16:25:10
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2009  
Откуда: Москва, Россия


Помог: 0 раз(а)




Допустим, над проектом работает команда программистов.
Проверять код всех скриптов, которые они пишут, перед
выкладыванием на сервер - не всегда реально.
А ведь любой из них может опубликовать конфиденциальную инфу,
которая, допустим, хранится в файле access.php, вынесенном за пределы
web-сервера.

CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. include 'access.php';
  4. echo "
  5. <p>User: $dbuser </p>
  6. <p>Psw:  $dbpsw </p>";
  7. ?>
  8.  


Т.е. во-первых, надо придумать, как не позволить потенциально
опасным скриптам инклюдить защищаемые файлы типа 'access.php'.
Причём эти скрипты не обязательно запускаются как самостоятельные.
Они могут быть включены в index.php, например, если скрипт реализует
какую-нибудь функцию, которая, скажем, рисует формочку: feedback_form().

Во-вторых, возникает такая задача:
Есть класс DB для связи с базой данных.
В нём есть поле $connection, а его методы инкапсулируют
SQL-запросы. Надо, чтобы другие разработчики могли
использовать его методы, но не могли делать к базе данных
произвольных запросов типа 'SELECT', т.к. в БД кое-где тоже
содержится конфиденциальная инфа.
Т.е. если какой-то сторонний программер написал для меня скрипт,
добавляющий сообщения с форума в БД, этот сторонний программер
не должен иметь возможности получить e-mail-ы всех юзеров из таблицы USERS.
Значит, надо защитить поле $connection так, чтобы его никак нельзя было выцепить,
даже с помощью var_export($db).

У кого какие соображения?
Может, есть альтернативные методы разграничения полномочий?
 
 Top
Ch_chov
Отправлено: 17 Апреля, 2009 - 17:40:09
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




Если для работы с базой используются какой либо framework, то в нем и ограничить доступ к конфеденциальным данным.
А сторонним программистам просто не сообщать имя базы, логин и пароль пользователя базы.
Такой же принцип можно реализовать и при работе с файлами.

З.Ы. Лучше все таки не работать с тем, кому не доверяешь...
 
 Top
valenok
Отправлено: 17 Апреля, 2009 - 19:01:15
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




касаемо первого можно просто разрешить инклудить класс db..
в котором уже произошло подключение к бд. А после подключения удалились твои переменные.

Касаемо второго, тут уже получится фактически свой фреймворк..
Создаешь такого рода файл с правами. Дал задание написать форму фидбэка
пусть называет файл определенным именем именем или прописывает какую нибудь переменную-ключ идентифицирующую его скрипт.

Если переменная отсутвует или не находитсяв списке с разрешенными ключами
то блокировать выполнение скрипта. А если есть, то смотреть какие права выданы определенному скрипту, а именно работа с какими таблицами, полями, файлами и т.д.
но это не меньше всяких классов для работы с бд которых придётся переписывать
для анализа запросов.

А вообще в готовом проекте тебе придётся так или иначе просмотреть все скрипты.
Он тебе может какой нибудь бэкдор оставить не дай бог.


-----
Truly yours, Sasha.
 
My status
 Top
timix
Отправлено: 18 Апреля, 2009 - 13:48:35
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2009  
Откуда: Москва, Россия


Помог: 0 раз(а)




Согласен, что лучше не работать с теми, кому не доверяешь. А ещё лучше быть
молодым здоровым и богатым, чем старым бедным и больным Радость
Однако, не хотелось бы ограничивать круг разработчиков только теми, кому я 100% доверяю. Архитектура должна быть выстроена таким образом, чтобы не допускалось даже случайных утечек (по-глупости). В целом задача актуальна даже для маленьких коллективов разработчиков.
Конечно, фреймворки городить я бы тоже не стал. Это обойдётся дороже, чем сам проект.

Кое-что я всё-таки придумал. Я использую возможности php5, хотя можно и обойтись.
Вот набросок кода:

DB_class.php
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. // Класс полного доступа к базе
  4. abstract class DB {
  5.  function __construct() { }
  6.  function __destruct() { $this->link(FALSE); }
  7.  
  8.  // Подключить/отключить. Метод недоступен потомкам.
  9.  private function &link($b = TRUE)
  10.  {
  11.   static $link = FALSE; // соединение с БД
  12.   static $last; // последнее открытое соединение с левой (пустой) БД,
  13.                    // чтобы, выполнив один допустимый запрос, нельзя было выполнить
  14.                    // произвольный запрос через mysql_query() без параметра link_id
  15.  
  16.   if ($link) {
  17.    if (!$b) {
  18.     // mysql_close($link);
  19.     // mysql_close($last);
  20.     unset($link);
  21.     $link = FALSE;
  22.    }
  23.   }
  24.   else {
  25.    if ($b) {
  26.     $link = 'link value'; // = mysql_connect(Наша БД)
  27.     $last = 'bad link'; // = mysql_connect(Левая БД, польз-ль и пароль м.б. те же)
  28.    }
  29.   }
  30.   return $link;
  31.  }
  32.  
  33.  // Выполнить любую команду SQL. Работает только с паролем.
  34.  protected function &perform($query, $class, $psw)
  35.  {
  36.   $result = FALSE;
  37.   $rights = 0;
  38.   switch ($class) {
  39.   case 'DB_USER': if ($psw==='12345') $rights = 1; break;
  40.   default:
  41.   }
  42.  
  43.   if ($rights > 0)
  44.   {
  45.    // $result = mysql_query($query, $this->link(TRUE));
  46.    $result = 'result of query: '.$query;
  47.   }
  48.   else
  49.   {
  50.    // writelog(...);
  51.    echo 'hacker?';
  52.   }
  53.   return $result;
  54.  }
  55. }
  56. ?>
  57.  


DB_USER_class.php
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. final class DB_USER extends DB {
  4.  function __construct() { parent::__construct(); }
  5.  function __destruct() { parent::__destruct(); }
  6.  private function getPsw() { return '12345'; }
  7.  
  8.  public function &getUserData($id)
  9.  {
  10.   $psw = '12345';
  11.   return $this->perform('SELECT `NICK`,`DATE` FROM `USERS` WHERE `ID`='.$id,
  12.   'DB_USER', $this->getPsw());
  13.  }
  14. }
  15. ?>
  16.  


test.php
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. function __autoload($class_name) { include_once($class_name.'_class.php'); }
  4.  
  5. $b = new DB_USER();
  6. echo '<p>getUserData returned: ',$b->getUserData(666),'</p>';
  7. var_dump($b);
  8.  
  9. class MyDB extends DB {
  10.  function __construct() { parent::__construct(); }
  11.  function __destruct() { parent::__destruct(); }
  12.  
  13.  public function &getAll()
  14.  {
  15.   return $this->perform('I`m hacker','DB_USER','123');
  16.  }
  17. }
  18.  
  19. $h = new MyDB();
  20. echo '<p>getAll returned: ',$h->getAll(),'</p>';
  21. ?>
  22.  
 
 Top
Stierus Супермодератор
Отправлено: 20 Апреля, 2009 - 09:14:28
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Возникает вопрос: видят ли программисты чужой код ?Улыбка Если весь процесс основывается на написании классов с определённым API и разработчик видит только свой класс и полное api сторонних классов других разработчиков, но не исходный код - то нужно сделать такой же API для работы с бд (базовый класс и куча методов, вынимающих инфу о пользователе, стат. контент и тд). Если же программист видит чужой код - то вся эта городьба на от чего не спасет Улыбка
 
My status
 Top
timix
Отправлено: 20 Апреля, 2009 - 11:45:07
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2009  
Откуда: Москва, Россия


Помог: 0 раз(а)




Конечно же, исходный код остальные программисты не видят. Если надо, им выдётся пароль для доступа к строго определённому набору запросов к БД, т.е. к определённому API. Исходный код лежит в папке, куда "посторонним В".

Ограничивать же доступ через пользователей БД - неудобно, т.к. по данному тарифному плану хостинга, можно иметь только одного пользователя БД. Естественно, этот пользователь с админскими правами. (Конечно, когда проект заработает, тарифный план тоже изменится... )

Теперь задача состоит в том, чтобы иметь переменные, зарегистрированные в сессии, доступ к которым можно было бы получить только по паролю.

Это может быть полезно, например, в такой ситуации:
Пользователь сайта залогинился. В некой переменной хранится его id в БД и флаг, что он авторизован. Нехорошо, если любой скрипт (функция), будет иметь доступ на запись к таким переменным. В такой ситуации каждый хитрый хакер, не говоря уже об инсайдерах, сможет от лица любого пользователя производить всякие операции, например, перевод денег на другой счёт, или отправку сообщений.
 
 Top
Stierus Супермодератор
Отправлено: 20 Апреля, 2009 - 14:33:34
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




У автора паранойя, мне кажется Улыбка))
По теме : с сессиями тебе поможет session_set_save_handler, пропиши свои функции для доступа с дополнительными проверками, нужными тебе

(Отредактировано автором: 20 Апреля, 2009 - 14:34:07)

 
My status
 Top
timix
Отправлено: 20 Апреля, 2009 - 15:23:05
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2009  
Откуда: Москва, Россия


Помог: 0 раз(а)




Чем Вам не нравится постановка вопроса? Для интернет-магазина или
фото-галереи это всё как @ пятая нога. А если мы пишем web-интерфейс для системы
типа Янекс-деньги? И чем тут может помочь session_set_save_handler()? Без разницы,
кто восстанавливает сессию, главное, что она уже восстановлена к рассматриваемому моменту.

Впрочем, я уже придумал, как это сделать малой кровью. Хорошо
 
 Top
Stierus Супермодератор
Отправлено: 21 Апреля, 2009 - 13:12:21
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Цитата:
т.к. по данному тарифному плану хостинга, можно иметь только одного пользователя БД

Цитата:
Для интернет-магазина или фото-галереи это всё как @ пятая нога. А если мы пишем web-интерфейс для системы типа Янекс-деньги?

Прикреплено изображение (Нажмите для увеличения)
are_u_on_drugs.jpg
 
My status
 Top
timix
Отправлено: 21 Апреля, 2009 - 18:13:58
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2009  
Откуда: Москва, Россия


Помог: 0 раз(а)




Теперь я понимаю за счёт чего г-н 65%-й огурец - рекордсмен по количеству сообщений.
Если Вам не хочется вникать в данную тему - не читайте мой 'бред'.
А лучше, напишите что-нибудь дельное.

В общем для случая с БД код примерно такой:
PHP:
скопировать код в буфер обмена
  1.  
  2. class DB {
  3.  private $link;
  4.  public  $err;
  5.  
  6.  private function getKey()             { return 'tdmked78';        }
  7.  private static function getServer(){ return 'mylogin.mysql'; }
  8.  private static function getName()  { return 'mylogin_base';  }
  9.  private static function getUser()  { return 'mylogin_mysql'; }
  10.  private static function getPsw()   { return 'bfhjd45o';        }
  11.  
  12.  public function __construct()
  13.  {
  14.   // Соединяемся с сервером
  15.   $this->link = @mysql_connect (DB::getServer(),DB::getUser(),DB::getPsw());
  16.  
  17.   if (!$this->link)
  18.   { $this->err[]='Could not connect: '.mysql_error(); return; }
  19.  
  20.   // Выбираем базу данных
  21.   if (!@mysql_select_db (DB::getName(), $this->link))
  22.   { $this->err[]='Could not select database'; return; }
  23.  
  24.   // Открываем ещё одно соединение
  25.   $link = @mysql_connect (DB::getServer(),DB::getUser(),DB::getPsw(),TRUE);
  26.   if (!$link)
  27.   { $this->err[]='Could not connect: '.mysql_error(); return; }
  28.   // Закрываем последнее открытое соединение, чтобы нельзя было
  29.   // воспользоваться mysql_query() без параметра $link_id
  30.   @mysql_close ($link);
  31.  }
  32.  
  33.  public function __destruct()
  34.  {
  35.   // Закрываем соединение
  36.   @mysql_close ($this->link);
  37.  }
  38.  
  39.  public final function &perform ($query,$key='')
  40.  {
  41.   $result = FALSE;
  42.   if ($this->getKey() === $key)
  43.   {
  44.    // выполняем запрос
  45.    $result = @mysql_query ($query,$this->link);
  46.    if (!$result)
  47.    { $this->err[]='Query failed: '.mysql_error(); }
  48.   }
  49.   return $result;
  50.  }
  51. }
  52.  


Дочерние классы имеют такой вид:
class DB_User extends DB {
public function __construct() { parent::__construct(); }
public function __destruct() { parent::__destruct(); }

private function getDB_key() { return 'tdmked78'; }
private function getDB_User_key() { return 'hgdji498'; }

function login ($login,$psw,$key='')
{
if ($key !== getDB_User_key()) return FALSE;

$result = $this->perform(
"SELECT `ID`,`NICK` FROM `USERS` WHERE `LOGIN`=\"$login\" AND PSW=\"$psw\"",
$this->getDB_key());

if ($result === FALSE || @mysql_num_rows ($result) == 0)
return FALSE;

$row = @mysql_fetch_row ($result);
mysql_free_result ($result);
return $row;
}
}

Применение
...
$d = new DB_User();
$result = $d->login($_POST['username'],$_POST['password'],'hgdji498');
...
 
 Top
valenok
Отправлено: 21 Апреля, 2009 - 18:26:57
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




готов поспорить что первый пришедший программист попробует сначала scandir, потом file_get_contents


-----
Truly yours, Sasha.
 
My status
 Top
Stierus Супермодератор
Отправлено: 21 Апреля, 2009 - 19:29:11
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




тут были мысли

(Отредактировано автором: 21 Апреля, 2009 - 19:36:00)

 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Прочее »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB