Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Problem z edycją rekordów - formularz edycji nie ukazuje się w przeglądarce.
LeoMInor
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 4.03.2012

Ostrzeżenie: (0%)
-----


Witam forumowiczów (IMG:style_emoticons/default/smile.gif)

Nie znalazłem podobnego tematu w wyszukiwarce, więc:

Mam problem z edycją rekordów bazy z poziomu panelu admina.
Pisałem stronę na webserv i wszystko śmigało. Po zalogowaniu wyświetlały się nazwy pozycji menu strony a przy nich przycisk edytuj.
Po kilknięciu na niego wchodził formularz edycji.

Teraz wrzuciłem stronę na serwer OVH i ku mojemu zdziwieniu co prawda po zalogowaniu pozycje menu się wyświetlają, ale po wybraniu edycji strona nie wyświetla formularza edycji, a tylko się przeładowuje no i mogę tak klikać edytuj do przyszłego wieku.
W pasku przeglądarki widzę, że zmienne $p i $ile są przekazywane przez zapytanie (/admin.php?p=e&id=1).

Kod:
  1. <?
  2.  
  3. if (isset($_GET["logout"]) && ($_GET["logout"]=="1")) {unset($_SESSION["access"]);}
  4.  
  5. $sql = mysql_connect("***","***","***");
  6. mysql_query('set charset utf8');
  7.  
  8. if((isset($_POST['user']) && $_POST['user'] !== "") && (isset($_POST['pass']) && $_POST['pass'] !== "")) {
  9. $result=mysql_query("select * from users where user='".$_POST["user"]."' and pass='".md5($_POST["pass"])."'");
  10. $ile=mysql_num_rows($result);
  11.  
  12. if ($ile=="1"){
  13. $_SESSION["access"]=1;
  14. }}
  15.  
  16.  
  17.  
  18. if (isset($_SESSION["access"]) && ($_SESSION["access"]=="1")){
  19.  
  20.  
  21. $wynik = mysql_query("select id,link from menu");
  22.  
  23. while ($w = mysql_fetch_row($wynik)) {
  24. echo $w[1]." - "."\n";
  25. echo "<A HREF=\"admin.php?p=e&id=$w[0]\">edytuj</A><BR> ";
  26. }
  27.  
  28. echo "<A HREF=\"admin.php?logout=1\">Wyloguj</A>";
  29.  
  30.  
  31. if (isset($p) && ($p == "e")) {
  32. $wynik = mysql_query("select * from menu where id='$id'");
  33. $w = mysql_fetch_row($wynik);
  34. echo "<FORM METHOD=\"post\" ACTION=\"admin.php\">";
  35. echo "<TEXTAREA NAME=\"tresc\">$w[2]</TEXTAREA><BR>";
  36. echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$w[0]\"><BR>";
  37. echo "<INPUT TYPE=\"submit\" VALUE=\"edytuj\">";
  38. echo "</FORM>";
  39. }
  40.  
  41. if (isset($tresc) && ($tresc != "")) {
  42. echo "<BR>Zaktualizowano.";
  43. mysql_query("UPDATE menu SET tresc = '$tresc' where id = '$id'");
  44. }
  45.  
  46. }
  47.  
  48. else {
  49. echo "<FORM METHOD=\"post\" ACTION=\"admin.php\">";
  50. echo "login:<BR>";
  51. echo "<INPUT TYPE=\"text\" NAME=\"user\"><BR>";
  52. echo "hasło:<BR>";
  53. echo "<INPUT TYPE=\"password\" NAME=\"pass\"><BR>";
  54. echo "<INPUT TYPE=\"submit\" VALUE=\"loguj\">";
  55. echo "</FORM>";
  56. }
  57.  
  58. ?>
  59.  
  60.  


(IMG:style_emoticons/default/co_jest.gif) Pomożecie?
Go to the top of the page
+Quote Post
mat-bi
post
Post #2





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

Ostrzeżenie: (0%)
-----


Pierwsze, co mi się rzuciło, to straszna podatność na SQL Injection (IMG:style_emoticons/default/wink.gif)

Hmm, czy mi się wydaje, czy register_globals jest problemem?
Go to the top of the page
+Quote Post
LeoMInor
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 4.03.2012

Ostrzeżenie: (0%)
-----


Strzał w 10, dzięki. (IMG:style_emoticons/default/snitch.gif) Jak rozumiem ustawienie jedynki przy zmiennych globalnych w .htaccess nie sprzyja bezpieczeństwu (?) a moje problemy w tym miejscu zamiast się kończyć, dopiero się zaczynają.
Więc powstaje pytanie jak wygląda metoda pozwalająca działać temu formularzowi bez włączania zmiennych globalnych?
No i czy podatność na atak wynikła z braku zastosowania jakiejś konkretnej nazwijmy to - sztuczki, czy kod jest że tak powiem skopany od podstaw?

Ten post edytował LeoMInor 4.03.2012, 20:03:30
Go to the top of the page
+Quote Post
mat-bi
post
Post #4





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

Ostrzeżenie: (0%)
-----


Temat: SQL Injection Insertion - poczytaj sobie.

A żeby ten formularz działał, jest kilka dróg m.in. włączenie register_globals(cholernie niepolecane) oraz po prostu przerobienie odpowiednich zmiennych w elementy tablicy $_POST/$_GET/$_REQUEST etc.
Go to the top of the page
+Quote Post
LeoMInor
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 4.03.2012

Ostrzeżenie: (0%)
-----


Cytat(mat-bi @ 4.03.2012, 20:11:03 ) *
(...) oraz po prostu przerobienie odpowiednich zmiennych w elementy tablicy $_POST/$_GET/$_REQUEST etc.


ok, trochę szukałem, ba - nawet próbowałem przerobić, ale chyba nie wiem jak to ma wyglądać.. jest jakiś dział poniżej przedszkola? (IMG:style_emoticons/default/brzydal.gif)

No nic, mimo wszystko dzięki za wskazówkę. Będę szukał dalej jak to zrobić. Pozdrawiam (IMG:style_emoticons/default/smile.gif)

cześć, wznawjając temat:

Pojawiła się odpowiedź, że jedną z opcji jest "przerobienie odpowiednich zmiennych w elementy tablicy $_POST/$_GET/$_REQUEST etc. "
Problem w tym, że nie wiem jak to ma wyglądać. Podpowie ktoś?

No i jeszcze kwestia SQL injection - czy zastosowanie addslashes wystarczy żeby się obronić?

Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




nie
$zmienna
a
$zmienna = $_POST['zmienna'];
Tu żadnej filozofii nie ma
Go to the top of the page
+Quote Post
LeoMInor
post
Post #7





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 4.03.2012

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 15.03.2012, 15:15:00 ) *
nie
$zmienna
a
$zmienna = $_POST['zmienna'];
Tu żadnej filozofii nie ma


ok, ale jeśli mam coś takiego
  1. if ($_GET["logout"]=="1") {unset($_SESSION["access"]);}


i wiadomość typu Notice: Undefined index: logout in /(...)admin.php on line 8

to ja mogę dać POSTa zamiast GETa?

lub tutaj:

  1. if ($ile=="1"){
  2. $_SESSION["access"]=1;
  3. }
  4.  
  5. if ($_SESSION["access"]=="1"){


tu z kolei jest błąd dla accessa.
Go to the top of the page
+Quote Post
jaslanin
post
Post #8





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

Ostrzeżenie: (0%)
-----


to oznacza że element taki element tablicy nie został zainicjowany tj. nie została mu przypisana żadna wartość, najlepiej

zanim użyje się jakiejś zmiennej dobrze jest sprawdzać czy istnieje za pomocą isset:

Temat: PHP Notice Undefined index

możesz też wyłączyć tę informację:

  1. <?php error_reporting (E_ALL ^ E_NOTICE); ?>


ale lepiej tego nie robić bo taka informacja się przydaje przy debugowaniu
Go to the top of the page
+Quote Post
LeoMInor
post
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 4.03.2012

Ostrzeżenie: (0%)
-----


Tylko, że jak dam issety to rzeczywiście giną te powiadomienia, ale formularz nie działa.
Bardziej chodziło mi o to co napisali @mat-bi i @nospor (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
jaslanin
post
Post #10





Grupa: Zarejestrowani
Postów: 511
Pomógł: 143
Dołączył: 13.03.2010
Skąd: Jasło

Ostrzeżenie: (0%)
-----


Tutaj ustawiłeś że formularz ma przesyłać dane metodą POST

  1. if (isset($p) && ($p == "e")) {
  2. $wynik = mysql_query("select * from menu where id='$id'");
  3. $w = mysql_fetch_row($wynik);
  4. echo "<FORM METHOD=\"post\" ACTION=\"admin.php\">";
  5. echo "<TEXTAREA NAME=\"tresc\">$w[2]</TEXTAREA><BR>";
  6. echo "<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"$w[0]\"><BR>";
  7. echo "<INPUT TYPE=\"submit\" VALUE=\"edytuj\">";
  8. echo "</FORM>";
  9. }


tutaj natomiast robisz coś takiego:

  1. if (isset($tresc) && ($tresc != "")) {
  2. echo "<BR>Zaktualizowano.";
  3. mysql_query("UPDATE menu SET tresc = '$tresc' where id = '$id'");
  4. }


w starym PHP była możliwość że dane przesyłane przez POST, GET itd. były od razu dostępne przez zwykłe zmienne, dlatego @mat-bi napisał o register_globals (to jest właśnie to)

jak widzisz nigdzie wcześniej w kodzie nie przypisałeś wartości do zmiennej $tresc, a skoro powyższa opcja którą opisałem jest wyłączona ze względów bezpieczeństwa Twój skrypt nie działa

żeby działał musisz go zmienić tak jak napisał @nospor, czyli dla przykładu:

  1. $tresc = $_POST['tresc'];
  2. if (isset($tresc) && ($tresc != "")) {
  3. echo "<BR>Zaktualizowano.";
  4. mysql_query("UPDATE menu SET tresc = '$tresc' where id = '$id'");
  5. }


Dodatkowo zamiast ciągle robić echo kodu HTML lepiej wielokrotnie zamykać blok kodu PHP, przykład:

  1. <div class="user_controls">
  2. <?php if ($user = Current_User::user()): ?>
  3. Hello, <em><?php echo $user->username; ?></em> <br/>
  4. <?php echo anchor('logout', 'Logout'); ?>
  5. <?php else: ?>
  6. <?php echo anchor('login','Login'); ?> |
  7. <?php echo anchor('signup', 'Register'); ?>
  8. <?php endif; ?>
  9. </div>
  10.  
  11. <h1>My Message Board</h1>
  12.  
  13. <?php foreach($categories as $category): ?>
  14.  
  15. <div class="category">
  16.  
  17. <h2><?php echo $category->title; ?></h2>
  18.  
  19. <?php foreach($category->Forums as $forum): ?>
  20.  
  21. <div class="forum">
  22.  
  23. <h3>
  24. <?php echo anchor('forums/'.$forum->id, $forum->title) ?>
  25. (<?php echo $forum->Threads->count(); ?> threads)
  26. </h3>
  27.  
  28. <div class="description">
  29. <?php echo $forum->description; ?>
  30. </div>
  31.  
  32. </div>
  33.  
  34. <?php endforeach; ?>
  35.  
  36. </div>
  37.  
  38. <?php endforeach; ?>


Ten post edytował jaslanin 1.04.2012, 16:18:45
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 1.10.2025 - 16:46