2011-10-06 3 views
0

나는 연령대이 놀겠다는 거 봤는데 알아낼 수없는 이유는 해프닝 - 나는 & 다음 코드를 가지고 "PhpAcademy"튜토리얼 (I 단순히 사용자 프로필 그림을 업로드 phpMyAdmin을 사용하고 다음과 같은거야 세션을 기반으로) : 문제는 내가 파일 &을 클릭 할 때 "업로드"를 클릭하면 이미지 파일이 phpmyadmin의 'imagelocation'아래에 표시되지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다. 감사!내 이미지 업로드가 phpMyAdmin의 내 imagelocation 필드에 나타나지 않는 이유는 무엇입니까?

<?php include("uploadprofilepic.php"); ?> 
<?php 
$query = mysql_query("SELECT * FROM members WHERE username='$username'"); 
if (mysql_num_rows($query)==0) 
die("User not found!"); 
else { 
$row = mysql_fetch_assoc($query); 
$location = $row['imagelocation']; 

echo "<img src='$location'>"; 
} 

:

<?php 

$_SESSION['username']="atestuser508"; 

$username = $_SESSION['username']; 

echo "Welcome, ".$username."!<br/>"; 

if ($_POST['submit']) { 
// get file attributes 
$name = $_FILES['myfile']['name']; 
$tmp_name = $_FILES['myfile']['tmp_name']; 

if ($name) 
{ 
    // start the upload process 

    $location = "avatars/$name"; 
    move_uploaded_file($tmp_name,$location); 

    $query = mysql_query("UPDATE members SET imagelocation='$location' WHERE username='$username'"); 

    die("You've successfully uploaded your profile pic! <a href='login-home.php'>Return to your profile</a>"); 
} 
else 
die("Please select a file to upload!"); 
} 

echo "Upload a profile picture: 

<form action='uploadprofilepic.php' method='POST' enctype='multipart/form-data'> 
File: <input type='file' name='myfile'><input type='submit' name='submit' value='Upload!'> 
</form> 

"; 
?> 

USER 다음 &을 업로드 할 수 있도록한다 "PROFILE"PAGE는 PROFILE PIC 표시 :

업로드 프로세스를 시작해야한다 'UPLOADPROFILEPIC.PHP'파일

?>

+0

음 당신은 imagelocation의 DB 필드가 비어있는 말? –

+0

실제로 다곤 그것은 phpMyAdmin에있는 DB 필드에 0으로 – BennyB

답변

1

귀하의 코드는 어디서나 서버에서 악의적 인 사용자가 원하는 모든 파일을 업로드 할 수 있도록 할 것입니다. ['name'] 매개 변수가 '안전'하다고 맹목적으로 신뢰하고 있습니다. 코드에서 처리하는 오류가 없으며 모든 것이 잘 될 것이라고 가정합니다.

은 즉, 당신은 단지 관심을 조금도을 가진 사람을 통해 해적선을 구동 할 수있을 것입니다 서버에서 벌어진 보안 구멍을 열었습니다.

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { 
    ... file was uploaded ok 
} else { 
    die("Upload failed with error code " . $_FILES['file']['error']); 
} 

이제까지 사용자가 제공하는 무엇을 신뢰하지 마십시오 절대 맨 손으로 최소한

, 당신은 업로드 성공을 위해이 방법을 확인해야합니다. 파일 업로드에, 즉 A) 파일 이름 ( ['name']), b)는 파일의 MIME 타입 ( ['type']). 둘 다 조작하기가 쉽지 않습니다.

uplaod가 성공했는지 확인했으면 "maliciousscript-that-gives-them-total-control.php"또는 "nasty_virus.exe"가 아닌 이미지를 실제로 업로드했는지 확인해야합니다.

$info = getimagesize($_FILEs['file']['tmp_name']); 
if ($info === FALSE) { 
    die("You didn't upload a valid image type"); 
} 

그런 다음 파일 이름이이 업로드 파일을 서버에 저장하려면 절대 사용자 제공 이름을 사용하지 마십시오. 자신을 생성하십시오. 이 이미지에 대한 세부 정보를 '회원'테이블에 저장하고 있으므로 해당 사용자의 회원 ID를 사용하십시오 (해당 테이블에 기본 키가 있습니까?). 따라서 /site/images/userprovidedfilename.jpg 대신 /site/images/37 (사용자는 ID가 37이라고 가정)으로 만드십시오.

확실히 파일 이동은 실제로 성공합니다

$sql = "..."; 
$result = mysql_query($sql); 
if ($result === FALSE) { 
    die(mysql_error()); 
} 

이것은 당신이 무엇을 절대 최소한이다

$status = move_uploaded_file($_FILEs['file']['tmp_name'], '/some/path/that/you/generated'); 
if ($status === FALSE) { 
    die("Unable to move uploaded file to destination"); 
} 

그런 다음 쿼리가 실제로 성공 확인 점검, 데이터베이스를 업데이트 업로드 스크립트 보안 방법으로해야합니다. 할 수있는 일이 훨씬 더 많지만, 이것은 가장 단호한 공격자를 제외한 모든 사람으로부터 당신을 안전하게 지켜야합니다. 그리고 당신이 공격 당하지 않더라도, 오류 처리는 합법적 인 이유로 물건이 날아 오는 시간을 잡는데 도움이 될 것입니다.

+0

안녕하세요 마크, 감사 무리를 보여줍니다 -이 일에 보안 구멍을 실현.나는이 동안 좋은 일을 할 계획이 없다. (나는 단지 배우는 것 뿐이다.) 나에게 큰 호의를 베푸는 사람은 내가 필요로하는 부분을 추가/변경하고 보여줄 필요가있는 코드를 포함시킬 수 있는가? 내가 게시 한 원본 코드 파일로 이동하십시오. 현재 보안에 대해 걱정하지 마십시오. phpmyadmin의 'imagelocation'필드에이 댕 이미지가 나타나서 언젠가 PHP를 정복하려는 동기를 유지할 필요가 있습니다. 나는 알고있다 - 나는 갈 길이 멀다. 나는 너의 빚에있어, 내 친구 야 ... – BennyB

+0

하나는, 당신은 어디서나 mysql에 연결하는 것 같지 않습니다. 그래서 적어도 "... mysql_query (...) 또는 die (mysql_error())'를 사용하여 그곳에서 일어나는 일들을 볼 수 있습니다. –

관련 문제