[ manca @ 02.08.2003. 00:41 ] @
Zdravo, imam problem sa PHP-om......
ja sam napravio PHP(2 skripte) jedna detekcija.php, druga index1.php
u detekciji se kriju podatci koji ce da iscitaju info o ip broju i o ip adresi......
dakle da prikazu korisniku sta koristi.....
e sad ja hocu da mi info o ip-u i o os-u cuva u jedan log fajl.....dakle da imam uvid kakvi posetioci sve dolaze , sa kojim os-om i ip-om.
kako ovo da odradim.....
evo oba koda:
detekcija.php
Code:

<?php

    class Browser {

    var $os;           // Operating System (Linux, Solaris, Windows)

    var $remote_ip;


    function Browser() {
      global $teststring;
      if ($teststring != "" ) {
        $agentstring = $teststring;
        $testwarn = "yes";
      } else {
        $agentstring = $_SERVER['HTTP_USER_AGENT'];
      }
      $http_lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
      # get some values from the $HTTP_USER_AGENT variables
      $luser_agent0=explode("(",$agentstring);
      $luser_agent1=explode(")",$luser_agent0[1]);
      $luser_agent2=explode(";",$luser_agent1[0]);



      # Which operating systems do we want to detect? 
      # How do we want to call them?
      $det_os = array (
        array("Linux","Linux"), // Some prefer "GNU/Linux"
        array("FreeBSD","FreeBSD"),
        array("OpenBSD","OpenBSD"),
        array("NetBSD","NetBSD"),
    array("Windows 2000","Windows","2000","Microsoft"),
    array("Windows NT 5.0","Windows","2000","Microsoft"),
        array("Windows NT 5.1","Windows","XP","Microsoft"),
        array("Windows NT 5.2","Windows","2003","Microsoft"),
        array("Windows NT","Windows","NT 4.0","Microsoft"),
        array("Windows XP","Windows","XP","Microsoft"),
        array("Windows 95","Windows","95","Microsoft"),
        array("Windows 98","Windows","98","Microsoft"),
        array("Windows ME","Windows","ME","Microsoft"),
        array("WinNT4.0","Windows","NT 4.0","Microsoft"),
        array("Win98","Windows","98","Microsoft"),
        array("Win95","Windows","95","Microsoft"),
        array("mac os x","MacOS","X","Apple"),
        array("Mac OS X","MacOS","X","Apple"),
        array("MacOS X","MacOS","X","Apple"),
        array("Mac_PowerPC","MacOS","","Apple"),
        array("Macintosh","MacOS","","Apple"),
        array("macintosh","MacOS","","Apple"),
    array("OS/2","OS/2","","IBM"),
    array("SunOS 5.7","Solaris","5.7","Sun"),
    array("SunOS 5.8","Solaris","5.8","Sun"),
    array("SunOS 5.9","Solaris","5.9","Sun"),
    array("SunOS","Solaris","","Sun"),
    array("AIX","AIX","","IBM"),
    array("HP-UX","HP-UX","","HP"),
    array("IRIX","IRIX","","Sgi"),
    array("BeOS","BeOS","","Be"),
    array("Unix","UNIX","",""),
    array("UNIX","UNIX","",""),
    array("unix_sv","UNIX","","SCO"),
    array("X11","UNIX","","")
      );
      
    

      #####################
      ##### FUNCTIONS #####
      #####################
      
      # function to give the $os variable the right string.
      # $arg1 is where to look.
      # $arg2 is the list we want to search with.
      function testos ($arg1,$arg2)
      {
        for ($i = 0; $i <= sizeof($arg2); $i++){
          if ((strpos($arg1,$arg2[$i][0])) || ($arg1 == $arg2[$i][0])){
            $os=$arg2[$i][1];
        if ($arg2[$i][2] != ""){
          $os_ver=$arg2[$i][2];
        }
        if ($arg2[$i][3] != ""){
          $os_vendor=$arg2[$i][3];
        }
        return array($os,$os_ver,$os_vendor);
          }
        }
      }
      
      # give the $os variable the right string.
    $os=testos($luser_agent2[2],$det_os);
        if (($os == NULL) && ($luser_agent2[0] == "Macintosh")){
          $os[0]="MacOS";
        }
       
      
      // remote ip
      $this -> remote_ip = $_SERVER["REMOTE_ADDR"];
      $remote_ip = $this -> remote_ip;
      
      #####################################################
      ##### If they're not detected, they're unknown. #####
      #####################################################
      
      if ($os[0] == NULL) $os[0]="nepoznato";
      if ($remote_ip == NULL) $remote_ip="nepoznato";
      

      ########################################      
      ##### put results into member vars #####
      ########################################
 
      $this -> os = $os[0];
      $this -> remote_ip = $remote_ip;
}




      

      
      #########################
      ##### test function #####
      #########################
      function test()
        {
     $os = $this -> os;
     $remote_ip = $this -> remote_ip;
    
                
    
      echo "Vi koristite:<b> $os </b> ";
      echo "<br>";
      echo "Sa trenutnim IP brojem: <b>$remote_ip</b>";
      
      }
         
}
$os=fopen('log.txt' , 'w');
$remote_ip=fopen('log.txt' , 'w+');
fwrite($os,$remote_ip);
?>  evo ja sam ovde dodao ovo, ali ne radi.....napravi log fajl, ali ne upise informacije u njega.


index1.php
Code:

<?php
  echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 4.01 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
  <head>
    <title>Detekcija OS-a i IP broja</title>
  </head>
  <body>
  <?php
    include("detekcija.php");
    $b = new Browser;
    
    // uncomment to log user agent strings.
    // $b -> logger("agentstrings.txt");
    
    $b -> teststring = $teststring;
    $b -> test();
    

    

  ?>  

</body>
</html>


dakle ako neko zna kako da ovo izvedem neka javi......
Pozdrav....
[ Goran Rakić @ 02.08.2003. 01:35 ] @
Prvo, hajde ovu datoteku sa klasom dodaj kao prilog uz poruku, a ukloni ovo čudo sa stranice.

Drugo, ona pomenuta metoda logger() u klasi ne postoji.
Treće onaj kod što si dodao pokazuje da moraš da pročitaš o Objektnom programiranju u PHP-u, Opsegu varijabli u funkcijama, Klasama i objektima, pa još jednom o opsegu varijabli.

Mali hint: $os i $remote_ip su varijable unutar klase Browser koju si instancirao preko tokena new. Unutar te klase tim varijablama pristupaš preko ugrađene reference na objekat $this. Tako da u nekoj metodi klase možeš koristiti $this->os za pristup varijabli. Van klase ne možeš pristupati podacima u klasi, osim ako nisi uradio instancu klase jer se tek tada rezerviše memorija za varijable u klasi. Tada imaš referencu pod kojom si uradio instancu, u tvom slučaju $b u index.php. Preko te reference možeš pristupiti klasi, ali samo nakon što je ona instancirana. Dalje saznaj sam, pa ćemo da te korigujemo.

Četvrto, pročitaj manual o Filesystems funkcijama, na funkciji fwrite imaš celo parče koda. Ovo tvoje ništa ne valja, moraš imati jedan fopen (pročitaj malo o parametrima pa ćeš videti da tebi zapravo treba a+, a ne w+), nakon tog fopena-a radiš fwrite i na kraju fclose, inače osta tvoja datoteka pod lock-om...

[ arsa x @ 02.08.2003. 01:37 ] @
http://www.elitesecurity.org/tema/25528/0#176025
[ manca @ 03.08.2003. 18:45 ] @
ne arsa....
ne treba mi brojac nego skripta koja ce da detektuje os i ip adresu/////
[ arsa x @ 03.08.2003. 18:57 ] @
Da manca nije to sto ti treba al moze ti pomoci.
Mozes vrlo lako da iskoristis skriptu uz malu prepravku za upisivanje u log file
[ Goran Rakić @ 03.08.2003. 19:42 ] @
Ja sam ti dao dovoljno detaljan odgovor. Potrudi se malo, pa kada saznaš nešto novo, dodji sa novim pitanjem. U suprotnom It Jobs je tu.
[ manca @ 03.08.2003. 23:41 ] @
pa ne znam kako da to uradim.....
Gorane da stavim li skriptu u vec postojecu klasu browser , ili da napisem izva nje>>>>???
[ Goran Rakić @ 03.08.2003. 23:56 ] @
Najbolje je da napišeš novu metodu klase Browser koja će raditi logging. Onda nju, ili da pozoveš iz ove već postojeće metode (koju koristiš za čitanje parametara) ili da je pozivaš preko inicijalizovanog objekta iz index.php-a.
[ manca @ 04.08.2003. 17:18 ] @
Gorane mozes li nekako ti da mi napises neku takvu skriptu....da ja ne lupam glavu sad.....
ako ti nije problem napisi i posalji na manca1 na verat.net
mislim ako oces
Hvala
[ Goran Rakić @ 04.08.2003. 17:25 ] @
pa to ne bi bilo zanimljivo, zar ne? ma hajde možeš ti to potrudi se malo...
[ peja @ 04.08.2003. 22:26 ] @
ma ok je Gorane mozes da mu posaljes....
da se ne muci vise
[ Goran Rakić @ 04.08.2003. 23:40 ] @
Prvo da ti kažem ona klasa je dosta loša. Ima par grešaka sa globalnim varijablama i u principu je dosta loša. Drugo šta ti linija "$b -> teststring = $teststring;" znači uopšte. Pošto želiš da skripta očita trenutni browser, globalni $teststring mora da bude "", odnosno NULL. Zato ga slobodno ostavi neinicijalizovano, ili zameni onu liniju sa $teststring="". E sada ti kada si uradio $b=new Browser(), ti si alocirao memoriju i pozvao instancu klase Browser, odnosno izvršio njen konstruktor, metodu Browser() klase Browser. Metoda inicijalizuje $agentstring varijablu. Odatle izvlači $luser_agent0, 1 i 2. Zatim inicijalizuje ovaj veeeliki višedimenzionalni niz. Sledeće što ti radiš (izuzev one gluposti sa $textstring koja veze sa vetzom nema jer u klasi dinamički pravi neku novu varijablu i inicijalizuje je vrednošću neinicijalizovane varijable, što rezultira sa lepim NULL) je da pozivaš test() metodu kalse Browser. E sada ona varijable klase prepisuje u lokalne varijable $os i $remote_ip, ali ja ne vidim gde se one inicijalizuju tako da sumnjam da ti ovo prikazuje bilo šta. Onda si ti dodao one tri pogrešne linije van klase, koje se izvrše kada uradiš include datoteke, ali su varijable neinicijalizovane, tj van one metode test() $os ne postoji kao varijabla. A ti si još stavio ne da upišeš te vrednosti već da filedescriptor otvorenog fajla strpaš u tu (za taj deo koda) novu promenljivu.

E sada funkcija koja nešto može da uradi je testos() koja kao parametre očekuje onaj veeeliki niz i niz koji je skripta izvukla od korisnikovih podataka. Ali to mi se čini da isto ne radi. Odakle bre izvuče ovaj kod?

Kako bi to trebalo da izgleda: SA GOMILOM ISPRAVLJENIH GREŠAKA, ZAGRADA, RASPOREDA DELOVA KODA...

Code:

<?php

    class Browser {

    var $os;
    var $remote_ip;
 
      
      # function to give the $os variable the right string.
      # $arg1 is where to look.
      # $arg2 is the list we want to search with.
      function testos($arg1,$arg2)
      {
        for ($i = 0; $i <= sizeof($arg2); $i++){
          if ((strpos($arg1,$arg2[$i][0])) || ($arg1 == $arg2[$i][0])){
            $os=$arg2[$i][1];
    if ($arg2[$i][2] != ""){
      $os_ver=$arg2[$i][2];
    }
    if ($arg2[$i][3] != ""){
      $os_vendor=$arg2[$i][3];
    }
    
    return array($os,$os_ver,$os_vendor);
          }
        }
    
    }

      
    
    function Browser() {
        $agentstring = $_SERVER['HTTP_USER_AGENT'];
        $http_lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    
      // ovo rastavlja $_SERVER['HTTP_USER_AGENT'];
      // na pojedine delove
      $luser_agent0=explode("(",$agentstring);  
      $luser_agent1=explode(")",$luser_agent0[1]);
      $luser_agent2=explode(";",$luser_agent1[0]);

     /*print_r($luser_agent2); daje:
     
      Array ( 
         [0] => X11 
     [1] => U 
     [2] => Linux i686 
     [3] => en-US 
     [4] => rv:1.4b 
    )     
     */

      # Which operating systems do we want to detect? 
      # How do we want to call them?
      $det_os = array (
        array("Linux","Linux"), // Some prefer "GNU/Linux"
        array("FreeBSD","FreeBSD"),
        array("OpenBSD","OpenBSD"),
        array("NetBSD","NetBSD"),
array("Windows 2000","Windows","2000","Microsoft"),
array("Windows NT 5.0","Windows","2000","Microsoft"),
        array("Windows NT 5.1","Windows","XP","Microsoft"),
        array("Windows NT 5.2","Windows","2003","Microsoft"),
        array("Windows NT","Windows","NT 4.0","Microsoft"),
        array("Windows XP","Windows","XP","Microsoft"),
        array("Windows 95","Windows","95","Microsoft"),
        array("Windows 98","Windows","98","Microsoft"),
        array("Windows ME","Windows","ME","Microsoft"),
        array("WinNT4.0","Windows","NT 4.0","Microsoft"),
        array("Win98","Windows","98","Microsoft"),
        array("Win95","Windows","95","Microsoft"),
        array("mac os x","MacOS","X","Apple"),
        array("Mac OS X","MacOS","X","Apple"),
        array("MacOS X","MacOS","X","Apple"),
        array("Mac_PowerPC","MacOS","","Apple"),
        array("Macintosh","MacOS","","Apple"),
        array("macintosh","MacOS","","Apple"),
array("OS/2","OS/2","","IBM"),
array("SunOS 5.7","Solaris","5.7","Sun"),
array("SunOS 5.8","Solaris","5.8","Sun"),
array("SunOS 5.9","Solaris","5.9","Sun"),
array("SunOS","Solaris","","Sun"),
array("AIX","AIX","","IBM"),
array("HP-UX","HP-UX","","HP"),
array("IRIX","IRIX","","Sgi"),
array("BeOS","BeOS","","Be"),
array("Unix","UNIX","",""),
array("UNIX","UNIX","",""),
array("unix_sv","UNIX","","SCO"),
array("X11","UNIX","","")
      );
      

      // OVO MORA BITI OVDE A NE GDE JE BILO!
     # give the $os variable the right string.
         $os=$this->testos($luser_agent2[2],$det_os);
        if (($os == NULL) && ($luser_agent2[0] == "Macintosh")){
          $os[0]="MacOS";
        }
      
      if ($os[0] == NULL) $os[0]="nepoznato";
      if ($remote_ip == NULL) $remote_ip="nepoznato";
             
      // i ovo fali!
      $this->os=$os[0];
      
      // remote ip
      $this->remote_ip = $_SERVER["REMOTE_ADDR"];      
      
           
} // ovo je ovde falilo!  

      
// ovde je bilo viska zagrada!


// sada OVDE dodajem novu metodu:
function zapisi($file) {
   $fp=fopen($file,'a+');
   fwrite($fp,"IP: $this->remote_ip\nOS: $this->os\n\n");
   fclose($fp);
}

}




// ovaj deo ubacis u index.php
// ako neces da prikazujes podatke, ti udri jednu tarabu ispred ovog echo
$b=new Browser();
echo('IP adresa: '.$b->remote_ip.'<br>OS: '.$b->os.'<br>');
$b->zapisi('log.txt');


?>
[ manca @ 05.08.2003. 14:26 ] @
E hvala ti Gorane mnogo !!!!
[ Goran Rakić @ 05.08.2003. 15:46 ] @
Ja bih ti preporučio da sedneš i malo naućiš PROCEDURALNI php, a onda pređeš na OOP.
[ manca @ 05.08.2003. 22:20 ] @
OK......
ja sam ovo napravi uz pomoc tutora, i radilo je, ali nisam znao kako da uradim da mi zapisuje u odredjeni fajl....
Ipak hvala ti!!