如果存儲使用客戶端提供的名稱文件時,文件上傳,你將有可能改寫圖像(例如,如果兩個用戶上傳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很多解釋我會更多地瞭解如何保護自己,當上傳圖片.. –