【问题标题】:Javascript variable assignment for popup results in "Permission denied" error in IE8弹出窗口的 Javascript 变量分配导致 IE8 中的“权限被拒绝”错误
【发布时间】:2011-03-17 16:34:11
【问题描述】:

我已经在 stackoverflow 和其他网站上详尽地研究了这个问题。有几篇关于 Javascript 和 IE 中的“权限被拒绝”错误的帖子,但没有一个可以阐明我的特定问题。

我在 2009 年使用 PHP 为客户开发了一个网站,帮助他们跟踪产品库存。提供的一项功能是能够创建新产品并分配图像,这需要他们上传图像文件。他们以相同方式编辑现有产品图像的能力也存在。每当用户单击产品图像的“上传”按钮时,都会打开一个弹出窗口来完成此操作。父窗口的代码如下所示:

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 之外的任何浏览器中都能完美运行。事实上,当我在 2009 年最初开发时,它以前在 IE7 中工作。现在,只有创建一个新产品才能真正工作,尽管在执行上传时调用的 PHP 脚本回显的 HTML 不会出现在 IE 中(更多稍后再说)。当用户在编辑现有产品时按下父窗口中的“上传”按钮时,IE 中会出现主要问题。 IE 的脚本控制台在以下行反映了“Permission denied”错误:

win.targetField = thisForm.image;

我已经尝试了很多方法,包括确保跨域问题不是一个因素。在弹出窗口中打开的 URL 显然在同一个域上。我已将 IE 中的安全设置更改为“允许跨域访问”。奇怪的是,“权限被拒绝”问题只发生在编辑现有产品的图像时,尽管编辑现有产品和创建新产品共享相同的 Javascript,尽管它们是不同的 PHP 文件。

“权限被拒绝”问题的第二个问题是 PHP 执行实际文件上传时响应的 HTML 没有出现在弹出窗口中。这是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 最初开发时都可以使用。

我知道这是一篇很长的帖子,而且我可能把事情复杂化了,但这对我来说是一个令人困惑的问题。希望这是我看不到的小东西。我感谢社区可能提出的任何建议。提前致谢。

【问题讨论】:

    标签: php javascript internet-explorer-8


    【解决方案1】:

    在 IE8 中,Microsoft 进行了许多安全更改,您已经遇到了其中的 1 个。

    您正在尝试获取 &lt;input type="file"/&gt; 字段的字段值并将其传递给其他对象(在本例中为打开的窗口)。

    为了帮助防止 XSS 攻击和隐私信息的泄露,我们进行了更改以反映其他浏览器所采取的安全措施。因此,您可能会发现以下项目不再被允许或受到严格限制。

    1. 不允许从字段中复制文件名值(与空字符串比较仍可用于验证目的)
    2. 不再允许输入文件名,您需要从文件选择器中选择一个文件(停止键盘嗅探)
    3. 在服务器端,您可能非常可能只获取文件名,完整路径(阻止半私人信息的暴露落入黑客手中(不知道他们会用它做什么,但唉,这是新规范))

    因此,我认为您正在点击上面的第 1 项,因此 IE 基本上退出了您的脚本。

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多