Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Ochrona skryptu przed wieloma uzytkownikami jednoczesnie
Forum PHP.pl > Forum > PHP
Wolfie
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 ?
vokiel
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. ?>
Wolfie
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?
dr_bonzo
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.
Wolfie
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 ?
dr_bonzo
Dzizez, zobacz jak sie przekazuje dane do: curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
Wolfie
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!
dr_bonzo
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. ?>
Wolfie
Tak jak napisalem wyzej uzylem tablicy w postaci :


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


I jest wszystko ok.

Dzieki.
dr_bonzo
Tja, tylko moja odpowiedz pojawila sie przed twoja edycja posta wiec...
Wolfie
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
dr_bonzo
Jak tablica ci sie przesyla? Zgodnie z manualem na drugim serwerze dostaniesz

$_POST['xml' ] == $data (czyli string z xmlem)
Wolfie
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.