简体   繁体   English

PHP / MySQL阻止用户访问其他用户上传的文件

[英]PHP/MySQL prevent user from accessing other users uploaded file

Ok, this is 2/5 tables from my my database, (no relationships between them): 好的,这是我数据库中的2/5个表(它们之间没有关系):

USERS             PAPERS

user_id           p_id
username          p_name
e-mail            p_authors
password          p_coauthor
                  p_jname
                  p_date
                  p_url

which is suppose to be populated from a PHP script. 假定是从PHP脚本填充的。

After registration, user folder is created, and then user can upload files to his folder. 注册后,将创建用户文件夹,然后用户可以将文件上传到他的文件夹。 Users can see, access, and download other users upload, which I am trying to prevent . 用户可以查看,访问和下载其他用户上载的内容, 但我试图阻止这样做

Im not sure which scripts are relevant to c/p them here, so ill try to display important parts of code from scripts: 我不确定在这里哪些脚本与c / p有关,因此请尝试显示脚本中重要的代码部分:

register script: (rest of the script just creates userfolder) 注册脚本:(脚本的其余部分仅创建用户文件夹)

$uname = mysql_real_escape_string($_POST['uname']);
$email = mysql_real_escape_string($_POST['email']);
$upass = mysql_real_escape_string($_POST['pass']);

$sql = mysql_query ("SELECT username FROM users WHERE username='".$uname."'");
$num = mysql_num_rows($sql);

if ($num > 0)  { ?>
    <script>alert('Duplicate username');</script>
<?php } else {
    if(mysql_query("INSERT INTO users(username,email,password) VALUES('$uname','$email','$upass')")) { ?>
        <script>alert('Successfully registered');</script>
<?php }

login script: 登录脚本:

$email = mysql_real_escape_string($_POST['email']);
$upass = mysql_real_escape_string($_POST['pass']);
$sql = mysql_query("SELECT * FROM users WHERE email='".$email."'");
$num = mysql_fetch_assoc($sql);

if ($num['password'] == $upass) {
    $_SESSION['user'] = $num['username'];
} else { ?>
    <script>alert('wrong details');</script> 
<?php }

and addfile script where file and data upload occurs: 以及执行上传文件和数据的addfile脚本:

$sql = mysql_query("INSERT INTO papers (p_name, p_authors, p_cauthor, p_jname, p_date, p_url) VALUES ('$name', '$authors', '$cauthor', '$jname', '$date', '$filename')");

if($sql) { ?>
    <script>alert('Data uploaded to database !'); 
    window.location.href = "home.php";</script>
<?php } else { ?>
    <script>alert('Data NOT uploaded to database !'); 
    window.location.href = "home.php";</script>
<?php } 

Now, when i do this on users homepage: 现在,当我在用户主页上执行此操作时:

$result = mysql_query("SELECT username, p_url FROM users, papers WHERE username='".$_SESSION['user']."'");
$output = mysql_fetch_array($result);

foreach ($output as $key => $val) {
    $search = substr($val, 0, strpos($val, '.'));
    $trim = str_replace($val, '', $search);
    echo <<<HERE
    <a href="http://localhost:8080/testfolder/users/{$_SESSION['user']}/{$val}" target="_blank">{$trim}</a><br />
    HERE;
}

I can access and download all data and uploaded files from other user folder. 我可以从其他用户文件夹访问和下载所有数据以及上传的文件。 How can i prevent this, and make script to display and download only logged user things from database? 我如何防止这种情况,并使脚本仅显示和下载数据库中已记录的用户内容? Is my users and papers table construction completely wrong, or maybe thing is in aforementioned query ? 我的用户和文件表的构造是完全错误的,还是上述查询中有问题?

To prevent this happening, you have to have a relationship between your tables and link them via this. 为防止这种情况发生,您必须在表之间建立关系并通过此表链接它们。

Your query is retrieving EVERY record in users mapped across to EVERY record in papers 您的查询正在检索users 每条记录,这些users映射到papers 每条记录

Your tables must have a common field to prevent this. 您的表必须具有一个公共字段以防止这种情况。 I would suggest adding user_id from the users table into the papers table and rewriting your query as 我建议将用户表中的user_id添加到papers表中,并将查询重写为

SELECT
    u.username,
    p.p_url
FROM
    users as u
INNER JOIN
    papers as p
    ON
        p.user_id=u.user_id
WHERE
    u.username='{$_SESSION['user']}'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM