Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Ochrona skryptu przed wieloma uzytkownikami jednoczesnie
Wolfie
post 17.12.2008, 10:41:47
Post #1





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Witam


Napisalem skrypt ktory pobiera dane z pewnej stronki do ktorej bedzie mialo dostep wiele osob.
Skrypt wyglada nastepujaco :

Kod

<?php

$code = $_POST['kod'];
$name =  $_POST['imie'];

fopen('test.xml', 'a');

$file='test.xml';
chmod($file,0666);

$filename = 'test.xml';
$data = '<?xml version="1.0" encoding="utf-8"?><zapytanie><imie>'.$name.'</imie><kod>'.$code.'</kod></zapytanie>';
//$file_path = ".;c:\Program Files\WebServ\cUrl";


if(!function_exists('file_put_contents')) {
     function file_put_contents($filename, $data) {
       $fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
         if(!$fp) {
           trigger_error('file_put_contents cannot write in file.', E_USER_ERROR);
           return;
         }
       fwrite($fp, $data);
       fclose($fp);
     }
   }

file_put_contents($filename, $data);


$ch = curl_init();

//curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_NOBODY, 1);

$data = array('xml' => file_get_contents('test.xml'));

curl_setopt($ch, CURLOPT_URL, 'http://[jakishost]/test/zgloszenie.php');
//curl_setopt($ch, CURLOPT_URL, 'http://[jakishost]/test/weryfikacja.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


$output = curl_exec($ch);
echo $output;
if (curl_errno($ch)) {
     echo 'Błąd #' . curl_errno($ch) . ': ' . curl_error($ch);
}

curl_close($ch);

$file2 = 'back.xml';

$fo = fopen($file2, "a");
flock($fo, 2);
fwrite($fo, $output);
flock($fo, 3);
fclose($fo);
?>



Sprawa wyglada tak , ze uzytkownik wpisuje swoje imie oraz unikatowy kod do formularza.Wciskajac przycisk akceptacji uruchamia powyzszy skrypt.Skrypt zapisuje jego dane w pliku xml i wysyla na inny serwer. Na owym serwerze jest skrypt zgloszenie.php ktory odsyla takze xml-a z odpowiedzia czy zgloszenie jest poprawne (weryfikuje kod). Odeslany plik xml jest zapisywany przez moj skrypt do pliku back.xml.
Moje pytanie brzmi.
Czy istnieje w tym przypadku zagrozenie, iz korzystanie dwoch czy wiecej osob z tego skryptu jednoczesnie moze zaklocic jego dzialanie?
Czy istnieje mozliwosc nadpisania danych zapisywanych w pliku test.xml jednego uzytkownika przez drugiego?
Jesli tak to jak sie przed tym ustrzec ?

Ten post edytował Wolfie 17.12.2008, 10:42:35
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
vokiel
post 17.12.2008, 11:15:07
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


Oczywiście, że istnieje możliwość nadpisania, i tak się stanie, ponieważ nazwa nie jest unikalna dla każdego użytkownika.
Musisz dla każdego użytkownika nadać unikalny kod, który będzie nazwą pliku.
Czyli np:
  1. <?php
  2. $code = $_POST['kod'];
  3. $name =  $_POST['imie'];
  4. $usr_hash = sha1($code.'jakis_ciag_znany_tylko_tobie'.$name);
  5. ?>


--------------------
Go to the top of the page
+Quote Post
Wolfie
post 17.12.2008, 11:30:26
Post #3





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Rozumiem.
Czyli w ten sposob powstanie mi na dysku mnóstwo plików a tego chciałem uniknąć.
Tylko nie rozumiem dlaczego ten ciag znajduje sie miedzy dwoma zmiennymi ?

W takim razie musze nadawac najlepiej unikalne id losowo ?
Czy to jest dobry pomysl ?


Przed chwila wpadlem na pomysl zeby pliki xml generowac dynamicznie tzn bez zapisywania w pliku na dysku, wtedy nie byloby problemu z zapisywaniem wielu plikow na dysku.
Gdzie moge znalezc informacje jak generowac dynamicznie xml i od razu wysylac na serwer bez zapisywania na dysku?

Ten post edytował Wolfie 17.12.2008, 11:46:55
Go to the top of the page
+Quote Post
dr_bonzo
post 17.12.2008, 11:47:34
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Cytat
Czyli w ten sposob powstanie mi na dysku mnóstwo plików a tego chciałem uniknąć.

Masz wybor - albo dzialajacy skrypt albo 1 plik na dysku.


Cytat
W takim razie musze nadawac najlepiej unikalne id losowo ?
Czy to jest dobry pomysl ?

Nie mozesz uzyc bazy? Autoincrement itd? XML mozesz tez w bazie trzymac.

edit: po edicie wyzej

Ziomek, z tego co widze to niepotrzebnie XMLa do pliku zrzucasz - wyrzuc zapisywanie i zobacz co ci zostalo.

Ten post edytował dr_bonzo 17.12.2008, 11:49:51


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Wolfie
post 17.12.2008, 12:22:02
Post #5





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Wyrzucilem zapisywanie i zostalo cos takiego :

Kod
<?php

$code = $_POST['kod'];
$name =  $_POST['imie'];




$data = '<?xml version="1.0" encoding="utf-8"?><zapytanie><imie>'.$name.'</imie><kod>'.$code.'</kod></zapytanie>';


$ch = curl_init();

//curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_NOBODY, 1);

//$data = array('xml' => file_get_contents('test.xml'));

curl_setopt($ch, CURLOPT_URL, 'http://[jakishost]/test/zgloszenie.php');
//curl_setopt($ch, CURLOPT_URL, 'http://[jakishost]/test/weryfikacja.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//echo $data;
//die();


$output = curl_exec($ch);
echo $output;
if (curl_errno($ch)) {
    echo 'Błąd #' . curl_errno($ch) . ': ' . curl_error($ch);
}

curl_close($ch);

$file2 = 'back.xml';

$fo = fopen($file2, "w+");
flock($fo, 2);
fwrite($fo, $output);
flock($fo, 3);
fclose($fo);
?>


Niestety cos jest nie tak z wysylanymi danymi , tak jakby wysylaly sie same znaczniki bo od drugiego serwera dostaje w opowiedzi puste znaczniki xml.

Choc sprawdzilem echo $date po cUrl i wszystko wyglada prawidlowo.
Plick back.xml tez dostaje same znaczniki bez tresci w odpowiedzi.
Gdzie tu moze byc jakis blad ?

Ten post edytował Wolfie 17.12.2008, 12:29:53
Go to the top of the page
+Quote Post
dr_bonzo
post 17.12.2008, 12:29:45
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Dzizez, zobacz jak sie przekazuje dane do: curl_setopt($ch, CURLOPT_POSTFIELDS, $data);


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Wolfie
post 17.12.2008, 12:36:25
Post #7





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


No tak , tylko ze ja juz nie chce przesylac pliku a same dane ktore sa zawarte w zmiennej $data
W ten sposob zlikwiduje koniecznosc zapisywania wielu plikow na dysku i nie bede musial kontrolowac id uzytkownikow
A CURLOPT_POSTFIELDS sluzy do przesylania plikow z tego co widze.

Przerobilem kod w ten sposob :

Kod
$xml = array('xml' => $data);

curl_setopt($ch, CURLOPT_URL, 'http://[jakishost]/test/zgloszenie.php');
//curl_setopt($ch, CURLOPT_URL, 'http://[jakishost]/test/weryfikacja.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

echo $xml;

$output = curl_exec($ch);
echo $output;
if (curl_errno($ch)) {
    echo 'Błąd #' . curl_errno($ch) . ': ' . curl_error($ch);
}

curl_close($ch);


Teraz wszystko dziala

Dzieki!

Ten post edytował Wolfie 17.12.2008, 12:41:35
Go to the top of the page
+Quote Post
dr_bonzo
post 17.12.2008, 12:40:56
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


EHHH, RTFM

Twoj orginalny kod:
  1. <?php
  2. $data = array('xml' => file_get_contents('test.xml'));
  3. ....
  4. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  5. ?>

Gdzie tutaj przesylasz plik?

przesylanie pliku teoretycznie bylo by podobne do:

  1. <?php
  2. curl_setopt($ch, CURLOPT_POSTFIELDS, 'test.xml');
  3. ?>


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Wolfie
post 17.12.2008, 12:50:01
Post #9





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Tak jak napisalem wyzej uzylem tablicy w postaci :


Kod
$xml = array('xml' => $data);


I jest wszystko ok.

Dzieki.
Go to the top of the page
+Quote Post
dr_bonzo
post 17.12.2008, 13:23:08
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Tja, tylko moja odpowiedz pojawila sie przed twoja edycja posta wiec...


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Wolfie
post 18.12.2008, 10:20:50
Post #11





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Zauwazylem pewien blad.
Mianowicie kwestia wyglada tak, ze gdy uzywam komendy :

Kod
$xml = array('xml' => $data);


to przesyla mi sie cala tablica , a ja chce przeslac tylko string xml , poniewaz drugi serwer odbirac moze tylko "czysty" plik xml a gdy wysylam tablice serwer odsyla mi blad.

Poprosze o jakies wskazowki
Go to the top of the page
+Quote Post
dr_bonzo
post 18.12.2008, 11:57:16
Post #12





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Jak tablica ci sie przesyla? Zgodnie z manualem na drugim serwerze dostaniesz

$_POST['xml' ] == $data (czyli string z xmlem)


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Wolfie
post 18.12.2008, 12:30:09
Post #13





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Masz racje , przeoczylem blad w swoim skrypcie , odwolywal sie nie do tego skryptu do ktorego powinen na drugim serwerze stad myslalem ze pojawia sie blad.


Pozdro
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 18:34