我有一个简单的文件共享页面,允许用户上传图像并在列表中显示目录内容。我的数据库中有 2 个用户,我想让它只有一个人可以删除文件。我的数据库有一个用于用户的类型列,这些值为 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>';
}
假设您的用户记录在$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 } ?>
您应该将显示删除链接的部分放在检查用户类型的语句中。
顺便说一句,在您当前的代码中,如果黑客发现您的删除网址是.../?action=delete&文件名=FILE_NAME,他可以用file_name简单地调用该网址。因此,您必须做两件事:
- 始终检查服务器端的用户权限,以确保没有人更改您的 html 来访问该页面或类似内容。
在链接上使用 MD5 并将其添加到链接末尾。这个MD5可能是MD5(链接+your_name+"你好"),这是无法猜测的。您的链接如下所示:
href=".../action=delete&filename=FILE_NAME&hash=d131dd02c5e6eec4"
在服务器端,使用传递的哈希检查链接的 md5。通过这样做,没有人可以操纵您的链接。
附言。我建议的只是确保网站安全性的一种方法。