[Ajax] Polaczenie bezposrednie miedzy dwoma uzytkownikami

0

Witam!

Mam zadanie troche nietypowe. Mam pewny serwis, powiedzmy ze jest to gra przegladarkowa. Ludzie loguja sie i po zalogowaniu dostaja ciasteczka nazwa loginu + md5 hasla. "Polaczenie bezposrednie miedzy dwoma userami" dziala u mnie w sposob taki:

$(document).ready(function() {
  aCounter=0;
  if (readCookie("login") == null && readCookie("password")==null) return; 
  sendData(false);
});

Czyli po zaladowaniu strony sprawdzane jest czy user jest zalogowany, jesli jest to :

function composeSendData() {
  aCounter++; //zwieksz licznik ?
  var data={ "id"      : aCounter,
             "login"    : readCookie('name'),
             "password" : readCookie('password'),
			 "data" : false};
  return data;
}
function sendData(send_data) {
    var send=composeSendData(); 
	if (send_data != false) { //w momencie kiedy mamy jakies dane do wyslania to kasuj timer...
	  clearInterval(aTimer);
	  send['data']=send_data;
	}
    var data=JSON.stringify(send, json_stringify);
    advAJAX.post({
     url: "index.php?action=alive",  
     parameters : {
      "data" : data
    },
    onSuccess : function(obj) { 
	 try {
	   var response = JSON.parse(obj.responseText, json_parser); //parsuj
	   if (!response['error']) aTimer=setTimeout('sendData(false)', 1000);
	   if (response['data'] != false) { //sprawdz czy nie przyszlo cos nowego
	     parseNewData(response['data']); //wywolaj parser, tutaj serwer przysyla tablice z lista nowych "pakietow"
       }
	 } catch(err) {}
	 }});
}

Wiec -

  1. User po zalogowaniu wysyla swoje dane, jesli jest cos do wyslania w zapytaniu to przeslij to w tablicy.
  2. Sprawdz odpowiedz, jesli serwer ma jakies dane czekajace na usera to wywolaj parser.
  3. Po otrzymaniu odpowiedzi za sekunde zrób to samo.

Po stronie serwera wyglada to podobnie. Jesli user A wysyla dane do usera B to serwer sprawdza w bazie czy user B wyslal pinga (czyli wyslal wiadomosc) w okresie przynajmniej 30 sekund (to znaczy jest zalogowany), jesli to zrobil to zapisz w kolejce dane ktore mu przesyla user A. User B po wysylaniu swojego pinga dostaje z kolejki liste wiadomosci ktore sa zaadresowane do niego. Proste i dziala...

Problem w tym ze boje sie ze bedzie to latwe do obejscia w jakis sposob. Myslalem o zabezpieczeniach takich ze user po zalogowaniu do strony dostaje swoj unikatowy numer sesji i zapisywane bedzie IP. Przy wysylaniu pingów user musialby podawac wlasnie ten ID sesji + serwer bedzie porownywal IP usera z IP sesji. Przy 'przypadkowym' przechwyceniu sesji i tak atakujacy nic z tym nie zrobi... Z innego adresu IP. Ale jak jest z moim sposobem ?

Praktycznie, po wycieknieciu loginu i hashu hasla atakujacy moze zrobic cokolwiek. Lacznie z zalogowaniem sie na strone.

Pisal ktos kiedys cos podobnego ? Zalezy mi na maksymalnym bezpieczeństwie.

0

Witam

Niestety nie znam php, toteż niewiele mogę wnieść do Twojego kodu. Wydaje mi się jednak, że twój problem jest podobny do czegoś, co wcześniej przedstawiłem jako "połączenie server-klient przez AJAX'a w dwie strony" - z zerowym czasem synchronizacji oraz gwarancją dostarczenia wiadomości.

Zobacz ten wątek: http://4programmers.net/Forum/512301?h=w%C4%85tek#id512301

Może spodoba ci się mój pomysł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1