6

とでUNLINKを使用しPHPていAJAXます。誰もがどんなファイルでも削除できるので、この方法は非常に危険であることを私は知っています。しかしAJAX、ファイルを削除するとページをリロードできないため、使用する必要があります。

では、ファイルを所有しているユーザーに対してのみファイルを削除できるようにするにはどうすればよいですか?

私がここで何か間違ったことやあなたが考えていることをしていると思っていて、それが役に立つと思うなら、他のことも教えてください:)

私のPHPコード:


<?php

    $photo_id       = $_GET['photo_id'];
    $thumbnail_id   = $_GET['thumbnail_id'];    

    function deletePhotos($id){
        return unlink($id);
    }

    if(isset($photo_id)){
        deletePhotos($photo_id);
    }
    if(isset($thumbnail_id)){
        deletePhotos($thumbnail_id);
    }


 ?>

私のAJAXコード:


function deletePhoto(photo, thumbnail){

        var photos = encodeURIComponent(photo);
        var thumbnails = encodeURIComponent(thumbnail);

        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
        } else {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange=function() {
            if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                document.getElementById("media").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("GET", "http://192.168.2.104/images/users/delete_photo.php?photo_id="+photos+"&thumbnail_id="+thumbnails, true);
        xmlhttp.send();
    }
4

7 に答える 7

9

なんらかの方法でユーザーを認証する必要があります。

ユーザーは、ユーザー名とパスワードで認証される必要があります。

PHPセッションを使用して記憶することができます。ファイルの所有権情報を格納するには、サーバー上のデータベーステーブルまたはテキストファイルを使用する必要があります。

次に、リンクを解除する前に、ロジックは現在「認証された」ユーザーがファイルの所有者であることを確認する必要があります。

于 2010-08-05T14:02:50.430 に答える
4

非常に単純なデータベース置換(ディレクトリ構造)を使用して、タスクを単純化できます。ユーザーのファイルをユーザーのディレクトリに保持します。そのため、特定のユーザーが削除する権限を持っているかどうかをいつでも確認できます。ユーザーの名前にちなんでディレクトリに名前を付けるか、-はるかに良い-数値のユーザーID

ちょうどのようなもの

$photo_id = basename($_GET['photo_id'];)
$filename = $filebase.$_SESSION['user_id']."/".$photo_id;
if (file_exists($filename) unlink ($filename);
于 2010-08-05T14:42:14.610 に答える
2

写真のあるディレクトリへのリンク解除を制限します。つまり..、パスを許可しないか、realpath()を実行した後にフルパスを確認してください。それ以外の場合、ユーザーdelete_photo.php?photo_id=../../../../etc/passwdはシステムを要求して破壊することができます。

于 2010-08-05T14:04:47.247 に答える
1

PHPの場合:

  • $_GET['photo_id']と$_GET['thumbnail_id']に「../」が含まれていないことを確認してください
  • また、IDの前にベースパスを追加してください。

それ以外の場合、ユーザーは任意のファイルを削除できます。

所有権については、サーバー側のどこかにどのファイルを所有しているのかという情報(MySql-DBなど)を保存する必要があります。次に、ファイルを削除する前に、この場所を参照する必要があります。

于 2010-08-05T14:05:06.927 に答える
0

WadihM.が言ったように。ユーザーを認証する必要があります。次に、それを使用して、「画像の所有者」と「現在ログインしているユーザー」を比較できます。これにより、必要なすべてのセキュリティが提供されます。

前に言ったように、正しく聞こえるように変数に名前を付けます。変数に「id」が表示されている場合。私はプログラマーとして、それが数値変数であると自動的に想定します。

于 2010-08-05T14:13:55.310 に答える
0

同じ問題があり、PHPのftp_delete関数を使用して回避しました

于 2011-06-07T08:05:59.867 に答える
-1

別の提案:ファイルをディスクに保存せず、データベースに保存します。これにより、サイトとスクリプトと「ユーザーデータ」を明確に区別できます。

(ファイルはファイルであり、データベースはデータ用であり、それらは異なると誰かが私に言ったことがありますが、私が見るように、ファイルにはとにかくデータが含まれています。mysqlには何でも入れるのに最適なLONGBLOBタイプがあり、メタデータを保存できます、file-typeやfilenameなど、同じデータ行の別々のフィールドにあるため、物事をクリーンでシンプルに保つことができます)

于 2010-08-05T14:11:41.953 に答える