Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak użyć "create_function" zamiast "eval"
Forum PHP.pl > Forum > Przedszkole
Weles
Witam!

Czytałem dzisiaj trochę w internecie, że Eval jest niby wolniejszy 20 krotnie niż "create_function", no i wbijam sobie w manuala:
http://php.net/manual/en/function.create-function.php
Ale nadal nie wiem jak zmienić:

  1. eval(stripslashes('?>'.($page['tresc_pl']).'<?'));


Aby było "create_function".
Chyba że źle wyczytałem i nie mogę użyć tej funkcji zamiast Evala?

A jeżeli nie, to jaki kod zamiast mojego musiałbym użyć aby to 'działało' ?

Pozdrawiam!
darko
Po co Ci tu eval/create_function? Wystarczy po prostu:
  1. echo stripslashes($page['tresc_pl']);
untorched
Wydaję mi się, że zawartość zmiennej $page['tresc_pl'] posiada w sobie jakieś skrypty i dlatego używa on funkcji eval()
pamil
You do it wrong!

ob_start()
include
ob_get_clean()
peter13135
Chyba powinnno być :
  1. <? echo 'hello world' ?>

a nie tak:
  1. ?> echo 'hello world' <?


No.. ale mogę się mylić, bo jeszcze nie doszedłem w swoim kursie php jak się rozpoczyna i kończy skrypt php tongue.gif
untorched
Cytat(peter13135 @ 27.08.2012, 23:06:09 ) *
No.. ale mogę się mylić, bo jeszcze nie doszedłem w swoim kursie php jak się rozpoczyna i kończy skrypt php tongue.gif


Widocznie w twoim kursie zapomnieli wspomnieć jak działa funkcja eval(), więc poczytaj o niej w manualu i może domyślisz się dlaczego jest tak a nie inaczej smile.gif Jeśli do eval() potrzebujesz wprowadzić zwykły kod HTML musisz zakończyć skrypt znakami ?>. Przykład:
  1. eval('echo "tekst";');
jest niczym innym jak:
  1. <?php echo "tekst"; ?>
więc jeśli chcesz wprowadzić HTML
  1. eval('?>Jakiś tekst <?php');
co da nam efekt
  1. <?php ?>Jakiś tekst <?php ?>
. Ale i tak polecam manual, bo nie sądzę, że zrozumiesz o co mi chodzi biggrin.gif
Weles
W zmiennej w evalu mam skrypty w PHP pobierane z Bazy Danych.
Więc jak to po co mi funkcja Eval? ^.^

Czy jest po prostu jakiś szybszy/lepszy zamiennik tej funkcji?

Pozdrawiam!
pamil
Cytat(Weles @ 28.08.2012, 02:14:33 ) *
W zmiennej w evalu mam skrypty w PHP pobierane z Bazy Danych.
Więc jak to po co mi funkcja Eval? ^.^

Czy jest po prostu jakiś szybszy/lepszy zamiennik tej funkcji?

Pozdrawiam!


Cytat(pamil @ 27.08.2012, 22:48:08 ) *


Lub system szablonów.
Weles
Cytat(pamil @ 28.08.2012, 15:49:24 ) *
Lub system szablonów.


Nie rozumiem jak mogę zaincludować zmienną? ;f
Helid
  1. $kod_php = 'echo "test";';
  2. $newfunc = create_function('$a', $kod_php);
  3. echo $newfunc;
darko
Cytat(Weles @ 28.08.2012, 02:14:33 ) *
W zmiennej w evalu mam skrypty w PHP pobierane z Bazy Danych.
Więc jak to po co mi funkcja Eval? ^.^

Czy jest po prostu jakiś szybszy/lepszy zamiennik tej funkcji?

Pozdrawiam!

Proponuję zmienić podejście i całkowicie przeprojektować aplikację. Trzymanie skryptów w bazie i wykonywanie ich za pomocą eval to potencjalne zaproszenie do skorzystania z otwartej furtki dla atakującego i proszenie się o problemy.
Weles
Cytat(darko @ 28.08.2012, 19:11:28 ) *
Proponuję zmienić podejście i całkowicie przeprojektować aplikację. Trzymanie skryptów w bazie i wykonywanie ich za pomocą eval to potencjalne zaproszenie do skorzystania z otwartej furtki dla atakującego i proszenie się o problemy.


Korzystam z evala 2 lata i od tego czasu jakoś żadnych problemów nie miałem, więc pierdoły że Eval to zło, to czyste bzdury jak dla mnie :f
Po prostu trochę jest wolne i to mnie wkurza.
A trzymać kod PHP w bazie bardzo lubię, ponieważ sobie napisałem odpowiedni edytorek i mogę w każdej chwili edytować i dodawać nowe podstrony bez edycji czego kolwiek, a gdyby nie kod w bazie, to bym musiał się bawić w fopen i tego typu rzeczy, a tak jest dużo.. hmm.. ciekawiej tongue.gif
A skoro jakaś funkcja istnieje (czyli do czytania skryptów PHP z bazy) to jest ona do użytku, co innego gdyby takiej funkcji nie było tongue.gif
Pozdrawiam.

@2UP:
EDIT:
Próbowałem chyba na kilkanaście sposobów i cały czas jak nie błąd zewnętrzny serwera, to brak całkowicie tekstu.
darko
Cytat(Weles @ 28.08.2012, 19:50:31 ) *
Korzystam z evala 2 lata i od tego czasu jakoś żadnych problemów nie miałem, więc pierdoły że Eval to zło, to czyste bzdury jak dla mnie :f
Po prostu trochę jest wolne i to mnie wkurza.
A trzymać kod PHP w bazie bardzo lubię, ponieważ sobie napisałem odpowiedni edytorek i mogę w każdej chwili edytować i dodawać nowe podstrony bez edycji czego kolwiek, a gdyby nie kod w bazie, to bym musiał się bawić w fopen i tego typu rzeczy, a tak jest dużo.. hmm.. ciekawiej tongue.gif
A skoro jakaś funkcja istnieje (czyli do czytania skryptów PHP z bazy) to jest ona do użytku, co innego gdyby takiej funkcji nie było tongue.gif
Pozdrawiam.

@2UP:
EDIT:
Próbowałem chyba na kilkanaście sposobów i cały czas jak nie błąd zewnętrzny serwera, to brak całkowicie tekstu.

Proponuję poświęcić kilka minut, wklepać w wujka google "php eval vulnerability" i nie zarzucać mi wypisywania bzdur na forum. To, co opisałeś to jest według mnie sztuka dla sztuki, bo nie jest to nic, czego normalnym (każdym) edytorem tekstowym nie można byłoby zrobić (mam na myśli edycję kodu php), a tylko powodujesz same straty:
1) zupełnie zbędny dodatkowy narzut żądań które lecą do bazy
2) spadek wydajności (sam przyznałeś, że eval jest powolny), poza tym po co wyciągać kod php z bazy, jeśli od tego są skrypty php? może w takim razie w ogóle zrezygnujesz ze skryptów php, przecież wszystko można wyciągnąć z bazy i jednym evalem wykonać jeden wielki kod?
3) narażenie aplikacji na potencjalne niebezpieczeństwo (tzw. eval injection, patrz użycie eval)
4) o złych praktykach programistycznych nie wspominając (tak, użycie eval właśnie jest taką złą praktyką)
pamil
Dodając do tego, że to wszystko można uzyskać dużo lepiej, buforując dane, funkcje podałem w moim pierwszym poście w tym temacie.
Każde wystąpienie eval() da się zastąpić porządniejszym kodem.

Cytat(Weles @ 28.08.2012, 19:50:31 ) *
A trzymać kod PHP w bazie bardzo lubię, ponieważ sobie napisałem odpowiedni edytorek i mogę w każdej chwili edytować i dodawać nowe podstrony bez edycji czego kolwiek, a gdyby nie kod w bazie, to bym musiał się bawić w fopen i tego typu rzeczy, a tak jest dużo.. hmm.. ciekawiej tongue.gif

A skoro jakaś funkcja istnieje (czyli do czytania skryptów PHP z bazy) to jest ona do użytku, co innego gdyby takiej funkcji nie było tongue.gif

Ad. 1. Ta, a obrona przed hakerami, którzy uzyskali dostęp do systemu jest taka fascynująca, ciekawa. Ach ta adrenalina!
Ad. 2. Było też register_globals, magic quotes, safe mode, mysql_* i wiele innych. To czemu Ci źli ludzie je deprecjonują?
abort
Cytat(Weles @ 28.08.2012, 19:50:31 ) *
A trzymać kod PHP w bazie bardzo lubię, ponieważ sobie napisałem odpowiedni edytorek i mogę w każdej chwili edytować i dodawać nowe podstrony bez edycji czego kolwiek, a gdyby nie kod w bazie, to bym musiał się bawić w fopen i tego typu rzeczy, a tak jest dużo.. hmm.. ciekawiej tongue.gif

No i nie zapominajmy o gigantycznej wartości edukacyjno-poznawczej takiego kodu: mamy tu klasyczny przykład rekurencji: kod PHP służy do oczytywania z bazy danych kodu PHP, za pomocą którego to kodu będziemy odwoływali sie do bazy i zapisywali dane - oczywiście jednocześnie z kodem PHP, którym to kodem będziemy te dane obrabiać...
No, muszę powiedzieć, że można byłoby nawet potraktować to jako dość oryginalne podejście do filozofii obiektowej, dziedziczenia, polimorfizmu i takich tam. No i cały PHP Core team w zasadzie już jest bezrobotny - polimorfizm klas PHP w bazie danych SQL smile.gif

Czy naprawdę nie przyszło Ci na myśl, że odczytywanie czegokolwiek z bazy i potraktowanie tego eval()-em to niepotrzebne katowanie bazy danych i interpretera PHP?
Swoją drogą, zupełnie z ciekawości: jak masz zorganizowaną tę bazę tego Twojego kodu PHP, w sensie takim: ile kodu (najmniej) może zwrócić jedno zapytanie do bazy? Znak? Linię? Funkcję? Moduł?
erix
Cytat
Korzystam z evala 2 lata i od tego czasu jakoś żadnych problemów nie miałem, więc pierdoły że Eval to zło, to czyste bzdury jak dla mnie :f
Po prostu trochę jest wolne i to mnie wkurza.

Bo akcelerator nie ma możliwości zoptymalizowania tego kodu.

Cytat
A skoro jakaś funkcja istnieje (czyli do czytania skryptów PHP z bazy) to jest ona do użytku, co innego gdyby takiej funkcji nie było

Wiesz, wprowadzono niedawno goto w PHP, a jakoś nikt normalny z tego nie korzysta.
peter13135
Cytat
. Ale i tak polecam manual, bo nie sądzę, że zrozumiesz o co mi chodzi

hehe, faktycznie brzmi jak wykład z fizyki kwantowej.

Tak prawdę mówiąc, nie miałem okazji używać funkcji eval(), więc jak to z tymi tagami jest o tym nie widziałem. Teraz zerknąłem do manuala i już wiem. Na podstwie tego stwierdzam, że moje przypuszczenia miały sens. Bo skoro (tak jak napisałeś)
  1. eval('echo "tekst";');

wyświetla to samo co :
  1. <?php echo "tekst"; ?>


to wnioskuję, że taki kod :
  1. eval('?>echo "tekst";<?');

wyświetla to samo co :
  1. <?php ?> echo "tekst"; <??>

Co jest nieprawidłowe, bo to wyświetli zawartość skryptu (czyli echo "tekst" zamiast text). Przypuszczam, że autor chcę wykonać skrypt, a nie go wyświetlić (inaczej nie używał by evala)
untorched
Cytat(peter13135 @ 29.08.2012, 18:54:43 ) *
hehe, faktycznie brzmi jak wykład z fizyki kwantowej.

Tak prawdę mówiąc, nie miałem okazji używać funkcji eval(), więc jak to z tymi tagami jest o tym nie widziałem. Teraz zerknąłem do manuala i już wiem. Na podstwie tego stwierdzam, że moje przypuszczenia miały sens. Bo skoro (tak jak napisałeś)
  1. eval('echo "tekst";');

wyświetla to samo co :
  1. <?php echo "tekst"; ?>


to wnioskuję, że taki kod :
  1. eval('?>echo "tekst";<?');

wyświetla to samo co :
  1. <?php ?> echo "tekst"; <??>

Co jest nieprawidłowe, bo to wyświetli zawartość skryptu (czyli echo "tekst" zamiast text). Przypuszczam, że autor chcę wykonać skrypt, a nie go wyświetlić (inaczej nie używał by evala)


Cóż, faktycznie poraża mnie twoja inteligencja, żeby nie zrozumieć "wykładu z fizyki kwantowej". Ciężko się domyśleć, że skoro użył:
  1. eval('?>'.($page['tresc_pl']).'<?');
to zmienna zawiera jakiś kod HTML oraz skrypty. Może nie jest to dobry sposób, ale jeśli chce to niech używa. Obstawiam że zmienna $page['tresc_pl'] zwraca np:
  1. Mamy godzinę: <?php echo date('H:i:s'); ?>, dnia <?php echo date('d-m-Y'); ?>
Wykaż trochę wyobraźni zanim zaczniesz prawić morały.
peter13135
Akurat w tym temacie na każdym kroku kreuję się na osobę, która dopiero co czepiła się kursu PHP i nie ma ten ten temat większego pojęcia. Na podstawie czego wywnioskowałeś, że prawię morały ?

Jeśli przedszkolak w przedszkolu pyta się przedszkolanki "czemu ten kotek ma futerko w centki, czyżby zmieniał się w tygrysa ?" to znaczy, że prawi morały, czy może po prostu czegoś nie wie i chcę się dowiedzieć ?
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.