Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как привязать сайт к "железке"


Автор: Alca 13.8.2008, 12:04
Как привязать сайт к "железке"? 
Я написал ActiveX компонет, который считывает ID номер смарткарты.
Необходимо, чтобы юзер не мог зайти на сайт без этой смарткарты.
Проверка ID номеры карты должна осуществляться на сервере (CGI-скрипт).
Подскажите как лучше организовать такой алгоритм.
Может как-то через Cookies? Как можно реализовать с помощью Cookies?

Автор: Ghirik 22.8.2008, 23:24
Вот они и молчат... Умные... Потому, как подозревают, что вопрос глупый.

Цитата

Я написал ActiveX компонет, который считывает ID номер смарткарты


Замечательная фраза, умная.

Цитата

Может как-то через Cookies? 


Вот здесь лажа уже закончилась...

Автор: Alca 23.8.2008, 00:04
Умно..........
Цитата

Авторизация

Куки могут использоваться сервером для опознания ранее авторизовавшихся пользователей. Это происходит следующим образом:[20]
Пользователь вводит имя пользователя и пароль в текстовых полях страницы входа и отправляет их на сервер.
Сервер получает имя пользователя и пароль, проверяет их и, при их правильности, отправляет страницу успешного входа, прикрепив куку с неким идентификатором сессии. Эта кука может быть действительна только для текущей сессии браузера, но может быть настроена и на длительное хранение.
Каждый раз, когда пользователь запрашивает страницу с сервера, браузер автоматически отправляет куку с идентификатором сессии серверу. Сервер проверяет идентификатор по своей базе идентификаторов и, при наличии в базе такого идентификатора, «узнаёт» пользователя.
Это метод широко используется на многих сайтах, например на Yahoo!, Википедии, Facebook.

Автор: Alca 3.9.2008, 12:50
Цитата

Сервер проверяет идентификатор по своей базе идентификаторов и, 
при наличии в базе такого идентификатора, «узнаёт» пользователя.

У меня на сервере лежит CGI-скрипт.
Если я набираю урл в адресной строке,
как сервер сможет проверить этот идентификатор? Объясните пж.

Автор: ksnk 3.9.2008, 14:45
Постараюсь ответить серьезно, и буду пока считать, что вопрос не настолько глупый, как, может быть, выглядит smile

Предварительный ответ - никак. Если обходится схемой activeX->cookie->cgi, то никакой секретности не получится. Кука может быть перехвачена и подделана по дороге и на самом компютере.

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

Более правильный вариант - сервер предлагает какое-то случайное число-ключ, по которому шифруется значение ID карты. Вот оно уже и сохраняется в куках-сессии. Сервер, зная ключ расшифровывает значение ID и идентифицирует карту. Так как используется ActiveX, то несложно навернуть сколь угодно сложный алгоритм шифрования. Ключ сохраняется на время жизни сесии.

P.S. Alca, надеюсь ActiveX считывает номер смарткарты, которая вставлена в компютер пользователя? smile

P.P.S cgi может узнать значения кук с помощью пременных окружения.







Автор: Alca 3.9.2008, 15:28
Цитата

P.S. Alca, надеюсь ActiveX считывает номер смарткарты, которая вставлена в компютер пользователя?

Да.
Цитата

P.P.S cgi может узнать значения кук с помощью пременных окружения.

Я так и делаю, получаю из переменных окружения, если запрос на сервер передается на CGI-скрипт.
Но если я ввожу ссылку (например, http://site/index2.htm) в адреснной строке - запрос не передается скрипту. 
Или я не прав?
Как я могу проверить таким образом значения кук на сервере???

Автор: ksnk 3.9.2008, 15:42
Угу... А чем отличаются случай, когда
Цитата

запрос на сервер передается на CGI-скрипт

и 
Цитата

ввожу ссылку в адреснной строке

?


Автор: Alca 3.9.2008, 15:53
Я когда вбиваю ссылку в адреснной строке и жму "Enter" скрипт не выполняется.
Скрипт:
Код

int main(int argc, char *argv[]) {    
    MessageBox(0, "Скрипт выполнился", "", MB_OK);
    return 0;
}

Табличка не выскакивает!

Автор: ksnk 3.9.2008, 16:00
А запроc на сервер это что такое?  При каких условиях скрипт выполняется?

Автор: Alca 3.9.2008, 16:03
Цитата

При каких условиях скрипт выполняется?

Передаю форму через POST-запрос
Код

<form name="frmCardId" action="http://site/cgi-bin/Test.cgi" enctype="multipart/form-data" method="POST">
        <input name="inpHidden"    type="hidden" value="some_binary_data"><br />
        <input name="inpHiddenUrl" type="hidden" value="some_url"><br />
</form>

Могу и GET-запросом передавать, если надо - все равно.
P.S. Web-cервер Apache (Denwer, последняя сборка)

Автор: ksnk 3.9.2008, 16:20
Alca, Тот текст на С, который приведен, выполниться, если вбить в адресную строку http://site/cgi-bin/Test/. Правда что будет делать админ сервера с всплывающим неожиданно сообщением я боюсь вслух произнести ;-)

Обычно, POST запросы отправляются с помощью ajax-технологии. Для этого используется какая-то Ajax javascript-библиотека. к примеру jQuery. Для jQuery страничка, которая отправит запрос при "вводе адреса в адресную строку" может выглядеть так
Код


<script type="text/javascript" scr="jquery.js"></script>
<script type="text/javascript">
$(function(){

$.post(
  "http://site/cgi-bin/Test/"
  ,{
     inpHidden:12345,
     inpHiddenUrl:someUrl
  }
  , function(){
      alert('Йо!')
  }
)

})
</script>

Йо!!!



Автор: Alca 3.9.2008, 16:25
А на С реально сделать?

Автор: ksnk 3.9.2008, 16:29
Alca, Мне почему-то начинает казаться, что http://phpfaq.ru/na_tanke будет очень полезна. 

Автор: Alca 3.9.2008, 16:46
Цитата

Единственный способ отправить что-то скрипту - это кликнуть по ссылке или нажать на кнопку в форме.

Это я понял.
Цитата

Но в любом случае, после обработки POST надо всегда перенаправлять браузер на какую-нибудь страницу, 
пусть ту же самую, но уже без данных формы, чтобы при обновлении страницы они не записывались повторно. Например:

Код

header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
exit;

Это не совсем.
ksnk, объясни что значит:
Цитата

пусть ту же самую, но уже без данных формы

Автор: ksnk 3.9.2008, 17:08
Это уже следующая ступень понимания, пока о ней можно не думать.
Вот,
Цитата

А на С реально сделать?

Нужно понимать, что исполняется на сервере, а что на клиентской машине.

Автор: Alca 3.10.2008, 17:15
Пробую без кукисов. Мне надо чтоб при загрузке каждой страницы проверялся ID карты.
Я думал сделать так:
1) в событии onLoad страницы index.htm читаю ID; 
2) прочитав, отправляю ID на CGI-скрипт POST-запросом
  (document.frmCardId.submit();) (frmCardId - форма с хидн полями);
 проверив данные на корректность, скрипт делает переадресацию на index.htm 
  (document.location.href("http://127.0.0.1/index.htm"));
3) происходит событие onLoad страницы и все начинается с 1-ого пункта;
4) впадаем в бесконечный цикл (постоянная отправка, передача); 
Хелп плиз!!!! Толкните на правильное решение пж.....  smile 

Автор: Nigel 3.10.2008, 21:47
Тогда попробуйте без перезагрузки страницы. Копайте в сторону ajax. На onload вешаете, к примеру функцию отправки данных. Если все ок, то возвращаете статус "пройден". Что-то наподобии:
Код

/* Создание нового объекта XMLHttpRequest для общения с Web-сервером */
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
  xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
  try {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (e2) {
    xmlHttp = false;
  }
}
@end @*/

if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
  xmlHttp = new XMLHttpRequest();
}

function sendData(){
              var url = 'mypath/to/cgi-script?id=my-super-secret-id';
      // Открыть соединение с сервером
      xmlHttp.open("GET", url, true);

      // Установить функцию для сервера, которая выполнится после его ответа
      xmlHttp.onreadystatechange = checkState;

      // Передать запрос
      xmlHttp.send(null);
}

function checkState(){
  if (xmlHttp.readyState == 4) {
    var response = xmlHttp.responseText;
    if(response=='ok') {alert('you are authorized!');}//дальше вперед и с песней
    else { alert("no access!");}//перекрываем кислород
  }

}


Ну, а в скрипте проверки, как наверно догадались
Код

if(проверка_пройдена) {
print 'ok';
} else {
print 'error';
}

Автор: Alca 8.10.2008, 08:57
Nigel, Спасибо за код, помог для IE! 
А если в браузере (Opera 9.52) выполнение скриптов отключено, 
то скрипты просто игнорируются и содержимое страницы отображается полностью!
А мне надо что б страница вообще не грузилась. 
AJAX курит в сторонке...

Автор: Alca 10.10.2008, 17:29
Пробую с куками:
Цитата

Более правильный вариант - сервер предлагает какое-то случайное число-ключ, по которому шифруется значение ID карты. Вот оно уже и сохраняется в куках-сессии. Сервер, зная ключ расшифровывает значение ID и идентифицирует карту. Так как используется ActiveX, то несложно навернуть сколь угодно сложный алгоритм шифрования. Ключ сохраняется на время жизни сесии.

Каким образом сервер получает куки? 
И что подразумевается под словом "сервер"? Мой CGI-шный скрипт?

Автор: ksnk 10.10.2008, 18:00
Цитата

Каким образом сервер получает куки? 

Может по протоколу http? ;-)
Скрипт видит их в массиве $_COOKIE

Цитата

И что подразумевается под словом "сервер"? Мой CGI-шный скрипт? 

Ну да...

Автор: unicross 10.10.2008, 23:03
Цитата(Alca @  3.10.2008,  17:15 Найти цитируемый пост)
Пробую без кукисов. Мне надо чтоб при загрузке каждой страницы проверялся ID карты.


Зачем? Думаю надо копать не в сторону AJAX и JavaScript (их можно отключить в браузере), а изучить механизм сессий в PHP или Perl. Например, скачав http://wwwadmin.ru/perl/.

Я не предлагаю перейти на эти языки с С. Просто технология сессий будет такой же:
1. Считываем значение смарткарты и отправляем методом POST (!!!)
2. На сервере пароль проверяется и если он в порядке, то:
 - генерируется уникальный идентификатор
 - создается файл на сервере с названием идентификатора
 - в этот файл записывается:
    - номер смарт карты
    - IP адрес клиента
    - браузер пользователя
    - дата создания и т.п. (Получить значения можно через переменные окружения)
 - на компьютер пользователя устанавливается куки с идентификатором (! не с номером смарткарты !)
 - если прием куки запрещен в браузере, то идентификатор следует прикрепить ко всем ссылкам
3. При повторном заходе:
 - считывается идентификатор из куки
 - сравниваются все значения записанные в файле на сервере
 - если значения совпадают, то предоставляем доступ
 - если время истекло или не совпадает хотя бы один параметр, то удаляем
    - файл на сервере
    - устанавливаем просроченный куки
    - считываем заново значение смарткарты

Для надежности все через протокол https


Автор: Alca 10.10.2008, 23:12
Спасибо за совет и за ссылку, буду читать  smile .
Цитата

Скрипт видит их в массиве $_COOKIE

Каким образом CGI-шный скрипт увидит куки при посещении страниц (я же к ниму не обращаюсь)?
Мне что к каждой ссылке добавлять запрос к скрипту, чтобы проверялись куки?
Цитата

Например, скачав этот файл.

Ну там про сессии написано (Модуль CGI::Session). Как я их прикручу к Си-шному коду? smile 
 smile  smile  smile  smile  smile 
Цитата

Каждый раз, когда пользователь запрашивает страницу с сервера, браузер автоматически отправляет куку с идентификатором сессии серверу. Сервер проверяет идентификатор по своей базе идентификаторов и, при наличии в базе такого идентификатора, «узнаёт» пользователя.

Можно какой-то примерчик привести? Мне не ясно как реализовать проверку идентификатора, каждый раз когда пользователь запрашивает страницу с сервера.  smile 

Автор: Nigel 18.10.2008, 11:29
Цитата(Alca @ 8.10.2008,  08:57)
А если в браузере (Opera 9.52) выполнение скриптов отключено

Тогда пишем просто 
Код

<noscript>Юзверь, хочешь работать, включи Яваскрипт!</noscript>

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

function myfunc() {
...
//после прохождения проверки
...
//после получения контента
//при помощи DOM рисуем страницу
//используя методы appendChild(), innerHTML;

var oHTML = new StringBuilder('Приветствую тебя, ...');
oHTML.Append('<div>тут контент<\/div>');
document.body.innerHTML = oHTML.toString();//страница загружена
}

Автор: Alca 3.11.2008, 14:07
Цитата

если прием куки запрещен в браузере, то идентификатор следует прикрепить ко всем ссылкам

Каким образом (программно) я могу прикрепить идентификатор ко всем ссылкам?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)