Dodawanie i usuwanie rekordów z bazy danych z PHP z metodą POST

0

Witajcie !
Ostatnio na zajęciach robiliśmy bazę MySQL którą połączyliśmy za pomocą PHP i tzw. warstwy abstrakcji PDO.
Mamy działającą aplikację, w której możemy dodawać, usuwać i edytować rekordy.
Jest jeden problem - wszystko jest zrobione na metodzie GET, która jak wszyscy wiedzą nie jest bezpieczna.
Mamy ją przerobić na POST. I tu się zaczyna problem - nie wiem jak to zrobić.
Moja "aplikacja" składa się z trzech plików : konfiguracyjnego (dane dostępu do bazy) , db.php (obsługa bazy) i index.php (reszta).
To plik db.php :

 
<?php
class Baza
{
        public $lp;

	function __construct($dbms, $host, $database, $port, $username, $password)
	{
		try {
			$this->pdo = new PDO($dbms.':host='.$host.';dbname='.$database.';port='.
			  $port, $username, $password);
			$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        $this->lp = 0;
		}
		catch(PDOException $e) {
			echo 'Połączenie nie mogło zostać utworzone:<br> ' . $e->getMessage();
		}
	}
	
	function select_insert()
	{
                
		echo '
		  <form method="post" action="index.php" name="formularz"> 
			<input type="hidden" name="insert" value="true">
			<table> 
		  <tr>
			  <th>LP</th>
			  <th>Imię</th>
				<th>Nazwisko</th>
				<th>Waga</th>
				<th>Aktualizacja</th>
				<th>Usuń</th>
				<th onclick="sprawdz()">Edytuj</th>
			</tr>';
		$stmt = $this->pdo->query('SELECT id_osoba, imie, nazwisko, waga, aktualizacja FROM osoba');
		$lp = 1;
                foreach($stmt as $row)
		{
			echo '<tr>'.
			  '<td>'.$lp.'</td>'. 
				'<td>'.$row['imie'].'</td>'.
				'<td>'.$row['nazwisko'].'</td>'.
				'<td>'.$row['waga'].'</td>'.
				'<td>'.$row['aktualizacja'].'</td>'.
				'<td><a href="index.php?delete='.$row['id_osoba'].
				  '" class="delete" onclick=\'return confirm("Na pewno usunąć?");\'>U</a></td>'.
				'<td><a href="index.php?edit='.$row['id_osoba'].'" class="edit">E</a></td>'.
			'</tr>';
                        $lp++;
		}
		$stmt->closeCursor();
		echo '<tr>
			  <td></td>
			  <td><input type="text" name="imie"></td>
			  <td><input type="text" name="nazwisko"></td>
			  <td><input type="text" name="waga"></td>
			  <td><input type="submit" value="Dodaj" onclick="return sprawdz();"></td>
			  <td></td>
			  <td></td>
			</tr>
		  </table>
		</form>';
	}
	
	function select_update($id)
	{
		echo '
		  <form method="post" action="index.php" name="formularz"> 
			<input type="hidden" name="insert" value="true">
			<table> 
		  <tr>
			  <th>Lp</th>
			  <th>Imię</th>
				<th>Nazwisko</th>
				<th>Waga</th>
				<th>Aktualizacja</th>
				<th>Usuń</th>
				<th>Edytuj</th>
			</tr>';
		$stmt = $this->pdo->query('SELECT id_osoba, imie, nazwisko, waga, aktualizacja FROM osoba');

		foreach($stmt as $row)
		{
			if($row['id_osoba'] == $id)
			{
				echo '<tr>'.
				  '<td><input type="hidden" name="update" value="'.$row['id_osoba'].'">'.
					  $row['id_osoba'].'</td>'.
					'<td><input type="text" value="'.$row['imie'].'" name="imie"></td>'.
					'<td><input type="text" value="'.$row['nazwisko'].'" name="nazwisko"></td>'.
					'<td><input type="text" value="'.$row['waga'].'" name="waga"></td>'.
					'<td>'.$row['aktualizacja'].'</td>'.
					'<td><input type="submit" value="Zapisz" onclick="return sprawdz();"></td>'.
					'<td><input type="button" value="Anuluj" '.
					  'onclick="document.location = \'index.php\';"></td>'.
				'</tr>';
			}
			else 
		 	  echo '<tr>'. 
			    '<td>'.$this->lp.'</td>'. 
			  	'<td>'.$row['imie'].'</td>'.
			  	'<td>'.$row['nazwisko'].'</td>'.
			  	'<td>'.$row['waga'].'</td>'.
			  	'<td>'.$row['aktualizacja'].'</td>'.
			  	'<td><a href="index.php?delete='.$row['id_osoba'].
					  '" class="delete" onclick=\'return confirm("Na pewno usunąć?");\'>U</a></td>'.
			  	'<td><a href="index.php?edit='.$row['id_osoba'].'" class="edit">E</a></td>'.
			  '</tr>';	
                          		
		}
		$stmt->closeCursor();	
		echo '</table></form>';
	}
	
	function insert($imie,$nazwisko,$waga,$aktualizacja)
	{
		$lp++;
                  try {
			$dbquery = $this->pdo->prepare('INSERT INTO osoba(imie, nazwisko, waga, aktualizacja) VALUES(?, ?, ?, ?)');
			$dbquery->execute(array($imie,$nazwisko,$waga,$aktualizacja));						
			header('Location: index.php');
                        
		} 
		  catch(PDOException $e) {
			echo $e->getMessage();
		}
        
	}
	
	function delete($id)
	{
		try	{
			$dbquery = $this->pdo->prepare('DELETE FROM osoba WHERE id_osoba= ?');
			$dbquery->execute(array($id));
			header('Location: index.php');
                        $lp--;
		}
		catch(PDOException $e) {
			echo $e->getMessage();
		}
	}

	function update($imie, $nazwisko, $waga, $aktualizacja, $id)
	{
		try {
			$dbquery = $this->pdo->prepare('UPDATE osoba SET imie = ?, nazwisko = ?, waga = ?, aktualizacja = ? WHERE id_osoba = ?');				
			$dbquery->execute(array($imie, $nazwisko, $waga, $aktualizacja, $id));										
			header('Location: index.php');
		}
		catch(PDOException $e) {
			echo $e->getMessage();
		}
	}
}
?>

A to index.php :

 <!DOCTYPE HTML>
<html>
<head>
	<title>Baza danych w PHP przy użyciu biblioteki PDO - przykład</title>
	<meta charset="utf-8">
	<meta name="author" content="">
	<meta name="description" content="">
	<meta name="keywords" content="">		
	<link href="style.css" rel="stylesheet" type="text/css">
	<script src="skrypty.js" type="text/javascript"></script>
</head>
<body>
<section>
<header>
	<h1>Przykład użycia biblioteki PDO - tabela osoba.</h1>
</header>


<?php
require('db.php');
require('config.php');

$baza = new Baza($szbd,$host,$dbname,$port,$login,$haslo);

if( isset($_GET['delete']) )      
  $baza->delete($_GET['delete']);
elseif( isset($_POST['update']) ) 
  $baza->update($_POST['imie'],$_POST['nazwisko'],$_POST['waga'],date("Y-m-d H:i:s"),$_POST['update']);
elseif( isset($_POST['insert']) ) 
  $baza->insert($_POST['imie'],$_POST['nazwisko'],$_POST['waga'],date("Y-m-d H:i:s"));
elseif( isset($_GET['edit']) )    
  $baza->select_update($_GET['edit']);
else 
  $baza->select_insert();

?>
</section>
<section>
<header>
	<h2>Uwagi:</h2>
</header>
<p>Powyższy przykład demonstruje użycie biblioteki PDO i umożliwia wyświetlanie, dodawanie, usuwanie, modyfikowanie danych w tabeli osoba(id_osoba,imie,nazwisko,waga,aktualizacja).
Rozwiązanie zostało przedstawione w postaci obiektowej.
Dodatkowo też zostały zaprezentowane sposoby przesyłania informacji pomiędzy stronami www metodami GET i POST. Ze względów bezpieczeństwa dane przesyłane o usuwanym i modyfikowanym rekordzie powinny być przesyłane metodą POST, a nie tak jak to jest w przykładzie metodą GET (uwaga: istnieje możliwość złośliwego preparowania linków). Wynikowy interfejs jest napisany w HTML5, a formatowanie strony znajduje się w zewnętrznym pliku CSS. Do walidacji pól formularza użyto prostych funkcji javascript, które zostały umieszczone w zewnętrznym pliku JS. Plik SQL zawiera strukturę bazy danych - przykład został przetestowany na MySQL i PostgreSQL. Przedstawiony przykład powinien być odporny na ataki SQL injection.
</section>
<footer>
  <br>
	<div>Copyright © 2013 <a href="#">Anonim</a></div>
</footer>
</body>
</html>

Zapomniałem dodać - mam także plik javascript, w którym mam funkcję sprawdz(), sprawdzającą pewne warunki.
Próbowałem problem rozwiązać zmienną sesyjną, ale są zapisywanie nie te wartości, jakie potrzeba. Próbowałem także zmienić przekazywanie parametrów do funkcji jednak to także nic nie dało.
Ma ktoś jakiś pomysł, jak to ugryźć ?
Pozdrawiam

0

Najprościej dla ciebie będzie stworzyć prosty formularz HTML który będzie zawierał pola, które chcesz edytować i przycisk submit. W definicji formularza podajesz metodę jaką ma zostać wysłany, Post lub Her, domyślnie chyba getem. Wysyłając taki formularz dane bedziesz miał w zmiennej globalnej _POST

1

I w sumie najprostszym rozwiązaniem będzie takie jak pisał kolega wyżej. Ewentualnie można generować taki formularz za pomocą JSa, żeby było to przynajmniej trochę bardziej uniwersalne.
Jednak czemu chcesz zrezygnować z tego GETa? To wygląda mi na coś w rodzaju "menu" i generowania odpowiedniej podstrony. W takich wypadkach korzysta się właśnie z GETa.

marcin1509 napisał(a):

Jest jeden problem - wszystko jest zrobione na metodzie GET, która jak wszyscy wiedzą nie jest bezpieczna.

Jest dokładnie tak samo bezpieczna jak POST, PUT czy każda inna metoda. :) Nic co jest przesyłane od użytkownika nie można nazwać bezpiecznym.

0

Chodziło tu o to, iż możemy w każdym razie spreparować link, który pozwoli np. usunąć rekord z tabeli.
Dlatego chciałem pozbyć się GET'a. Zresztą, taki był wymóg zadania, które dał nam prowadzący.

1
Pawilonek napisał(a):

Jest dokładnie tak samo bezpieczna jak POST, PUT czy każda inna metoda.

Bzdura. GET w całości odkłada się w historii przeglądarki, więc wysyłanie w ten sposób loginu i hasła to poważna dziura w zabezpieczeniach systemu.

Pawilonek napisał(a):

Nic co jest przesyłane od użytkownika nie można nazwać bezpiecznym.

Kolejna bzdura. Po pierwsze mylisz słowo "bezpieczne" z "zaufane" - nie ufa się danym przychodzącym od klienta i zabezpiecza się je sesją oraz np. ponownie waliduje. Nie ufa się tym danym także dlatego, że mogą być spreparowane przez włamywacza i prowadzić np. do SQL Injection.
Po drugie dane przesyłane przez użytkownika mogą być bezpieczne - https gwarantuje, że nikt po drodze nie przechwyci ich i nie zmodyfikuje. A dodatkowo jeśli dane wrażliwe nie idą GETem i serwer poprawnie obsługuje wyłączenie cach'a przeglądarki, to dane użytkownika są bezpieczne.

1

Masz poprawiłem ci kodzik, teraz ładnie śmiga w jednej linijce miałeś błąd :)

<?php class Baza { public $lp; function __construct($dbms, $host, $database, $port, $username, $password) { try { $this->pdo = new PDO($dbms.':host='.$host.';dbname='.$database.';port='. $port, $username, $password); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->lp = 0; } catch(PDOException $e) { echo 'Połączenie nie mogło zostać utworzone:
' . $e->getMessage(); } } function select_insert() { echo ' <form method="post" action="index.php" name="formularz"> <input type="hidden" name="insert" value="true">
LP Imię Nazwisko Waga Aktualizacja Usuń Edytuj
'.$lp.''.$row['imie'].''.$row['nazwisko'].''.$row['waga'].''.$row['aktualizacja'].'UE
<input type="text" name="imie"> <input type="text" name="nazwisko"> <input type="text" name="waga"> <input type="submit" value="Dodaj" onclick="return sprawdz();">
</form>'; } function select_update($id) { echo ' <form method="post" action="index.php" name="formularz"> <input type="hidden" name="insert" value="true">
Lp Imię Nazwisko Waga Aktualizacja Usuń Edytuj
<input type="hidden" name="update" value="'.$row['id_osoba'].'">'. $row['id_osoba'].'<input type="text" value="'.$row['imie'].'" name="imie"><input type="text" value="'.$row['nazwisko'].'" name="nazwisko"><input type="text" value="'.$row['waga'].'" name="waga">'.$row['aktualizacja'].'<input type="submit" value="Zapisz" onclick="return sprawdz();"><input type="button" value="Anuluj" '.="'." 'onclick="document.location = \'index.php\';">
'.$this->lp.''.$row['imie'].''.$row['nazwisko'].''.$row['waga'].''.$row['aktualizacja'].'UE
</form>'; } function insert($imie,$nazwisko,$waga,$aktualizacja) { $lp++; try { $dbquery = $this->pdo->prepare('INSERT INTO osoba(imie, nazwisko, waga, aktualizacja) VALUES(?, ?, ?, ?)'); $dbquery->execute(array($imie,$nazwisko,$waga,$aktualizacja)); header('Location: index.php'); } catch(PDOException $e) { echo $e->getMessage(); } } function delete($id) { try { $dbquery = $this->pdo->prepare('DELETE FROM osoba WHERE id_osoba= ?'); $dbquery->execute(array($id)); header('Location: index.php'); $lp--; } catch(PDOException $e) { echo $e->getMessage(); } } function update($imie, $nazwisko, $waga, $aktualizacja, $id) { try { $dbquery = $this->pdo->prepare('UPDATE osoba SET imie = ?, nazwisko = ?, waga = ?, aktualizacja = ? WHERE id_osoba = ?'); $dbquery->execute(array($imie, $nazwisko, $waga, $aktualizacja, $id)); header('Location: index.php'); } catch(PDOException $e) { echo $e->getMessage(); } } } ?>

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1