Пожалуйста, помогите мне очистить данные php goint для mysql

0

Привет друзья У меня есть форма с mysqli comnnection

<label for="fullname">Fullname</label>
<input type="text" name="fullname" />

<label for="photo">Upload photo</label>
<input name="photo" type="file"/>

а на концах php я

$fullname = $_POST['fullname'];

    $uploaddir = './uploads/';
    //upload file in folder
    $uploadfile = $uploaddir. basename($_FILES['photo']['name']);
    //insert filename in db
    $upload_filename = basename($_FILES['photo']['name']);
    move_uploaded_file($_FILES['photo']['tmp_name'], $uploadfile);
    $photo = $upload_filename;

$sql = "INSERT INTO members(fullname,photo) VALUES('$fullname', '$photo')";
$stmt = $link->query($sql) or die($link->error);
    $stmt->close;

Пожалуйста, помогите мне, я использую это на живом сайте

  • 1
    В чем вопрос?
  • 0
    Кто-нибудь может подсказать мне, как ограничить тип файла? Большое спасибо
Теги:

6 ответов

3
Лучший ответ

Вместо этого используйте подготовленные инструкции:

$fullname = $_POST['fullname'];

    $uploaddir = './uploads/';
    //upload file in folder
    $uploadfile = $uploaddir. basename($_FILES['photo']['name']);
    //insert filename in db
    $upload_filename = basename($_FILES['photo']['name']);
    move_uploaded_file($_FILES['photo']['tmp_name'], $uploadfile);
    $photo = $upload_filename;

$sql = "INSERT INTO members(fullname,photo) VALUES(?, ?)";
$stmt = $link->prepare($sql);
$stmt->bind_param('ss',$fullname,$photo);
$stmt->execute();

Для получения дополнительной информации см. подготовленные заявления и параметризованные запросы Это отличная возможность защитить вас от SQL-инъекции.

4

Увидев, что вы используете mysqli, вы получаете параметризованные запросы. Это, как правило, менее беспорядочно, чем пытаться избежать строк:

$q= $mysqli->prepare('INSERT INTO members (fullname, photo) VALUES (?, ?)');
$q->bind_param('ss', $fullname, $photo);
$q->execute();

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

Другие потенциально неприятные имена файлов включают пустые строки, не-ASCII и управляющие символы, .htaccess на сервере Apache и файлы с ведущими/конечными точками и пробелами или с использованием одного из системных зарезервированных имен файлов на сервере Windows. Кроме того, кажется, что нет защиты от пользователя, загружающего фотографию, которая перезаписывает другого пользователя, что, скорее всего, произойдет случайно.

Как правило, лучше создать имя файла из случайного числа или первичного ключа строки и добавить расширение, которое вы хотите (например, .jpeg). Санизировать предоставленные пользователем имена файлов гораздо сложнее, чем вы думаете.

Пожалуйста, помогите мне, я использую это на живом сайте

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

  • 0
    +1 для параметризованных запросов.
1

Возможно, вам нужен mysql_real_escape_string()?

http://php.net/manual/en/function.mysql-real-escape-string.php

  • 1
    mysql_real_escape_string Не требуется при использовании mysqli
  • 0
    Я предполагаю под названием ... Что показывает, что это mysqli?
0

Я предлагаю заполнители, используя существующую библиотеку баз данных для PHP: PDO или что-то из Pear, например Pear:: MDB2. С помощью заполнителей вы гарантируете правильное экранирование библиотеки базы данных, и ваш код становится немного легче читать.

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

$sql = "INSERT INTO members (fullname,photo) VALUES (?, ?)";
$values = array($fullname, $photo) ;

$prepared = $link->prepare($sql) ;
$result = $prepared->execute($values) ;

edit Я просто понял, что вы используете mysqli, поэтому для продолжения использования смотрите здесь или здесь для учебных пособий.

$sql = "INSERT INTO members (fullname,photo) VALUES (?, ?)";
$stmt = $link->prepare($sql) ;
//ss means the 2 parameters after it should be treated as string, string
$stmt->bind_param('ss', $fullname, $photo) ;

$result = $stmt->execute() ;
0

Я хотел бы прокомментировать это:

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

Как правило, лучше генерировать имя файла из случайного числа или первичного ключа строки и добавлять расширение, которое вы хотите (например,.jpeg). Санизировать предоставленные пользователем имена файлов гораздо сложнее, чем вы думаете.

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

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

-2
  • 0
    Эта статья полна ужасных советов. Каждое значение должно быть передано через mysql_real_escape_string , а не только те, которые выглядят как строки. Вы должны явно указывать значения в кавычках, если известно, что они являются строками в БД, а не потому, что пользователь вводит нечто, похожее на строку. Его проверка номеров ужасно хрупкая. В статье также рекомендуется проверить расширение файла для проверки его типа. Исполняемый файл с другим именем остается исполняемым!
  • 0
    Я никогда не говорил, что вы должны следовать всем советам из этой статьи. Только 3-й, и это кажется мне вполне разумным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню