Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]PHP Notice: Undefined index: tgt_host
Forum PHP.pl > Forum > Przedszkole
Lopek
Napisałem skrypt co pozwala mi na sprawdzanie pingów i domeny hosta z poziomu strony www
gdy uruchamiam skrypt to mam komunikaty błędów..

PHP Notice: Undefined index: tgt_host in /.../pinguj.php on line 9,
PHP Notice: Undefined index: tgt_host in /.../pinguj.php on line 17,

Linia 9:
<input type='text' name='tgt_host' value="<?php echo $_POST['tgt_host']; ?>">

Linia 17:
$tgt_host = $_POST['tgt_host'];


Jak to naprawić. Mogę przesłac cały sktypt..
PS skrypt napisany jest wiazanie html + php, nie potrafie tego w całosci napisac w php
Dark Smark
Moim zdaniem musisz najpierw sprawdzić czy istnieje zmienna z tablicy super globalnej zanim ją chcesz wyświetlić, w przeciwnym wypadku zaraz na wejściu wyświetla Ci taki oto komunikat ponieważ jak ktoś nowy wchodzi na stronę, żadne dane metodą POST nie zostały przysłane..

  1. if (!empty($_POST['tgt_host']))
  2. {
  3. echo("<input type='text' name='tgt_host' value='$_POST['tgt_host']'>");
  4. }


PS: Używa się raczej znaku cudzysłowowa niż apostrofu w HTML.
Lopek
Cytat(Dark Smark @ 19.12.2013, 16:04:46 ) *
Moim zdaniem musisz najpierw sprawdzić czy istnieje zmienna z tablicy super globalnej zanim ją chcesz wyświetlić, w przeciwnym wypadku zaraz na wejściu wyświetla Ci taki oto komunikat ponieważ jak ktoś nowy wchodzi na stronę, żadne dane metodą POST nie zostały przysłane..

  1. if (!empty($_POST['tgt_host']))
  2. {
  3. echo("<input type='text' name='tgt_host' value='$_POST['tgt_host']'>");
  4. }


PS: Używa się raczej znaku cudzysłowowa niż apostrofu w HTML.



Czy mogę wysłać na prywatne konto e-mail cały skrypt do poprawki byłbym wdzięczny...
Z uwagi na mój wiek mam już niestety coraz większe problemy z programowaniem,
dlatego potrzebuje pomocy... Na tym forum jestem po raz pierwszy
com
zwyczajem tego forum jak w zasadzie wszystkich jest aby zamieszczać rozwiązania w ramach postów na forum, z tego względu iż osoba która będzie miała podobny problem pewnie trafi na ten post i wtedy nie uzyska odpowiedzi, która może być dla niej ważna, generalnie Pana problem polega na tym że zanim przekażę Pan do value jakąś wartość to przy pierwszym wywołaniu i braku wysłanego formularza zawartość w tablicy globalnej post jest pusta dlatego trzeba sprawdzić czy wysłaliśmy już jakieś dane smile.gif A jak to zrobić zostało opisane powyżej wink.gif
Lopek
Cytat(com @ 19.12.2013, 16:35:33 ) *
zwyczajem tego forum jak w zasadzie wszystkich jest aby zamieszczać rozwiązania w ramach postów na forum, z tego względu iż osoba która będzie miała podobny problem pewnie trafi na ten post i wtedy nie uzyska odpowiedzi, która może być dla niej ważna, generalnie Pana problem polega na tym że zanim przekażę Pan do value jakąś wartość to przy pierwszym wywołaniu i braku wysłanego formularza zawartość w tablicy globalnej post jest pusta dlatego trzeba sprawdzić czy wysłaliśmy już jakieś dane smile.gif A jak to zrobić zostało opisane powyżej wink.gif


Wysyłam pełny kod mojego skryptu łączy kod html z php..
Kod
<html><body>
<div align='center'><font face='Arial'><big><big><b><font color="blue">Sprawdzanie pingów do dowolnego adresu IP<br>lub dowolnej domeny</font></b></big></big>
<form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">

<br><big><b>Host to ping & domains:</big></font><br><br>
<font face=\"Arial\"><b>Wpisz IP lub domenę do której chcesz pingować: &nbsp; </b></font><input type='text' name='tgt_host' value="<?php echo $_POST['tgt_host']; ?>">
<br><input type='submit' name='submit' value='Submit'>
</form></div></center></body></html>

<?php

$tgt_host = $_POST['tgt_host'];
$output = shell_exec("ping -c 3 $tgt_host");
echo "<center><table border='1'><tr><td bgcolor='#ffffcc' valign='top'>";
print("<pre><b>$output</b></pre>");
echo "</td></tr>";
$output = shell_exec("host $tgt_host");
echo "<tr><td bgcolor='#99ff99' valign='top'>";
print("<pre><b>$output</b></pre>");
echo "</td><tr></table></center>";
print "<br><br>&copy; <i>Janusz Szczecin 2013</i>";

echo "<html><body style='background-image: url(./image/blekit.jpg);'>
<script type='text/javascript' language='javascript'>alert(\"Błąd - brak poprawnego IP. ' . $output . '\");</script>
</body></html>";

?>


Może ktoś by to przerobił na wyłączny kod php. Z racji mojego wieku wiele danych uciekło już z głowy, z tego co pamiętam jeszcze co nieco potrafię zrobić, będę wdzięczny na poprawiona wersje zgodna z kodem php w całości i bez tego błedu Undefined index...
Gość
zmienne $_POST nie istnieja dopoki formularz nie zostanie wyslany,
trzeba sprawdzic czy istnieja i w zaleznosci od tego podejmowac dzialanie
isset
com
Na szybko coś takiego :
  1. <html><body>
  2. <div align='center'><font face='Arial'><big><big><b><font color="blue">Sprawdzanie pingów do dowolnego adresu IP<br>lub dowolnej domeny</font></b></big></big>
  3. <form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  4.  
  5. <br><big><b>Host to ping & domains:</big></font><br><br>
  6. <font face=\"Arial\"><b>Wpisz IP lub domenę do której chcesz pingować: &nbsp; </b></font><input type='text' name='tgt_host' value="<?php if(!empty($_POST['tgt_host'])) echo $_POST['tgt_host']; ?>">
  7. <br><input type='submit' name='submit' value='Submit'>
  8. </form></div></center></body></html>
  9.  
  10. <?php
  11. if(!empty($_POST['tgt_host']))
  12. {
  13. $tgt_host = $_POST['tgt_host'];
  14. $output = shell_exec("ping $tgt_host");
  15. echo "<center><table border='1'><tr><td bgcolor='#ffffcc' valign='top'>";
  16. print("<pre><b>$output</b></pre>");
  17. echo "</td></tr>";
  18. $output = shell_exec("host $tgt_host");
  19. echo "<tr><td bgcolor='#99ff99' valign='top'>";
  20. print("<pre><b>$output</b></pre>");
  21. echo "</td><tr></table></center>";
  22. print "<br><br>&copy; <i>Janusz Przybylski - SP1LOP 2013</i>";
  23. } else{
  24. $output = null;
  25. echo "<html><body style='background-image: url(./image/blekit.jpg);'>
  26. <script type='text/javascript' language='javascript'>alert(\"Błąd - brak poprawnego IP. ' . $output . '\");</script>
  27. </body></html>";
  28. }
  29. ?>
Lopek
Cytat(com @ 19.12.2013, 17:13:48 ) *
Na szybko coś takiego :
  1. <html><body>
  2. <div align='center'><font face='Arial'><big><big><b><font color="blue">Sprawdzanie pingów do dowolnego adresu IP<br>lub dowolnej domeny</font></b></big></big>
  3. <form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  4.  
  5. <br><big><b>Host to ping & domains:</big></font><br><br>
  6. <font face=\"Arial\"><b>Wpisz IP lub domenę do której chcesz pingować: &nbsp; </b></font><input type='text' name='tgt_host' value="<?php if(!empty($_POST['tgt_host'])) echo $_POST['tgt_host']; ?>">
  7. <br><input type='submit' name='submit' value='Submit'>
  8. </form></div></center></body></html>
  9.  
  10. <?php
  11. if(!empty($_POST['tgt_host']))
  12. {
  13. $tgt_host = $_POST['tgt_host'];
  14. $output = shell_exec("ping $tgt_host");
  15. echo "<center><table border='1'><tr><td bgcolor='#ffffcc' valign='top'>";
  16. print("<pre><b>$output</b></pre>");
  17. echo "</td></tr>";
  18. $output = shell_exec("host $tgt_host");
  19. echo "<tr><td bgcolor='#99ff99' valign='top'>";
  20. print("<pre><b>$output</b></pre>");
  21. echo "</td><tr></table></center>";
  22. print "<br><br>&copy; <i>Janusz Przybylski - SP1LOP 2013</i>";
  23. } else{
  24. $output = null;
  25. echo "<html><body style='background-image: url(./image/blekit.jpg);'>
  26. <script type='text/javascript' language='javascript'>alert(\"Błąd - brak poprawnego IP. ' . $output . '\");</script>
  27. </body></html>";
  28. }
  29. ?>


Bardzo mi przykro ale nic nie działa... Można sprawdzić wyniki:
- moja stara wersja: http://www.sr1bsz.ampr.org/pinguj.php
- nowa powyżej wersja: http://www.sr1bsz.ampr.org/pinguj-new.php
Dark Smark
ELSE nie jest potrzebne (do autora poprawionego kodu).
  1. <html><body>
  2. <div align='center'><font face='Arial'><big><big><b><font color="blue">Sprawdzanie pingów do dowolnego adresu IP<br>lub dowolnej domeny</font></b></big></big>
  3. <form method="post" name="pingform" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  4.  
  5. <br><big><b>Host to ping & domains:</big></font><br><br>
  6. <font face=\"Arial\"><b>Wpisz IP lub domenę do której chcesz pingować: &nbsp; </b></font><input type='text' name='tgt_host' value="<?php if (!empty($_POST['tgt_host'])) echo $_POST['tgt_host']; ?>">
  7. <br><input type='submit' name='submit' value='Submit'>
  8. </form></div></center></body></html>
  9.  
  10. <?php
  11. if (!empty($_POST['tgt_host'])) {
  12. $tgt_host = $_POST['tgt_host'];
  13. $output = shell_exec("ping -c 3 $tgt_host");
  14. echo "<center><table border='1'><tr><td bgcolor='#ffffcc' valign='top'>";
  15. print("<pre><b>$output</b></pre>");
  16. echo "</td></tr>";
  17. $output = shell_exec("host $tgt_host");
  18. echo "<tr><td bgcolor='#99ff99' valign='top'>";
  19. print("<pre><b>$output</b></pre>");
  20. echo "</td><tr></table></center>";
  21. print "<br><br>&copy; <i>Janusz Szczecin 2013</i>";
  22.  
  23. echo "<html><body style='background-image: url(./image/blekit.jpg);'>
  24. <script type='text/javascript' language='javascript'>alert(\"Błąd - brak poprawnego IP. ' . $output . '\");</script>
  25. </body></html>";
  26. }
  27. ?>



Ale i ja dodam coś od siebie, interesuje się również bezpieczeństwem systemów informatycznych i moim zdaniem Pana skrypt jest szalenie niebezpieczny. Pozwala przejąć kontrolę nad serwerem.
Polecenia można strumieniowo łączyć w systemie Linux (mniemam że nim jest serwer, za pomocą || czyli kilka poleceń wykonujemy naraz). Proszę spróbować wpisać w formularzu zamiast IP:
Kod
|| whoami

Kod
|| ls

Kod
|| cat ping.php

//^nazwałem przykładowo pana plik na serwerze ping.php, teraz proszę zajrzeć po poleceniu cat do źródła strony z poziomu przeglądarki (cały kod możemy podejrzeć), do tego dowolnego pliku...

i wiele wiele więcej, łącznie z podmianą tego skryptu na słowo SHAKOWANO!<html><body>
Lopek
Cytat(Dark Smark @ 19.12.2013, 17:32:05 ) *
ELSE nie jest potrzebne (do autora poprawionego kodu).

Ale i ja dodam coś od siebie, interesuje się również bezpieczeństwem systemów informatycznych i moim zdaniem Pana skrypt jest szalenie niebezpieczny. Pozwala przejąć kontrolę nad serwerem.
Polecenia można strumieniowo łączyć w systemie Linux (mniemam że nim jest serwer, za pomocą || czyli kilka poleceń wykonujemy naraz). Proszę spróbować wpisać w formularzu zamiast IP:
Kod
|| whoami

Kod
|| ls

Kod
|| cat ping.php

//^nazwałem przykładowo pana plik na serwerze ping.php, teraz proszę zajrzeć po poleceniu cat do źródła strony z poziomu przeglądarki (cały kod możemy podejrzeć), do tego dowolnego pliku...

i wiele wiele więcej, łącznie z podmianą tego skryptu na słowo SHAKOWANO!<html><body>



Oj to wywalam toto, chyba, że uda mi się zrobić jakąś bezpieczniejsza wersje.. Serdecznie dziękuje za informacje..
Dark Smark
Problem leży w linijce 13 i 17. czyli:

$output = shell_exec("ping -c 3 $tgt_host");
$output = shell_exec("host $tgt_host");

Zanim wywoła Pan polecenie za pomocą shell_exec (chodzi o wsadzenie tam zmiennej $tgt_host) musi Pan upewnić się że jest tam (w zmiennej tej) adres IP lub domeny (typu google.pl chyba że Pan chce tylko żeby działało dla IP). Nie może to być nic innego, szczególnie polecenia inne systemu linux, bo u Pana dało się więcej wywoływać poleceń typu PING i COŚJESZCZE:

  1. ping -c 3 || ls
czyli listowanie folderu, można również inne listować podająć inną ścieżke. Opis polecenia ls. Jednym poleceniem wydaje mi się, że też da się usunąć wszystkie pliki ze strony. Chodzi o polecenie rm (remove) z gwiazdką (wszystkie pliki). A jeśli serwer hostingu jest źle skonfigurowany można sformatować cały dysk (uszkodzić system Linux usuwając wszystkie pliki od gałęzi głównej /).
Lopek
Cytat(Dark Smark @ 19.12.2013, 17:49:53 ) *
Problem leży w linijce 13 i 17. czyli:

$output = shell_exec("ping -c 3 $tgt_host");
$output = shell_exec("host $tgt_host");

Zanim wywoła Pan polecenie za pomocą shell_exec (chodzi o wsadzenie tam zmiennej $tgt_host) musi Pan upewnić się że jest tam (w zmiennej tej) adres IP lub domeny (typu google.pl chyba że Pan chce tylko żeby działało dla IP). Nie może to być nic innego, szczególnie polecenia inne systemu linux, bo u Pana dało się więcej wywoływać poleceń typu PING i COŚJESZCZE:

  1. ping -c 3 || ls
czyli listowanie folderu, można również inne listować podająć inną ścieżke. Opis polecenia ls. Jednym poleceniem wydaje mi się, że też da się usunąć wszystkie pliki ze strony. Chodzi o polecenie rm (remove) z gwiazdką (wszystkie pliki). A jeśli serwer hostingu jest źle skonfigurowany można sformatować cały dysk (uszkodzić system Linux usuwając wszystkie pliki od gałęzi głównej /).


Już to usunąłem z serwera ten plik...
Muszę chyba ustawić kontrole czy to jest IP coś w stylu:
egrep -o "[9-0]+\.[0-9]+\.[0-9]+\.[0-9]+\"
czy domena badać co jest na końcu i ustawić te o które chodzi np.:
.pl, .org, .com etc.
przemyślę to...

Jeszcze raz serdecznie dziękuję za tak szybkie znalezienie babola, w tym skrypcie...
Dark Smark
Wyrażenia regularnie (zresztą php udostepnia do ich funkcje) to dobre rozwiązanie, niestety ja nie pomogę bo nie jestem specjalistą z regex. Co do rozwiązania badania domeny wedle ostatnich znaków też pomysł dobry wydaje się ale... nie do końca (zależy w jaki sposób zaimplementowane), jeśli ktoś wpisze:

Kod
|| ls || .pl


myślę, że wtedy przejdzie pozytywnie walidacje i znowu luka bezpieczeństwa skryptu. Projektując skrypty i interfejsy stron trzeba myśleć jak "użytkownik idiota" co może wpisać nie poprawnego, jak i zarazem myśleć jak haker (nieszablonowo i nie wedle przeznaczenia wpisane dane w formularzu).
Lopek
Cytat(Dark Smark @ 19.12.2013, 18:19:45 ) *
Wyrażenia regularnie (zresztą php udostepnia do ich funkcje) to dobre rozwiązanie, niestety ja nie pomogę bo nie jestem specjalistą z regex. Co do rozwiązania badania domeny wedle ostatnich znaków też pomysł dobry wydaje się ale... nie do końca (zależy w jaki sposób zaimplementowane), jeśli ktoś wpisze:

Kod
|| ls || .pl


myślę, że wtedy przejdzie pozytywnie walidacje i znowu luka bezpieczeństwa skryptu. Projektując skrypty i interfejsy stron trzeba myśleć jak "użytkownik idiota" co może wpisać nie poprawnego, jak i zarazem myśleć jak haker (nieszablonowo i nie wedle przeznaczenia wpisane dane w formularzu).
A no fakt hakerów nie brakuje, ktoś usilnie chciał uruchomić ten skrypt i niestety moje skrypty bezpieczeństwa zablokowały te IP. 159.205.156.34...
Kod
...[ciach]...[Thu Dec 19 18:07:43 2013] [error] [client 159.205.156.34] script '/var/www/html/SR1BSZ/pinguj.php' not found or unable to stat, referer: http://forum.php.pl/PHPPHP_Notice__Undefined_index__tgt_host_t225483.html
[Thu Dec 19 18:07:44 2013] [error] [client 159.205.156.34] script '/var/www/html/SR1BSZ/pinguj-new.php' not found or unable to stat, referer: http://forum.php.pl/PHPPHP_Notice__Undefined_index__tgt_host_t225483.html
[Thu Dec 19 18:09:34 2013] [error] [client 159.205.156.34] script '/var/www/html/SR1BSZ/pinguj-new.php' not found or unable to stat
[Thu Dec 19 18:09:59 2013] [error] [client 159.205.156.34] script '/var/www/html/SR1BSZ/admin.php' not found or unable to stat
... [ ciach] ...
[Thu Dec 19 18:15:02] [sp1lop] [Pirat 159.205.156.34] *** Zostal zablokowany na 6007 min. za piractwo ***
No i system go zablokował...

Domena zwykle powinna co najmniej mieć dwa człony oddzielone kropką wiec to trzeba by badać czy tak jest a potem dopiero końcówka jaka jest, dla mnie to raczej IP jest ważne...
Nie znam takich opcji w php co by to kontrolowały musiałbym poczytać... Na spokojnie może mi się trochę informacji przypomni z komend programowania... Po ciężkim zawale parę lat temu niestety z pamięci sporo danych mi uciekło...
I muszę na nowo wiele spraw poszukiwać ale jak już znajdę coś podobnego to i pamięć trochę się odbudowuje...

To na razie tyle pozdrawiam. I jeszcze raz dziękuje za znalezienie babola...
com
faktycznie nie uwzględniam faktu iż to linux nie Windows i usnułem parametry, a co do else
to przyjrzyj się temu fragmentowi jeszcze raz i się przekonasz czy jest potrzebne, jakby nie było to bym go nie napisał...

echo "<html><body style='background-image: url(./image/blekit.jpg);'>
<script type='text/javascript' language='javascript'>alert(\"Błąd - brak poprawnego IP. ' . $output . '\");</script>
</body></html>";

Jak nie podam to dostane w rezultacie output undefined index
Lopek
Cytat(com @ 19.12.2013, 18:51:53 ) *
faktycznie nie uwzględniam faktu iż to linux nie Windows i usnułem parametry, a co do else
to przyjrzyj się temu fragmentowi jeszcze raz i się przekonasz czy jest potrzebne, jakby nie było to bym go nie napisał...

echo "<html><body style='background-image: url(./image/blekit.jpg);'>
<script type='text/javascript' language='javascript'>alert(\"Błąd - brak poprawnego IP. ' . $output . '\");</script>
</body></html>";

Jak nie podam to dostane w rezultacie output undefined index
Bardzo proszę wybaczyć ale ja mam tylko 75 lat, i nie wszystko do mnie dociera niestety, tak jak bym sobie tego życzył, mogę niektóre sprawy nie zrozumieć potrzebuje czasu aby to przeanalizować na spokojnie.. Dlatego mogę odpowiedzieć nie to co było oczekiwane...
Dark Smark
Cytat(com @ 19.12.2013, 18:51:53 ) *
a co do else
to przyjrzyj się temu fragmentowi jeszcze raz i się przekonasz czy jest potrzebne, jakby nie było to bym go nie napisał...

Czyli wedle Twojego kodu jak ktoś nie wyśle metodą POST (np: dopiero co wejdzie na stronę WWW):
  1. if(!empty($_POST['tgt_host'])) {
  2.  
  3.  
  4. ...
  5.  
  6. } else {
  7.  
  8. ....
  9.  
  10. }

to wtedy mu wywala błąd że nie poprawne IP. Moim zdaniem nie jest to poprawne działanie skryptu. Alert "Błąd - brak poprawnego IP", przecież nie trzeba informować użytkownika aplikacji webowej, że dane są niepoprawne skoro nawet nie zdążył by ich wprowadzić. Można co najwyżej zamiast else zagnieździć w ifie kolejny IF (gdy wiemy że POST zostało przekazane w nagłówkach).
Lopek
Cytat(Dark Smark @ 23.12.2013, 18:17:52 ) *
Czyli wedle Twojego kodu jak ktoś nie wyśle metodą POST (np: dopiero co wejdzie na stronę WWW):
  1. if(!empty($_POST['tgt_host'])) {
  2. ...
  3. } else {
  4. ....
  5. }

to wtedy mu wywala błąd że nie poprawne IP. Moim zdaniem nie jest to poprawne działanie skryptu. Alert "Błąd - brak poprawnego IP", przecież nie trzeba informować użytkownika aplikacji webowej, że dane są niepoprawne skoro nawet nie zdążył by ich wprowadzić. Można co najwyżej zamiast else zagnieździć w ifie kolejny IF (gdy wiemy że POST zostało przekazane w nagłówkach).
Tak wiem, i dziękuje ale muszę najpierw rozwiązać opcje, że może być tylko wprowadzony IP nic innego, bez tego można się włamać do systemu, co potwierdziły moje testy..

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.