Skocz do zawartości

[PHP] register_globals ?


Kleszcz

Rekomendowane odpowiedzi

Witam

Czy ktoś wie jak przerobić ten kod porcjowania (stronicowania, paginacji) aby działał z wyłączoną opcją register_globals?

W tej chwili działa tylko dlatego, że w .htaccess mam wpis: php_flag register_globals 1

Zmienne $_GET są zdefiniowane... nie wiem dlaczego to nie chodzi.

Pozdrawiam

<?
if(isset($pag)) {$pag=$_GET['pag'];}
else{$pag='0';}

$ile='4';
$nowosc = '3';

$zapytanie=("SELECT * FROM `dziela` WHERE `visible`='tak' AND data>SUBDATE(NOW() , INTERVAL $nowosc DAY) ORDER BY `data` DESC ,`tytul` ASC  LIMIT ".($pag*$ile).", $ile");
//echo $zapytanie;

$wykonaj=mysql_query($zapytanie);
if(mysql_num_rows($wykonaj) > 0){

include('includes/wyniki.php');
?>
<br clear="all" /><div align="left" class="paginacja">
<?
list($wszystkich)=mysql_fetch_array(mysql_query("SELECT count(*) FROM `dziela`  WHERE `visible`='tak' AND data>SUBDATE(NOW() , INTERVAL $nowosc DAY) "));
$podstron=ceil($wszystkich/$ile-1);
   if ($pag>0) echo '« <a href="nowe,obrazy-'.($pag-1).'.html">Poprzednie</a>';
   for($x=0;$x<=$podstron;$x++){
	   if ($x==$pag) echo '<span class="sel">'.($x+1).'</span>';
	   else echo '<a href="nowe,obrazy-'.$x.'.html">'.($x+1).'</a>';
	   }
   if ($pag<$podstron) echo '<a href="nowe,obrazy-'.($pag+1).'.html">Następne</a>»';
echo '</div>';
//echo mysql_error();
}

//jesli brak wyników
else{
?>
<p>Niestety obecnie na stronie nie ma żadnych dzieł sprzed '.$nowosc.' dni.</p>
<?
}
?>

Odnośnik do komentarza
Udostępnij na innych stronach

Masz błąd przy isset.

<?
if(isset($_GET['pag']) && is_numeric($_GET['pag'])){
  $pag=(int)$_GET['pag'];
  if($pag < 0)
  $pag = 0;
}
else{
  $pag=0;
}
?>

I gigantyczne stężenie błędów na jedną linię kodu.

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

na samym początku skryptu:

<?
foreach ($_REQUEST as $var=>$val)
 {
global $$var;
$$var = $val;
 }
?>

@Mich@ł - nie powinien działać

if(isset($pag)) {$pag=$_GET['pag'];}
else{$pag='0';}

trzeba zmienić

if(!isset($pag)) {$pag=$_GET['pag'];}

else{$pag='0';}

lub jeszcze lepiej:

$pag = isset($_REQUEST['pag']) ? $_REQUEST['pag'] : 0;

Odnośnik do komentarza
Udostępnij na innych stronach

na samym początku skryptu:

<?
foreach ($_REQUEST as $var=>$val)
 {
global $$var;
$$var = $val;
 }
?>

inaczej extract($_REQUEST);

Tak się nie powinno robić, bo to tak naprawdę tak jak byście włączyli register_global ! Stosując takie konstrukcje wypaczacie intencje, wyłączania zmiennych globalnych. Zmienne globalne są blokowane po to by wiedzieć skąd przychodzą dane wysyłane do skryptu, zastosowanie kodu jak powyżej, rejestruje wszystkie zmienne przychodzące z zewnątrz jako globalne, przez co gubisz informacje o ich pochodzeniu. W takim wypadku lepiej już włączyć register_global i uważniej pisać kod, niż czuć się bezpiecznym bo ma się to wyłączone, ale tak naprawdę stosuje się sprytny hack który to omija( tak jak byście mieli super aucie, ale nigdy go nie włączali ).

Odnośnik do komentarza
Udostępnij na innych stronach

Tak się nie powinno robić, bo to tak naprawdę tak jak byście włączyli register_global !

To tak roboczo chyba tylko, celem łopatologicznego pokazania jakie zmienne istnięją (?).

Inco ma rację. Od siebie dodam, że taka konstrukcja (zarówno "extract" jak i wcześniejsza pętla) jest poważną luką w bezpieczeństwie strony (pozwala intruzowi wprowadzać swoje zmienne globalne do skryptu, co często pozwala na oszukanie zabezpieczeń). Do pokazania jakie zmienne istnieją radzę używać takiej konstrukcji:

echo "<pre>\n";
print_r($_POST);
print_r($_GET);
print_r($_COOKIE);
echo "\n</pre>\n";

https://pl.php.net/print_r

Skrypt chroniący zasoby serwera przed atakami botów exaBotDefender: https://docs.google.com/View?id=dgkd4pj4_0hfj5j4gx

Odnośnik do komentarza
Udostępnij na innych stronach

Do pokazania jakie zmienne istnieją radzę używać takiej konstrukcji:

print_r($_REQUEST);

;)

a jeszcze szerzej:

print_r($_SERVER);

"bytka abo ne bytka to je zapytka" - W. Shakespeare ;)

Niekończąca się impreza ;) ... wątroba zaleczona :D

Odnośnik do komentarza
Udostępnij na innych stronach

Jasne, że to poważna luka bezpieczeństwa i tak się nie powinno robić. Jednak jeśli nie da się włączyć register globals to chyba nie będziemy komuś przepisywać całego skryptu pod RG off tutaj na forum :)

Jeśli już mówić o bezpieczeństwie to dane też nie są w żaden sposób filtrowane. Z resztą to bez znaczenia czy w tym fragmencie będą. Pewnie reszta kodu jest napisana w ten sam sposób więc to bez różnicy, czy akurat ten mały fragment będzie bezpieczny czy nie.

Odnośnik do komentarza
Udostępnij na innych stronach

Jasne, że to poważna luka bezpieczeństwa i tak się nie powinno robić. Jednak jeśli nie da się włączyć register globals to chyba nie będziemy komuś przepisywać całego skryptu pod RG off tutaj na forum :)

Jeśli już mówić o bezpieczeństwie to dane też nie są w żaden sposób filtrowane. Z resztą to bez znaczenia czy w tym fragmencie będą. Pewnie reszta kodu jest napisana w ten sam sposób więc to bez różnicy, czy akurat ten mały fragment będzie bezpieczny czy nie.

Chyba nie do końca rozumiesz o co chodzi w problemie, filtrowanie to całkiem inny problem niż zmienne globalne. Wyłączając register_globals chronisz skrypt przed zewnętrzną inicjacją zmiennej, którą możesz wykorzystywać wewnątrz kodu, a której ręcznie nie za inicjowałeś w kodzie czyli, np.

if( $sPass == "12345" )
{
$bAdmin =  true;
}
else echo 'nie masz uprawnień !"

...
...
...
if( $bAdmin )
{
echo 'Witaj o wielki adminie'
}

Oczywiście ten przykład jest skrajnie wydumany, ale kiedyś się już z czymś podobnym spotkałem. Tak naprawdę nic nie mam przeciwko włączonemu register_globals, bo jak ktoś się pilnuje i inicjuje wszystkie zmienne, to nie ma się czego bać. Jednak wydaje mi się skrajnie niebezpieczne podejście gdy coś wyłączamy i czujemy się bezpiecznie, a później robimy 'hacka' i tylnymi drzwiami to włączamy, bo wtedy najczęściej tracimy czujność podczas pisania kodu.

Jasne że nikt nie oczekuje że zaraz sam przerobisz cały kod, ale też nie powinno się dawać takich rozwiązań bo one po jakimś czasie stają się panaceum na każdy źle działający skrypt, lepiej podpowiedzieć jak zdiagnozować problem, np. wypisać przy pomocy print_r($_REQUEST); wszystkie zmienne trafjące do skryptu.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności