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 :: Js+Php=Ajax но есть нюанс...

 PHP.SU

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


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

> Описание: защита файлов от прямого доступа к ним...
dsb80
Отправлено: 17 Июля, 2010 - 00:43:38
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Янв. 2009  
Откуда: СПб


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




Взял некий удачный способ защиты файлов от прямого доступа ака Joomla
PHP:
скопировать код в буфер обмена
  1. <?PHP defined( '_IN_THIS_FILE' ) or die('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL / was not found on this server.</p><hr></body></html>'); ?>
, но регистрацию сделал на AJAX т.е. существует некий файл registration.php куда отправляются асинхронные запросы. только вот вбив ссылку руками http://mysite[dot]ru/registration.php получаем доступ к самодостаточному файлу...
Собственно по теме хотелось бы лишить всяких страждующих такой возможности.Пробовал $_SERVER["HTTP_REFERER"] т.е. если пришли с нашего сайта то пускаем иначе посылаем лесом , но существование глупых прокси портит(и возможность подделки данного заголовка) всю картину.
Так мож ктонить решал такую проблему, очень хочется такое сделатьУлыбка


-----
Не слушайте... После 19.00 вместо меня пишет ПЫВО
 
 Top
Champion Супермодератор
Отправлено: 17 Июля, 2010 - 09:27:45
Post Id



Активный участник


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


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




1 - Зачем это нужно?
2 - Если всё-таки правда нужно.
Стопроцентной защиты ты не придумаешь. Любое взаимодействие браузера с серверными скриптами имитируется всегда тем же CURLом. Можно только усложнить этот процесс. Варианты:
- Сессия. При заходе на сайт в сессию пишется ключик, а при заходе в скрипт регистрации он проверяется.
- Усложнение первого варианта: яваскриптовая функция, которая одному тебе известным способом вычисляет какой-то ключ в зависимости от внешних факторов, а скрипт регистрации проверяет это значение.
- Разные глупости как в ASP типа __VIEWSTATE, __EVENTVALIDATION и разбросанных по всей форме различных спрятанных инпутов, которые участвуют в формировании POST - запроса.
 
 Top
movEAX
Отправлено: 17 Июля, 2010 - 09:31:13
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


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




Ну, это и стой же эпопеи "Как защитить контент от скачивания". Можно разместить JS, что-то вроде этого
CODE (javascript):
скопировать код в буфер обмена
  1. document.location='http://go.to.hell'

Но нужно будет как-то игнорировать эти строчки в обработчике.


-----
армия.. самое убогое место
 
 Top
dsb80
Отправлено: 17 Июля, 2010 - 12:47:28
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Янв. 2009  
Откуда: СПб


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




Champion пишет:

- Сессия. При заходе на сайт в сессию пишется ключик, а при заходе в скрипт регистрации он проверяется.
- Усложнение первого варианта: яваскриптовая функция, которая одному тебе известным способом вычисляет какой-то ключ в зависимости от внешних факторов, а скрипт регистрации проверяет это значение.
- Разные глупости как в ASP типа __VIEWSTATE, __EVENTVALIDATION и разбросанных по всей форме различных спрятанных инпутов, которые участвуют в формировании POST - запроса.


Вголову пришла мысль - в форме делаем пустой див куда при обращении к регистрации(в тот момент когда всплывает окно) пишем некий ключик действующий нарпимер 10 мин и является одноразовым, который пишем в базу, а приобращении к скрипту проверяем ключик на время и то использовался ли он уже; также можно одному ip выдавать не более 10 ключей в течении 15 минут. В общем что-то такое.


-----
Не слушайте... После 19.00 вместо меня пишет ПЫВО
 
 Top
Champion Супермодератор
Отправлено: 17 Июля, 2010 - 13:01:55
Post Id



Активный участник


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


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




В любом случае, чтоб это обойти, потребуется 5 минут. Самое сложное - какая-то сложная обработка данных яваскриптом или капча. Ключики в дивах и скрытых полях разбираются за 5 минут. Капча распознается, а логика яваскрипта может быть скопирована. Лучше подумай, так ли нужна тебе эта защита?
 
 Top
dsb80
Отправлено: 17 Июля, 2010 - 13:06:16
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Янв. 2009  
Откуда: СПб


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




Нужна... я уже 4-й день с этим парюсь)


-----
Не слушайте... После 19.00 вместо меня пишет ПЫВО
 
 Top
Ch_chov
Отправлено: 17 Июля, 2010 - 20:53:08
Post Id



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


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


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




$_SERVER['HTTP_X_REQUESTED_WITH']

(Отредактировано автором: 17 Июля, 2010 - 20:53:29)

 
 Top
movEAX
Отправлено: 17 Июля, 2010 - 22:11:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 750
Дата рег-ции: Авг. 2009  


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




Ch_chov пишет:
$_SERVER['HTTP_X_REQUESTED_WITH']

Интересно) Но заголовок ведь подделать можно.


-----
армия.. самое убогое место
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Июля, 2010 - 23:44:58
Post Id



Активный участник


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


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




Допустим:
Есть такая штука:

var url = "worker.php";
request.open("GET",url,true); // ну или POST, не суть в этом
request.setRequestHeader("X-Requested-With","вот суда пишем некий ключик (время жизни 5 минут) о котором будет знать скрипт");
request.onreadystatechange = myAjaxJobFunction;
request.send(null);

Тогда как подделать заголовок???
А смысл??? Значение то его меняется...
(Добавление)
Причем какая разница ЧТО в значении заголовка давать? Отработает только если валидным в данный момент будет... Или я не прав?
(Добавление)
Щас вот проверил свою теорию - ПАШЕТ НА УРА
(Добавление)
А вот работа с ключиком:
С помощью PHP мы вывели страницу с начальным значением ключика, предварительно вписав его в базу/файл. Затем (например) при посылке асинхронки мы отправляем еще и step=<номер шага>. Скрипт получает ключик, номер шага (соль) и сверяется с записью в базе/файле:
if(true) { на тебе результат }
else { Hack Attempt!!!! }
 
 Top
Ch_chov
Отправлено: 18 Июля, 2010 - 08:17:07
Post Id



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


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


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




movEAX пишет:
Но заголовок ведь подделать можно

Конечно можно.

DeepVarvar пишет:
С помощью PHP мы вывели страницу с начальным значением ключика, предварительно вписав его в базу/файл.

Лучше в сессию.
Это стандартный метод для защиты форм от подделки. Форму "прошивают" специальным токеном (с помощью <input type="hidden"/>), который храниться на сервере и проверяется при получении данных формы.
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Июля, 2010 - 10:43:39
Post Id



Активный участник


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


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




Так-с..... Просветите меня: разве с асинхронным запросом обновляется сессия???
Если - да, то при ситуации когда форма не сабмитится, на buttone-е висит жава-обработчик, а все заголовки и GET/POST-данные отправляет сам асинхронник - то проблем не будет..
Вот только я не заметил чтобы новая сессия прилетала в браузер...
 
 Top
Champion Супермодератор
Отправлено: 18 Июля, 2010 - 11:25:37
Post Id



Активный участник


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


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




DeepVarvar пишет:
Так-с..... Просветите меня: разве с асинхронным запросом обновляется сессия???
Обновляется. Тебе установили сессионную куку (или не куку, не важно, каким механизмом она реализована) с идентификатором сессии. Потом в любых вызываемых скриптах - не важно ассинхронно или как - можно изменять эту же сессию.
Сессия одна и таже, а данные в ней меняются.
Прошитые формы и заголовки - это всё лишняя возня. Кому нет дела, как добраться жо вашей формы регистрации, те вам и не мешают. Кто захочет, без труда всё подделает.
 
 Top
dsb80
Отправлено: 18 Июля, 2010 - 13:38:03
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Янв. 2009  
Откуда: СПб


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




Вобщем понятно - "в лоб" решения нет. Дело в том, что пользователи сайта идентифицируются по сессиям хрранящихся в 2-х куках зашифрованых разными способами причем одна изних с солью, а в базе лежит третье значение (подделать врядли). Так вот может просто на сервере отслеживать действия пользователей, если пользователь напрример делает 10 раз одно и тоже в течении какогото времени(логика не суть) посылать его лесом? Думаю может так тогда?


-----
Не слушайте... После 19.00 вместо меня пишет ПЫВО
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Июля, 2010 - 13:41:30
Post Id



Активный участник


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


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




Теперь моя душа спокойна (доверяй, но проверяй):

test.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function Get_Microtime() {
  3.         list($usec,$sec)=explode(' ',microtime());
  4.         return ($sec.substr($usec,2));
  5.         }
  6. $last_test_session='none';
  7. $last_test_cookie='none';
  8. if (isset($_SESSION['test'])) { $last_test_session=$_SESSION['test']; }
  9. if (isset($_COOKIE['test'])) { $last_test_cookie=$_COOKIE['test']; }
  10. $now_test_cookie=$now_test_session=$_SESSION['test']=Get_Microtime();
  11. setcookie('test',$now_test_cookie,time()+2592000);
  12. header('Content-Type: text/html; charset=utf-8');
  13. if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=='passhash') {
  14.         print '$last_test_session =>>> '.$last_test_session.'<br />';
  15.         print '$now_test_session =>>> '.$now_test_session.'<br />';
  16.         print '$last_test_cookie =>>> '.$last_test_cookie.'<br />';
  17.         print '$now_test_cookie =>>> '.$now_test_cookie.'<br />';
  18.         exit();
  19.         }
  20. ?>
  21.  
  22. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  23.  
  24. <html xmlns="http://www.w3.org/1999/xhtml">
  25.  
  26. <head>
  27.  
  28. <title> Tested AJAX + SESSION + COOKIE </title>
  29.  
  30. <script type="text/javascript">
  31. <!-- Begin
  32. var request = null;
  33. function createRequest() {
  34.         try {
  35.                 request = new XMLHttpRequest();
  36.                 }
  37.         catch(trymicrosoft) {
  38.                 try {
  39.                         request = new ActiveXObject("Msxm12.XMLHTTP");
  40.                         }
  41.                 catch(othermicrosoft) {
  42.                         try {
  43.                                 request = new ActiveXObject("Microsoft.XMLHTTP");
  44.                                 }
  45.                         catch(failed) {
  46.                                 request = null;
  47.                                 }
  48.                         }
  49.                 }
  50.         if(request == null) alert("Error creating request object!!!");
  51.         }
  52. function getMessage() {
  53.         createRequest();
  54.         request.open("GET","test.php",true);
  55.         request.setRequestHeader("X-Requested-With","passhash");
  56.         request.onreadystatechange = myReceive;
  57.         request.send(null);
  58.         }
  59. function myReceive() {
  60.         var getText = request.responseText;
  61.         document.getElementById("main").innerHTML = "";
  62.         document.getElementById("main").innerHTML = getText;
  63.         }
  64. // End -->
  65.  
  66. </script>
  67.  
  68. </head>
  69.  
  70. <body>
  71.         <div id="main" style="margin:12px; border:1px solid #000000;">
  72.                 <?PHP
  73.                         print '$last_test_session =>>> '.$last_test_session.'<br />';
  74.                         print '$now_test_session =>>> '.$now_test_session.'<br />';
  75.                         print '$last_test_cookie =>>> '.$last_test_cookie.'<br />';
  76.                         print '$now_test_cookie =>>> '.$now_test_cookie.'<br />';
  77.                 ?>
  78.         </div>
  79.         <form method="get" action="test.php">
  80.         <input id="send_chat" onClick="javascript:getMessage();" type="button" value=" Ы т ь " />
  81.         </form>
  82.  
  83. </body>
  84.  
  85. </html>


Зато наглядно и понятно.......... Радость Радость Радость
 
 Top
dsb80
Отправлено: 18 Июля, 2010 - 13:52:52
Post Id



Гость


Покинул форум
Сообщений всего: 71
Дата рег-ции: Янв. 2009  
Откуда: СПб


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




DeepVarvar

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

(Отредактировано автором: 18 Июля, 2010 - 13:53:53)



-----
Не слушайте... После 19.00 вместо меня пишет ПЫВО
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB