0

ユーザーが画像をアップロードし、ディレクトリの内容をリストに表示できるシンプルなファイル共有ページがあります。データベースに 2 人のユーザーがいますが、1 人だけがファイルを削除できるようにしたいと考えています。私のデータベースにはユーザーのタイプ列があり、これらの値は 1 または 2 です。私のコードは次のとおりです。

    <body>
<?php include "view/header.php" ?>
<div id="main">
    <h2>Image to be uploaded</h2>
    <form id="upload_form" action="." method="POST" enctype="multipart/form-data">
        <input type="hidden" name="action" value="upload">
        <input type="file" name="file1"><br />
        <input id="upload_button" type="submit" value="Upload">
    </form>
    <h2>Images in the directory</h2>
    <?php if (count($files) == 0) : ?>
        <p>No images have been uploaded.</p>
    <?php else: ?>
        <ul>
        <?php foreach($files as $filename) :
            $file_url= $image_dir . '/' . $filename;
            $delete_url= '.?action=delete&filename=' . urlencode($filename);
        ?>
            <li>
                <a href= "<?php echo $delete_url;?>">
                    <img src= "images/delete.png" alt= "Delete"></a>
                <a href= "<?php echo $file_url;?>">
                    <?php echo $filename;?></a>
            </li>
        <?php endforeach; ?>
        </ul>
    <?php endif; ?>
 </div>
 <div id="footerholder">
    <div id="footer">
    <?php include "view/footer.php" ?>
</div>

これは私のログインページが参照するものです:

<?php

$dsn= 'mysql:host=localhost; dbname=file_share';
$username= 'root';
$password= '';

try {
    $db= new PDO($dsn, $username, $password); }

    catch (PDOException $e) {
    $error_message= $e->getMessage();
    echo "<p>An error occured while connecting to the database: $error_message </p>"; }

//Only run code below if form has been posted
if($_SERVER['REQUEST_METHOD'] == 'POST') {

if( isset($_POST['username'], $_POST['password'])
   && !empty($_POST['username']) && !empty($_POST['password']) ) {
    $username = $_POST['username'];
    $password = $_POST['password'];  

    $sql= 'SELECT *
           FROM `users`
           WHERE `username` = :username
           AND `password` = :password
           LIMIT 1';  //SQL query with named placeholders

    $stmt = $db->prepare($sql);  //Returns a PDOStatement class object
    $stmt->bindParam(':username',$username,PDO::PARAM_STR,16);
    $stmt->bindParam(':password',$password,PDO::PARAM_STR,16);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);

    $error = $stmt->errorInfo();//Debug 
    if($error[0] != '00000')
    printf('SQL Error: <pre>%s</pre>', print_r($error, true));

    if($stmt->rowCount() > 0) {
        $_SESSION['loggedIn']= "true";
        header("Location: uploader.php");
    }
    else {
         echo 'Sorry username/password wrong';
         echo '<br><a href="login.php">Try Again</a></br>';
    }
4

1 に答える 1

0

にユーザー レコードがあるとします$profile

<?php if($profile["type"] == 1){ ?>
    <li>
        <a href= "<?php echo $delete_url;?>">
            <img src= "images/delete.png" alt= "Delete">
        </a>
        <a href= "<?php echo $file_url;?>">
            <?php echo $filename;?>
        </a>
    </li> 
<?php } ?>

削除リンクを表示する部分は、ユーザー タイプをチェックするステートメントに入れる必要があります。

ところで、現在のコードでは、ハッカーが削除 URL が .../?action=delete&filename=FILE_NAME であることを発見した場合、file_name を使用してその URL を簡単に呼び出すことができます。したがって、次の 2 つのことを行う必要があります。

  1. サーバー側のユーザー権限も常にチェックして、そのページなどにアクセスするために誰もあなたのhtmlを変更していないことを確認してください.
  2. リンクで MD5 を使用し、リンクの最後に追加します。この MD5 は MD5(link + your_name + "hello") である可能性があり、推測することは不可能です。リンクは次のようになります。

    href=".../action=delete&filename=FILE_NAME&hash=d131dd02c5e6eec4"

    サーバー側で、渡されたハッシュでリンクの md5 を確認します。これにより、誰もあなたのリンクを操作できなくなります。

PS。私が提案したのは、Web サイトのセキュリティを確保する 1 つの方法にすぎません。

于 2013-10-22T01:31:37.647 に答える