如果存储使用客户端提供的名称文件时,文件上传,你将有可能改写图像(例如,如果两个用户上传me.png) - 这将是更好的使用用户名存储图像,然后你甚至不需要MySQL表将用户连接到他们的图片..
<?php
session_start();
$username = $_SESSION['user'];
if(empty($username)){
echo "Error: no username found";
}
else if(isset($_FILES['file'])){
//create a path to move file to
$newpath = 'files/'.$username;
if (move_uploaded_file($_FILES['file']['tmp_name'], $newpath)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Error: Possible file upload attack!\n";
}
}
else{
echo "No Files to save";
}
在这段代码中,我们使用的用户名从会话,并检查其不为空。 然后,我们使用它来将图像存储在您的文件夹中。
注意这个数字忽略了许多安全问题:
包括你的用户名../
这将导致文件要保存的文件目录之外。 这可能不是一个问题,如果你已经验证了用户名,另一种解决方案是创建用户名的哈希值,并使用这个代替:$newpath = 'files/'.md5($username);
不检查错误,或者验证文件确实是一个图像。
http://php.net/manual/en/features.file-upload.errors.php
PHP image upload security check list
如何将这些图像将会在此之后被使用? 如果文件目录位于您的htdocs中,则内容将可用于所有 - 最好将它存储在您的htdoc之外 $newpath = '/var/myappdata/userimages/'.md5($username);
然后,您可以创建另一个文件userimage.php其内容的文件:
<?php
session_start();
$username = $_SESSION['user'];
$path = '/var/myappdata/userimages/'.md5($username);
readfile($path);
这允许你做例如额外检查允许用户看到图像。
仍然有可能在这里介绍一个巨大的数额,希望这给你足够的前进,但是请您把这个投入生产之前阅读更多关于文件上传的安全性。
你原来的问题
如果你确实想存储有关数据库中的图像信息,你可以做这样的事情:
<?php
session_start();
include ("connect.php");
$username = $_SESSION['user'];
if(empty($username)){
echo "Error: no username found";
}
else if(isset($_FILES['file'])){
//create a path to move file to
$filename = basename($_FILES['file']['name']);
$newpath = 'files/'.$filename;
if (move_uploaded_file($_FILES['file']['tmp_name'], $newpath)) {
echo "File is valid, and was successfully uploaded.\n";
$sql = $con->prepare('INSERT INTO users (username,userpic) VALUES (?,?)');
$sql->bind_param("ss",$username,$filename);
$sql->execute();
$sql->close();
$con->close();
} else {
echo "Error: Possible file upload attack!\n";
}
}
else{
echo "No Files to save";
}
正如我虽然说的 - 你会碰上如果两个冲突用户上传相同的文件。
所以我应该删除我的整个SQL问题,只写代码?它并没有为我工作 –
我已经更新了我的答案 – Theo
Thnaks很多解释我会更多地了解如何保护自己,当上传图片.. –