Назначение переменной JavaScript для всплывающих окон приводит к ошибке «Отказано в доступе» в IE8 - PullRequest
0 голосов
/ 17 марта 2011

Я исчерпывающе исследовал эту проблему на стековом потоке, а также на других сайтах.В Javascript и IE есть несколько сообщений об ошибках «отказано в разрешении», но ни одна из них не пролила свет на мою конкретную проблему.

Я разработал сайт с использованием PHP в 2009 году для клиента, который помогает им отслеживать продуктинвентарь.Одной из предоставляемых функций является возможность создания нового продукта и назначения изображения, которое требует от них загрузки файла изображения.Возможность для них редактировать изображение существующего продукта таким же образом, также существует.Это делается с помощью всплывающего окна, которое открывается всякий раз, когда пользователь нажимает кнопку «Загрузить» для изображения товара.Код родительского окна выглядит следующим образом:

function openPopUp( thisForm )
{
            var ProductId = thisForm.product_id.value;
            var ProductName = thisForm.product_name.value;
            var URL = "../imageupload/index.php?product_id=" + ProductId + "&product_name=" + ProductName;
            var win = window.open ( URL, "imageUploadWindow", "location=0,status=1,scrollbars=1,width=700,height=600,resizeable=1,directories=0,toolbar=0");
            win.targetField = thisForm.image;
            win.focus();
}

Вот вызываемая функция openPopUp ():

<form class="productForm" name="form" action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
    ...
    <td class="maintable"><input type="text" name="image" readonly="readonly" size="20" />
    <td class="maintable"><input type="button" value="Upload" name="imageButton" onclick="openPopUp(this.form)" />
    ...
</form>

Идея, стоящая за этим, заключалась в том, чтобы вводить текст только для чтения народительское окно, которое будет принимать значение имени файла для изображения.Это имя файла будет передано обратно в родительское окно всплывающим окном после того, как пользователь успешно загрузил изображение.Пользователь должен закрыть всплывающее окно и затем нажать кнопку «обновить» в родительском окне, чтобы отправить обновления продукта (включая имя файла изображения) в базу данных.Для справки, это функция во всплывающем окне, которая передает имя файла родителю:

function setImageFileName ( fileName )
{
            var opener = window.opener;
            if ( opener && !opener.closed && opener.setTargetField )
            {
                var fileNameShort = /([^\\]+)$/.exec(fileName)[1];
                opener.setTargetField ( targetField, fileNameShort );
            }
}

Вот HTML-код во всплывающем окне для обработки выбора имени файла и загрузки:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <p>
    <label for="file">Select a new image file:</label> <input type="file" name="imagefile" id="file"> <br />
    <button onClick="setImageFileName(this.form.imagefile.value)">Upload File</button>
    </p>
</form>

Этот код прекрасно работает в любом браузере, кроме IE8.На самом деле, раньше он работал в IE7, когда я изначально разрабатывал это в 2009 году. Теперь действительно работает только создание нового продукта, хотя HTML, который отображается в скрипте PHP, вызываемом при выполнении загрузки, не отображается в IE (большеоб этом позже).Основная проблема возникает в IE, когда пользователь нажимает кнопку «загрузить» в родительском окне при редактировании существующего продукта.Консоль сценариев IE отображает ошибку «Отказано в доступе» в следующей строке:

win.targetField = thisForm.image;

Я пробовал несколько вещей, в том числе обеспечение того, что проблемы между доменами не являются фактором.URL, открываемые во всплывающем окне, очевидно, находятся в одном домене.Я изменил настройки безопасности в IE, чтобы «разрешить междоменный доступ».Любопытно, что проблема «отказано в разрешении» возникает только при редактировании изображения существующего продукта, хотя редактирование существующего и создание нового продукта совместно используют один и тот же Javascript, несмотря на то, что это разные файлы PHP.

тот факт, что HTML, отраженный PHP, выполняющим фактическую загрузку файла, не появляется во всплывающем окне.Вот этот PHP для справки:

if ( move_uploaded_file ( $_FILES['imagefile']['tmp_name'], $realpath . $filename ) )
{
    chmod ( $realpath . $filename, 0755 );
    echo "Your file upload was successful.  New product image:<br /><br />";
    echo "<img src=\"" . $imagePath . $filename . "\" alt=\"New image file\" title=\"New image file\" border=\"0\" />";
    echo "<p>Remember to click the Update button for this product on the main page to finish your changes.</p>";
    echo "<a href=\"javascript: self.close()\">Close</a>";
}

Опять же, это работает правильно в других браузерах.Когда пользователь нажимает кнопку «Загрузить файл» во всплывающем окне, приведенный выше PHP запускается во всплывающем окне и отображается по желанию, но не в IE!Оригинальный HTML для всплывающего окна остается, создавая впечатление, что загрузка не произошла, но на самом деле это произошло.Все это изначально работало в IE, когда оно было впервые разработано.

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

1 Ответ

0 голосов
/ 28 апреля 2011

В IE8 Microsoft произвела много изменений безопасности, с 1 из которых вы столкнулись.

Вы пытаетесь получить значение поля поля <input type="file"/> и передать его чему-то другому (в данном случае открытиеокно).

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

  1. Копирование значения имени файла из поля НЕ допускается (сравнение с пустой строкой все еще должно работать в целях проверки)
  2. Ввод имени файла больше не разрешен, вам нужно выбрать файл в окне выбора файлов (останавливает анализ клавиатуры)
  3. На стороне сервера вы можете очень скорее всего, получит только имя файла, , а не полный путь (предотвращает попадание полу-приватной информации в руки хакеров (не уверен, что они будут делать с этим, но, увы, это новая норма))

В результате, я думаю, что вы попали в пункт № 1 выше, и, следовательно, IE по сути выходит из вашего скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...