Я пытаюсь создать сценарий для сохранения ссылки на изображение в базе данных, например example.com/image.jpg все работает нормально, я просто хочу, чтобы, если кто-то вводил неправильный URL-адрес, например, без расширения .jpg , .png or .gif, он выдавал ошибку пользователю, поэтому он вводил правильный URL-адрес

Вот мой код PHP

if(isset($_POST['img']));
  $img = $_POST['img'];
  $ti = $_POST['titl'];

  $query = mysqli_query($con,"SELECT * FROM image WHERE url='$img'")

   or die(mysqli_error($con));  
      if(mysqli_num_rows($query) > 0 ) { //check if there is already an entry for that word
        echo "Image already exists! ";
      }
      else {
        mysqli_query($con,"INSERT INTO image (Title, url,) VALUES ('$ti','$img')");
    echo "Image Successfully Added";
 }

А вот и html

<form  action="" method="POST" >
  <span>Title:</span>
  <input  type="text" name="titl" maxlength="100" /><br>
  <span>Image URL:</span> 
  <input  type="text" name="img" maxlength="300" />
  <input type="submit" value="Add Image!" id="subm" class="button" />
</form>
0
user3478845 3 Апр 2014 в 01:07
Попробуйте проверить, заканчивается ли желаемое расширение: stackoverflow.com/a/10473026/3315914
 – 
rpax
3 Апр 2014 в 01:10
Вы можете сохранить суффикс в отдельном столбце
 – 
Medda86
3 Апр 2014 в 01:12
Удалите ; в if(isset($_POST['img'])); плюс изображение... хм... разве это не должно быть больше похоже на if(isset($_FILES['img']))? Да
 – 
Funk Forty Niner
3 Апр 2014 в 01:12
1
Все работает нормально... правда? Я очень сомневаюсь в этом. В вашей форме отсутствует символ enctype='multipart/form-data'.
 – 
Funk Forty Niner
3 Апр 2014 в 01:14
Да, это рабочий скрипт @Fred-ii-
 – 
user3478845
3 Апр 2014 в 01:15

2 ответа

Лучший ответ
$accept = ['.jpg', '.gif', '.png']; // the file extensions you will accept

if (in_array(substr($img, -4), $accept)) // check last 4 chars in $accept
{
    echo "This works";
    // update mysql table
} // if
else
{
    echo "This fails";
} // else

Это просто способ проверить имя файла, а не его содержимое. Как упомянул @ Fred-ii: изображение все еще должно быть очищено от вредоносного кода. Одной из предварительных мер было бы переименовать файл во что-то случайное и сохранить случайный идентификатор в базе данных. Вы также можете использовать GD или ImageMagick для копирования файла в масштабе 1: 1, что позволит сжать файл и удалить любой вредоносный код. Вы также можете передать изображение из другого домена, если он у вас есть, чтобы защитить ваш основной сайт и его данные.

0
graemeboy 3 Апр 2014 в 01:36
1
Это не лучшее решение. Любой хакер может передать .jpg и т. д., а затем внедрить функцию переименования для запуска как PHP.
 – 
Funk Forty Niner
3 Апр 2014 в 01:18
Да, он работает нормально, но notepad++ показывает красную линию на строке &accept =
 – 
user3478845
3 Апр 2014 в 01:24
@ Fred-ii- Хороший звонок; потребуется дезинфицировать ввод. Это все еще может быть предварительным шагом для создания работоспособного пользовательского интерфейса; обычно делается на интерфейсе, чтобы помочь пользователю.
 – 
graemeboy
3 Апр 2014 в 01:26
Спасибо за помощь, братан :)
 – 
user3478845
3 Апр 2014 в 01:29

Вы знаете функцию взрыва PHP? http://www.php.net/manual/pt_BR/function.explode.php

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

0
gcolucci 3 Апр 2014 в 01:15
Нет, я не использую JavaScript
 – 
user3478845
3 Апр 2014 в 01:23
Так что вы можете сделать это на стороне PHP, как мы предложили. Просто убедитесь, что если вы используете код @graemeboy, который вы рассматриваете как расширение .jpeg, для которого потребуется подстрока длиной более 4 букв, а также обратите внимание на нарушения безопасности. Кроме того, исправьте строку с if (isset($_POST['img']));, которая работает только потому, что у вас не было ни одного неустановленного изображения.
 – 
gcolucci
4 Апр 2014 в 01:50