2010-03-26 4 views
0

Je veux supprimer une ligne dans ma base de données et a trouvé un example sur la façon de le faire avec jQuery de .post $()
Maintenant, je me pose la sécurité si ..
Quelqu'un peut-il envoyer une requête POST à ​​mon script delete-row.php d'un autre site Web?

JS

function deleterow(id) { 
    // alert(typeof(id)); // number 
    if (confirm('Are you sure want to delete?')) { 
    $.post('delete-row.php', {album_id:+id, ajax:'true'}, 
     function() { 
      $("#row_"+id).fadeOut("slow"); 
     }); 
    } 
} 

PHP: delete-row.php

<?php 
require_once("../db.php"); 
mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die("could not connect to database " . mysql_error()); 
mysql_select_db(DB_NAME) or die("could not select database " . mysql_error()); 

if (isset($_POST['album_id'])) {  
    $query = "DELETE FROM albums WHERE album_id = " . $_POST['album_id']; 
    $result = mysql_query($query); 
    if (!$result) die('Invalid query: ' . mysql_error()); 
    echo "album deleted!"; 
} 
?> 
+1

Juste pour ajouter: plus qu'un simple enregistrement, quelqu'un pourrait laisser tomber toute votre base de données avant de pouvoir cligner des yeux, via $ _POST ['album_id'].Pensez à utiliser mysqli ou PDO (requêtes paramétrées) au lieu de terribles mysql_ * si possible. – tadamson

+0

merci beaucoup pour l'ajout de votre note sur mysqli et PDO, je n'ai jamais entendu parler d'eux avant, mais étudieront. Donc vous dites que l'exemple de code avec mysqli est beaucoup plus sûr? Mais aussi la preuve? – FFish

Répondre

1

Que vous faites via ajax ou non, il est possible pour quelqu'un d'envoyer un message à cette page avec le informations appropriées et supprimer la ligne, oui.

EDIT:

Dans la plupart des systèmes, il est nécessaire d'être authentifié pour supprimer les choses, si tel est le cas, alors je serais personnellement pas très inquiet si l'utilisateur est la suppression de choses à travers l'interface par rapport à d'autres moyens ils ont compris. Une stratégie pour rendre cela plus difficile serait d'avoir un jeton unique qui est chargé avec la page qui doit être retransmise au serveur afin de supprimer des éléments. Par conséquent, si quelqu'un voulait supprimer les lignes d'un système externe, il devrait appeler la page et trouver le jeton qui a été généré, peut-être le stocker dans un champ caché, dans javascript, ou dans la session ... mais ils auraient pour extraire ce jeton, et ensuite passer à la fois le jeton et toutes les informations (probablement un identifiant) est nécessaire pour revenir à la page de suppression ...

Vous pouvez également même être en mesure de trouver une stratégie pour encoder l'ID de l'élément étant supprimé ce qui rendrait plus difficile pour quelqu'un de générer le post pour supprimer les éléments qui les intéressent. Donc, pour effacer cela, votre message sans encodage serait delete-row.php? id = 123, avec l'encodage delete-row .php? id = j922dh28d7h2edkjdf78h, delete-row.php aurait alors besoin de décoder 'j922dh28d7h2edkjdf78h' pour arriver à '123' et lancer la requête.

+0

Merci pour l'explication, il est bon que vous mentionnez que je ne serais pas très inquiet: après tout, pourquoi mes clients seraient être intéressés par albums supprimer, même si elles ne sont pas les leurs. Ils ne sont pas des utilisateurs de pouvoir de toute façon. – FFish

1

Oui, il serait trivial d'envoyer des demandes à delete-row.php et n'importe qui pourrait supprimer tout ce qu'il voulait. Un simple examen de votre javascript rendrait l'URL très claire, et votre table entière d'albums pourrait être facilement supprimée avec un simple script en boucle.

Vous souhaiterez probablement mettre en place une sorte de vérification des autorisations avant d'accepter quoi que ce soit de $ _POST et de modifier votre base de données avec.

Avez-vous un système d'authentification/connexion sur votre site? Généralement sur un site où les gens peuvent gérer les données du site, vous voulez avoir une méthode pour s'assurer que les gens sont autorisés à faire tout ce qu'ils essaient de faire.

+0

Oui, j'ai une classe access_user qui protège les pages. Je peux faire: $ page_protect = new Access_user; $ page_protect-> access_page(); La méthode de access_page est comme ceci: la fonction access_page ($ = reportez-vous "", qs $ = "", niveau $ = DEFAULT_ACCESS_LEVEL) { \t \t $ refer_qs = $ référer; \t \t $ refer_qs. = (Qs $! = "")? "?". $ qs: ""; \t \t if (! $ This-> vérifier_utilisateur()) { \t \t \t $ _SESSION ['referer'] = $ refer_qs; tête \t \t \t ("Location:". $ this-> login_page); \t \t \t sortie; \t \t} \t \t if ($ this-> get_access_level() <$ niveau) { \t \t tête \t ("Location:". $ This-> deny_access_page); \t \t \t sortie; \t \t} \t} – FFish

+0

Pensez-vous qu'il suffira de protéger mon script delete-album.php avec la classe? – FFish

2

Le problème avec votre code est cette ligne:

$query = "DELETE FROM albums WHERE album_id = " . $_POST['album_id']; 

Cela signifie que tout le monde peut supprimer tout champ DB. Ce que vous voulez est quelque chose comme ceci:

$query = "DELETE FROM albums WHERE album_id = {$_POST['album_id']} AND owner_id = {$_SESSION['owner_id']}"; 

$_SESSION['owner_id'] est défini après un processus d'authentification de connexion. Par conséquent, l'attaquant ne peut que supprimer ses propres enregistrements et pas ceux des autres.