2015-06-13 5 views
0

Я решил эту проблему с предупреждением, возвращаясь к if(!file_exists($file_to_delete) (как я уже знаю, в этой папке есть только изображения, которые мне просто нужны, чтобы пользователь не мог попасть в другие каталоги) I также сделали проверку по идентификатору, что его числовое & существует в БД и продезинфицировать в запросе я считаю, могли бы вы, пожалуйста, посмотрите, хотя новый код ниже и посмотреть, если все в порядке, или если и дальнейшие проблемы существуютphp delete from sql и directory form

Большое спасибо

Heres мой код

<?php 
 
// Include Databse 
 
include ("common.php"); 
 

 
// VARIBLES \t 
 
$delete = $_POST['delete']; 
 
$id = $_POST['id']; 
 
$filename = $_POST['filename']; 
 
$ext = end(explode('.',$filename)); 
 

 
// Check if form has been submitted 
 
if (isset ($delete)) 
 
{ 
 
// Check filename is not empty 
 
if(empty($filename)) { 
 
    $status = "Please enter a FILENAME" ; 
 
\t $error = true; 
 
\t $filecheck = false; 
 
} 
 

 
else { 
 
\t $filecheck = true; 
 
} 
 

 
if ($filecheck) 
 
{ 
 
//Check user stays in correct directory & check image ext 
 
if(!preg_match('/^\/?[\w\s-_]+\.(jpe?g|gif|png|bmp)$/',strtolower($filename))) 
 
{ 
 
\t $error = true; 
 
\t $status = "Please check FILENAME"; 
 
} 
 

 
else { 
 
    $file_to_delete = 'images/' . $filename; 
 
} 
 

 
// Check file_to_delete is set 
 
if ($file_to_delete) 
 
{ 
 
// Checks the file exists 
 
if(!file_exists($file_to_delete)) 
 
{ 
 
$status = "File not found please check FILENAME"; 
 
$error = true; 
 
$idcheck = false; 
 
} 
 

 
else 
 
{ 
 
$idcheck = true; \t 
 
} 
 
} 
 

 
// Check $idcheck is set 
 
if($idcheck) 
 
{ 
 
// Check ID is not empty 
 
if(empty($id)) { 
 
    $status = "Please enter a ID " ; 
 
\t $error = true; 
 
\t $filecheck = false; 
 
} 
 

 
//Check if ID is not numeric 
 
else if(!is_numeric($id)) 
 
{ 
 
\t $error = true; 
 
\t $status = "Please check ID"; 
 
} 
 

 
else 
 
{ 
 
// Check ID exists in database 
 
$query = "SELECT id FROM `test` WHERE `id` = :id" ; 
 
$stmt = $db->prepare($query); 
 
$stmt->bindParam(":id", $id); 
 
$stmt->execute(); 
 

 
//if ID exists. 
 
if($stmt->rowCount() > 0) 
 
{ 
 
\t $error = false; 
 
} 
 

 
else { 
 
\t $error = true; 
 
\t $status = "Please check ID"; 
 
} 
 

 
} 
 
} 
 
} 
 

 
if (!$error) 
 
{ 
 
// Run Query & Delete File Information From Database 
 
$query = "DELETE FROM `test` WHERE `id` = :id" ; 
 
try { 
 
     $stmt = $db->prepare($query); 
 
\t \t $stmt->bindParam(':id', $id); 
 
     $stmt->execute(); 
 
    } 
 
    catch(PDOException $ex) 
 
    { 
 
     die("Failed to delete image: Please report issue to admin"); 
 
    } 
 
\t 
 
// Delete File From Directory 
 
unlink($file_to_delete); 
 

 

 
$status = "File Deleted"; 
 

 
} 
 
} 
 
?> 
 

 
<?php 
 
$query = "SELECT id,photo FROM test"; 
 
     
 
try 
 
{ 
 
// Run Query To Show The Current Data In Database 
 
     $stmt = $db->prepare($query); 
 
     $stmt->execute(); 
 
    } 
 
    catch(PDOException $ex) 
 
    { 
 
     die("Failed to run query: Please report issue to admin"); 
 
    } 
 
      
 
$rows = $stmt->fetchAll(); 
 
?> 
 

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 
<html xmlns="http://www.w3.org/1999/xhtml"> 
 
<head> 
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 
<title>Delete Image</title> 
 
<style type="text/css"> 
 
.table { 
 
\t text-align: center; 
 
} 
 
.table { 
 
\t font-weight: bold; 
 
} 
 
</style> 
 
</head> 
 

 
<body> 
 
<form action="delete.php" method="post" enctype="multipart/form-data" class="table"> 
 
Please enter the Filename and ID of the image you wish to delete 
 
    <table width="178" align="center"> 
 
    <tr class="table"> 
 
     <td width="144" class="table">Filename</td> 
 
     <td width="30" class="table">ID </td> 
 
    </tr> 
 
    <tr> 
 
     <td><input name="filename" type="text" value="<?php echo $filename; ?>" />  </td> 
 
     <td><input name="id" type="text" id="id" value="<?php echo $id; ?>" size="3" maxlength="4" />  </td> 
 
    </tr> 
 
    </table> 
 
    <p><?php echo $status; ?><br /> 
 
    <input type="submit" value="Delete Selected Image" name="delete" /> 
 
    </p> 
 
    <p>IMAGE DETAILS </p> 
 
    <table width="400" align="center" class="table"> 
 
    <tr> 
 
     <th width="61">ID</th> 
 
     <th width="185">Filename</th> 
 
     <th width="138">Image</th> 
 
    </tr> 
 
    </table> 
 
    <table width="400" align="center" class="table"> 
 
    <?php foreach($rows as $row): ?> 
 
     <tr> 
 
      <td width="61"><?php echo $row['id']; ?></td> 
 

 
      <td width="185"><?php echo $row['photo']; ?></td> 
 
      <td width="138" height="138"> 
 
<img src="images/<?php echo $row['photo'] ; ?>" width="138" height="138" /></td> 
 
     </tr> 
 
    <?php endforeach; ?> 
 
</table> </p> 
 
    <p><br /> 
 
    <br /> 
 
    </p> 
 
</form> 
 
</body> 
 
</html>

ответ

0

Я сделал это как так ... отлично работает только, как я хотел поблагодарить всех вас за вашу помощь гораздо appriated Теперь, чтобы создать слайд-шоу изображений непосредственно

<?php 
 
// Include Databse 
 
include "common.php"; 
 

 
// validation errors 
 
$error = array(); 
 

 
// Check if form has been submitted 
 
if (isset ($_POST['delete'])) 
 
{ 
 
// get the filename & id. See php.net/basename for more info 
 
    $filename = basename($_POST['filename']); 
 
\t $id =($_POST['id']); 
 
    
 
// get file extension, see php.net/pathinfo for more info 
 
    $ext = pathinfo($_POST['filename'], PATHINFO_EXTENSION); 
 

 
// allowed file extensions 
 
    $allowedExtensions = array('jpeg','jpg','gif','png','bmp'); 
 

 
// Check filename is not empty 
 
    if(empty($filename)) 
 
    { 
 
     $error[] = "Please enter a Filename"; 
 
    } 
 

 
// Check valid file extension used 
 
    else if(!in_array($ext, $allowedExtensions)) 
 
    { 
 
     $error[] = "Please check Filename"; 
 
    } 
 
\t 
 
// Check ID is not empty  
 
if(empty($_POST['id'])) 
 
    { 
 
     $error[] = "Please enter a ID"; 
 
    } 
 
\t 
 
\t else if(is_numeric($id)) 
 
{ 
 
// Check ID exists in database 
 
$query = "SELECT id FROM `test` WHERE `id` = :id" ; 
 
$stmt = $db->prepare($query); 
 
$stmt->bindParam(":id", $id); 
 
$stmt->execute(); 
 

 
if(!$stmt->rowCount() == 1) 
 
{ 
 
\t $error[] = "Please check ID"; 
 
} 
 
} 
 

 
else { 
 
\t $error[] = "ID is not numeric"; 
 
} 
 

 
// delete file from database if there are no errors 
 
    if (empty($error)) 
 
    { 
 
// path to the image 
 
    $file_to_delete = 'images/' . $filename; 
 
\t 
 
// Checks the file exists and that is a valid image 
 
     if(file_exists($file_to_delete) && getimagesize($file_to_delete)) 
 
     { 
 
// Delete File From Directory 
 
      unlink($file_to_delete); 
 
     } 
 
     else 
 
     { 
 
      $error[] = "File not found please check Filename"; 
 
     } 
 

 
if (empty($error)) 
 
{ 
 
// Run Query To Delete File Information From Database 
 
     try 
 
     { 
 

 
      $query = "DELETE FROM `test` WHERE `id` = :id"; 
 
      $stmt = $db->prepare($query); 
 
      $stmt->execute(array('id' => intval($_POST['id']))); 
 
     } 
 
     catch(PDOException $ex) 
 
     { 
 
      die("Failed to run query: Please report issue to admin"); 
 
     } 
 

 

 
     $status = "File Deleted"; 
 
    } 
 
} 
 
} 
 

 
// Run Query To Show The Current Data In Database 
 
try 
 
{ 
 
    $query = "SELECT id,photo FROM test ORDER BY id"; 
 
    $stmt = $db->prepare($query); 
 
    $stmt->execute(); 
 
} 
 
catch(PDOException $ex) 
 
{ 
 
    die("Failed to run query: Please report issue to admin"); 
 
} 
 
      
 
$rows = $stmt->fetchAll(); 
 
?> 
 

 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 
<html xmlns="http://www.w3.org/1999/xhtml"> 
 
<head> 
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
 
<title>Delete Image</title> 
 
<style type="text/css"> 
 
.table { 
 
    text-align: center; 
 
} 
 
.table { 
 
    font-weight: bold; 
 
} 
 
</style> 
 
</head> 
 

 
<body> 
 
<form action="delete2.php" method="post" enctype="multipart/form-data" class="table"> 
 
Please enter the Filename and ID of the image you wish to delete 
 
    <table width="178" align="center"> 
 
    <tr class="table"> 
 
     <td width="144" class="table">Filename</td> 
 
     <td width="30" class="table">ID </td> 
 
    </tr> 
 
    <tr> 
 
     <td><input name="filename" type="text" value="<?php echo $filename; ?>" /></td> 
 
     <td><input name="id" type="text" id="id" value="<?php echo $id; ?>" size="3" maxlength="4" /></td> 
 
    </tr> 
 
    </table> 
 
    <p> 
 
    <?php 
 
// Show validation errros here 
 
    if(!empty($error)): 
 
    echo implode('<br />', $error); 
 
\t echo $status; 
 
\t endif; 
 
    ?> 
 
    <br /> 
 
    <input type="submit" value="Delete Selected Image" name="delete" /> 
 
    </p> 
 
    <p>IMAGE DETAILS </p> 
 
    <table width="400" align="center" class="table"> 
 
    <tr> 
 
     <th width="61">ID</th> 
 
     <th width="185">Filename</th> 
 
     <th width="138">Image</th> 
 
    </tr> 
 
    </table> 
 
    <table width="400" align="center" class="table"> 
 
    <?php foreach($rows as $row): ?> 
 
     <tr> 
 
      <td width="61"><?php echo $row['id']; ?></td> 
 

 
      <td width="185"><?php echo $row['photo']; ?></td> 
 
      <td width="138" height="138"> 
 
       <img src="images/<?php echo $row['photo'] ; ?>" width="138" height="138" /> 
 
      </td> 
 
     </tr> 
 
    <?php endforeach; ?> 
 
</table> </p> 
 
    <p><br /> 
 
    <br /> 
 
    </p> 
 
</form> 
 
</body> 
 
</html>

0

Чтобы проверить, что файл является изображением:

$imagetest=false; 
$ext = end(explode('.',$filename)); 
switch(strtolower($ext)) { 
    case 'jpeg': 
     $imagetest=true; 
     break; 
    case 'jpg': 
     $imagetest=true; 
     break; 
    case 'gif': 
     $imagetest=true; 
     break; 
    case 'png': 
     $imagetest=true; 
     break; 
    case 'bmp': 
     $imagetest=true; 
     break; 
    default: 
     $imagetest=false; 
} 

И обеспечить пользователю пользователь не может выйти за пределы директории изображения, проверки ввода, так что это только имя файла , затем добавьте путь:

if(!preg_match('/^[\w,\s-]+\.[A-Za-z]+$',$filename)) { 
    $imagetest=false; 
} else { 
    $filepath='/to/your/path/image/' . $filename; 
} 

И тогда вы могли бы заменить вашу file_exists() с:

if(!getimagesize($filepath)) { 
    $imagetest==false; 
} 

Это будет гарантировать, что файл существует, и что это изображение.

+0

имя файла расширения не являются надежными. если вы используете getimagesize(), то вы можете прямо проверить, какой имидж есть там ... –

1

Существуют различные варианты, и если вы действительно обеспокоены безопасностью, вы не должны позволять конечным пользователям указывать имя файла вообще. Вместо этого вам может понадобиться раздавать случайно сгенерированные строки md5 или что-то подобное. Вы можете сохранить сопоставление между такой строкой md5 и именем файла в базе данных, которое вы, похоже, используете.

Если вам действительно нужно, чтобы пользователи указывали фактические имена файлов, вы можете убедиться, что они содержат только символы, которые вы считаете безопасными. Чем меньше символов вы позволяете, тем лучше. Например, если вы можете ограничить имена файлов a-z, A-Z, 0-9, _ и - плюс расширение файла, вы можете проверить следующим образом:

if (! preg_match("/^[a-zA-Z0-9_\-]+\.[a-zA-Z0-9]+$/", $filename)) { 
    throw new Exception("invalid filename pattern"); 
} 

Таким образом пользователи не могут указать имя файла, который пересекает границы каталога.

Чтобы ограничить имена файлов в определенное расширение, вы могли бы использовать что-то вроде этого:

if (! preg_match("/\.(jpe?g|png|gif)$/i", $filename)) { 
    throw new Exception("invalid file extension"); 
} 

Вы можете дополнительно проверить имя каталога собранного файла и вызвать ошибку, если имя каталога не то, что вы ожидаете:

if (dirname("images/" . $filename) !== "images") { 
    throw new Exception("cannot leave directory"); 
} 

Если вы беспокоитесь о безопасности и удалении неправильных файлов, вы также должны быть обеспокоены внедрением SQL. Ваш скрипт уязвим, потому что вы вставляя заданное пользователем значение в SQL запросе непроверенной:

$query = "DELETE FROM `test` WHERE `id` = $id" ; 

Что произойдет, если посты пользователя в id значение 1 OR true? Правильно, все ваши изображения будут удалены из базы данных!

+0

Хорошо спасибо, попробуете это завтра и загляните в обеспечение безопасности SQL-запроса дальше, какие-нибудь идеи, как это сделать лучше? – RicPurcell

+0

Всегда проверяйте и дезинфицируйте ввод пользователя, особенно перед тем, как вставлять его в SQL-запросы. Используйте параметры привязки в операторах SQL вместо конкатенации строк или используйте фреймворк. – stj

+0

как я мог бы это сделать, как я пробовал '$ query =" DELETE FROM 'test' WHERE' id' =: id "; try { $ stmt-> bindParam (': id', $ id); $ stmt = $ db-> prepare ($ query); $ stmt-> execute(); ' Но получить ошибку' Fatal error: вызвать функцию-член bindParam() для не-объекта в ./delete.php в строке 100 ' – RicPurcell

0

@ У Stretch был хороший ответ, но это может быть сделано меньше кода, если вы не возражаете против более длительного теста регулярных выражений.

if(!preg_match('/^\/?[\w\s-_]+\.(jpe?g|gif|png|bmp)$/', strtolower($filename)) || !getimagesize($filename)) { 
    $imagetest = false; 
} else { 
    $imagetest = true; 
} 

Также не забудьте правильно использовать подготовленные инструкции, если вы собираетесь использовать PDO для запросов к базе данных. Вы никогда не должны напрямую вставлять предоставленные пользователем данные в свои строки запроса, всегда создавайте свой запрос, а затем добавляйте свои данные в качестве значения привязки.

$sql = "DELETE FROM `test` WHERE `id` = :id"; 
$q = $conn->prepare($sql); 
$q->execute(array('id', (int)$id)); 
+0

как бы я это сделал? Я пробовал '$ query =" УДАЛИТЬ ОТ 'test' WHERE' id' =: id "; try { $ stmt-> bindParam (': id', $ id); $ stmt = $ db-> prepare ($ query); $ stmt-> execute(); ' Но получите ошибку« Неустранимая ошибка: вызов функции-члена bindParam() для не-объекта в/home/u271859679/public_html/gallery/display/New/delete.php on line 100 " – RicPurcell

+0

Вы вызываете метод bindParam() на $ stmt перед тем, как создать экземпляр объекта $ stmt. –

+0

Спасибо, что вы отлично поработали, поэтому параметры привязки должны быть отправлены после инструкции по подготовке Можете ли вы также рассказать мне, как чтобы избавиться от 'Предупреждение: getimagesize(): Имя файла не может быть пустым в /../delete.php в строке 67', а также мой' $ status = "Пожалуйста, проверьте имя файла" ' Я не хочу, чтобы пользователь чтобы видеть это предупреждение только '$ status =" Пожалуйста, проверьте имя файла "' – RicPurcell