document.getElementByID.InnerHTML注入无效字符

时间:2015-09-30 23:04:19

标签: javascript php html innerhtml exif

我一直在寻找这个问题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 ....并将<p>更改为正确的标题/主题/评论..

<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和文本更改适用于翻转但是 它在<p>中显示出来 标题:H a p p y C o u p l e 主题:E n j o y i n g I N S u m m e r s 评论:

这是文本更改的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>

2 个答案:

答案 0 :(得分:0)

我终于找到了解决问题的功能......

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

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

答案 1 :(得分:0)

背景

问题可能是图像文件中标签格式错误的结果。即标记文本被写为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&#34;替换字符&#34;,代码点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, "");
    }
    
  3. 这至少清理了帖子中的字符串,但不会恢复存在的任何Unicode字符。

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

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

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