【问题标题】:document.getElementByID.InnerHTML injecting invalid charactersdocument.getElementByID.InnerHTML 注入无效字符
【发布时间】:2015-09-30 23:04:18
【问题描述】:

我已经寻找这个问题 3 天了 - 并尝试任何接近或相关的东西,看看我是否可以让它工作....

我正在使用 PHP 从 JPG 文件中提取 EXIF 标签

并在一个简单的鼠标悬停脚本中使用它,但这就是它崩溃的地方:

获取 EXIF 数据

foreach($images as $img){

    $exif = exif_read_data($img, 0, true);

在我的测试过程中,我简化了变量名——我认为这没有必要,但这就是我现在的位置

$Ititle =  $exif['IFD0']['Title'];
    $Isubject = $exif['IFD0']['Subject'];
    $Icomment = $exif['IFD0']['Comments'];
    $m = "<p>Title: ".$Ititle."<BR>Subject: ".$Isubject."<BR>Comments: ".$Icomment."</p>";
    echo $m;

这个 Echo $m 按预期工作了 Jpg 图像中的标题/主题/评论。

所以我有一个缩略图图像,使用鼠标悬停将大图像“preview1.2.3.4 ...”更改为您鼠标悬停的img ....并将&lt;p&gt;更改为正确的标题/主题/ cmets..

<img onmouseover="document.getElementById('exifdata<?echo $b;?>').innerHTML = '<?echo $m;?>'; preview<?echo $b;?>.src=img<?echo $p;?>.src" name="img<?echo $p;?>" src="<?echo $img;?>" style="float:left; margin-right:10px; Max-width: 100px; Max-height:100px; width:auto; height:auto;">

Img 和文本更改适用于翻转但 在&lt;p&gt; 中显示如下 标题:H.a.p.p.y..C.o.u.p.l.e.. 主题:E.n.j.o.y.i.n.g..I.N..S.u.m.e.r.... 评论:

这里是文本变化的DIV

<div style="width:680px; height:auto; overflow:hidden; background: rgba(66, 95, 149, 1);">
    <p id='exifdata<?echo $b;?>'>testing
    </p>
      </div>

在通过这个innerHTML之后添加这些问号是什么?

还有整个 php 页面:*对不起,如果它很乱 - 我已经尝试了很多东西

<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<?php
header('Content-Type:text/html; charset=UTF-8');
$b = 1;

$blogs = array_filter(glob('./Content/*'), 'is_dir');
foreach($blogs as $entries){
    /*
    print "<br>";
    print $entries;
    print "<br>";
    print "<p>Images</p>";
    */
    #get all the JPG s in the blog folder
    $images = array_filter(glob("$entries/*.JPG"));

    #get Textblock and title txt files for verbage....
    $textblock = file_get_contents("$entries/Textblock.txt");
    $title = file_get_contents("$entries/Title.txt");

    #get date for post
    $PostDatestr = substr($entries,-8);
    $PostDate = date("d M Y", strtotime($PostDatestr));

    #Create Entry regardless of type:
    ?>
<div id="Notice">
  <div id="Title"><h2><?echo $title;?></h2></div>
    <section class="Wrapper">
      <header class="Wrapper"><h1><?echo $PostDate;?></h1></header>
        <article>
    <?


    #print the Blog post....  if one or less photos in DIR
    if (count($images) <= 1){
    #Don't use img tag if there are 0 images.
        if (count($images) === 1){
            ?><img src="<?echo $images[0];?>" style="float:left; margin-right:10px; Max-width: 680px; Max-height:680px; width:auto; height:auto;">
            <?
        }
        echo $textblock;

    }
    #print the Blog post.... if there is more than 1 photo in DIR
    if (count($images) > 1){
        #get info for each photo

        ?>
        <div class="thumbnails" style="width;100%; height:auto; display:block; overflow:hidden;">
        <?
        foreach($images as $img){

        $exif = exif_read_data($img, 0, true);
        $Ititle =  $exif['IFD0']['Title'];
        $Isubject = $exif['IFD0']['Subject'];
        $Icomment = $exif['IFD0']['Comments'];
        $m = "<p>Title: ".$Ititle."<BR>Subject: ".$Isubject."<BR>Comments: ".$Icomment."</p>";
        echo $m;
        #echo $exif===false ? "No header data found.<br />\n" : "Image contains headers<br />\n";
        ?>

        <img onmouseover="document.getElementById('exifdata<?echo $b;?>').innerHTML = '<?echo $m;?>'; preview<?echo $b;?>.src=img<?echo $p;?>.src" name="img<?echo $p;?>" src="<?echo $img;?>" style="float:left; margin-right:10px; Max-width: 100px; Max-height:100px; width:auto; height:auto;">
                <?
        $p++;
        $lastimg = $img;
        }
        ?>
        </div>
        <br><br>

        <div class="preview<?echo $b;?>" align="center" Style="width:640px; margin:0 auto; overflow:hidden;">
            <img name="preview<?echo $b;?>" src="<?echo $lastimg;?>" style="float:left; margin-right:10px; Max-width: 680px; Max-height:680px; width:auto; height:auto;" alt=""/>
        </div>
        <div style="width:680px; height:auto; overflow:hidden; background: rgba(66, 95, 149, 1);">
        <p id='exifdata<?echo $b;?>'>testing
        </p>
          </div>


    <?
    }
    ?>
        </article>
    </Section>
 </div> 

<?
    $b++;
    }

?>  
</body>
</html>

【问题讨论】:

  • 我的直接想法是“happy couple”和“enjoying...”是 16 位字符串被解释为 8 位字符串。鉴于“标题”、“主题”和“评论”应该出现,我建议查看 $m = "&lt;p&gt;Title: ".$Ititle."&lt;BR&gt;Subject: ".$Isubject."&lt;BR&gt;Comments: ".$Icomment."&lt;/p&gt;"; 的字符处理
  • 谢谢 - 有没有办法以 16 位回显,或将变量转换为 8 位?
  • 请确认$Isubject = $exif['IFD0']['Subject']; 的字符串长度是您预期的两倍。这将确认字符编码问题是问题的基础,并允许以更少的猜测工作获得适当的答案。
  • 好吧 strlen($Isubject) 显示 26,印有 � 的字符串是 26,没有 �,应该是 12 - 几乎一半....

标签: javascript php html innerhtml exif


【解决方案1】:

终于找到解决问题的函数了……

https://stackoverflow.com/a/20103241/1112764

谢谢! 我尝试了所有不同的编码/解码方法,用不同的程序重新标记到 JPG 中 - 我不得不使用这种方法去除无效字符。

【讨论】:

  • 我发帖后才看到你的回复。
【解决方案2】:

背景。

问题可能是图像文件中的标签格式错误造成的。即标签文本写为 Unicode (16),但在标签标题字段中列为 ASCII。标记格式在 2002 年的 Exif 2.2 和 2012 年的 Exif 2.3 (JEITA CP-3451) 中进行了描述。如果 exif_read_data 将所有内容都视为 ASCII 而与格式标志无关,则会出现相同的结果。

有报告称图像文件处理软件将错误引入 Unicode 图像标签。例如,这个 KDE 错误 EXIF UserComments with special characters get tagged as ASCII 仍然可能是一个问题,具体取决于图像历史记录。

� 字符本身是 Unicode“替换字符”,码位 65533 十进制,用于替换字符串中的无效字符。对于存储为 16 位值的 ASCII 文本,高位字节为零(ASCII NUL 字符),很可能是被替换的字符。发生替换的地方未得到证实——图像标签可能标记为 Unicode 并包含替换字符(不太可能),exif_read_data() 可能正在插入它们(可能但未经证实),或者浏览器可能正在用替换字符替换 NUL 字符(不太可能或取决于浏览器)。

我可以建议检查以下内容:

  1. PHP setup 需要对 Unicode 字符正确,并且模块 mbstring 必须可用。如果您必须处理来自需要不同设置的不同系统的图像,则文档无法很好地阅读。

  2. 一个具有明显限制的快速解决方案是通过删除 NUL 和替换字符将标签字符串转换为 US-ASCII 或至少 Latin1 8 位八位字节。这样做的功能是

    function annul(s)
    {   return s.replace(/[\u0000|\uFFFD]/g, "");
    }
    

这至少清理了您帖子中的字符串,但不会恢复任何 Unicode 字符。

  1. 更难的方法是从标记字符串中返回的字符对重构 Unicode 16 值。必须这样做意味着 PHP 存在严重问题,或者图像文件编码错误,或两者兼而有之,并且可能并非在所有情况下都有效。

  2. 理想的情况是为 Unicode 设置 PHP exif.ini,并使用适合设置的编码声明正确标记所有图像。

决定采取什么行动很大程度上取决于您的网站是否支持 Unicode 和全球语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多