Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczyć przed wielokrotnym wykonaniem skryptu wywołanego zdalnie
Forum PHP.pl > Forum > PHP
markonix
Kod HTML:
  1. <iframe src="http://example.com/count.php" width="1" height="1"></iframe>
  2. <iframe src="http://example.com/count.php" width="1" height="1"></iframe>
  3. <iframe src="http://example.com/count.php" width="1" height="1"></iframe>


Kod PHP:

  1. <?php
  2.  
  3. if (time() - $_SESSION['last_vistit'] <= 10) {
  4. die();
  5. }
  6.  
  7. $_SESSION['last_vistit'] = time();
  8.  
  9. mysql_query('INSERT INTO `test` SET `value` = "'. $_SESSION['last_vistit'] .'"');


W jaki sposób zabezpieczyć skrypt count.php aby zapobiec dodaniu do bazy 3 wierszy?
Jak widać zabezpieczyłem skrypt przez zbyt szybkim wywołaniem, jak odświeżę stronę to zabezpieczenie działa.
Ale gdy wczytam stronę z ramkami iframe to dodają się od 1 do 3 razy - co ciekawe nie ma normy.
Wazniak96
Jakbyś zapisał do bazy także ip to można byłoby wykorzystać zapytanie coś w stylu:
  1. INSERT INTO test (value)
  2. SELECT * FROM (SELECT {$_SESSION['last_vistit']}) AS tmp
  3. WHERE NOT EXISTS (
  4. SELECT value FROM test WHERE `ip` = {$ip} AND `value` >= time() - 10
  5. ) LIMIT 1;
  6.  


Wolna myśl... Nie wiem czy zadziała.
KsaR
Na sesji nie rob bo to glupota...

  1. <?php
  2. $time = file_get_contents('./time.txt', false, stream_context_create(array('http'=>array('ignore_errors'=>true))));
  3. if ($time == false) {
  4. $time=time();
  5. file_put_contents('./time.txt', ($time+10));
  6. }
  7. elseif ($time-time()>0) {
  8. }
  9.  
  10. mysql_query('INSERT INTO `test` SET `value` = "'. $time .'"');

Chyba że musisz oddzielnie dla każdego użytkownika to wtedy możesz jak wyżej tylko zamiast IP to ID tongue.gif
Wazniak96
@up i jak niby powiąże ID z użytkownikiem? Przez sesje, która w poprzednim skrypcie dała ciała czy przez COOKIES, które można skasować?
markonix
Baza chyba by rozwiązała sprawę bo blokuje tabelę (lock) jednakże skrypt count ma dość spory ruch (milionowy) i potrzebuje rozwiązania optymalnego.
Byłem pewien że sesje wystarczają, dopiero po jakimś czasie zauważyłem, że jest tu luka..

Ps. Tak. Count.php musi być powiązany z użytkownikiem ale tutaj chodzi nie o użytkownika, a internautę, który wejdzie na stronę nie odnotował wejść z liczbie X tylko w jednej.
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.