MIME 1.0 URL 包含 %0D%20

Posted

技术标签:

【中文标题】MIME 1.0 URL 包含 %0D%20【英文标题】:MIME 1.0 URL contains %0D%20 【发布时间】:2019-07-08 18:27:43 【问题描述】:

我有一个 php 脚本,它会在提交时向用户发送电子邮件,但我遇到了一个问题,即消息中的嵌入式链接在 URL 本身中包含 %0D%20。

当您单击链接时,我无法弄清楚如何摆脱它,这显然不是链接。

显示的 URL 是正确的,没有 %0D%20,但是,当您将鼠标悬停在标记上时,我会看到此信息。

当你点击链接时,它会打开:

https://URL/public/dermatology/2019/client_generatePDF.p%0D hp?id=21%08 8&pid=Horus 

现在在扩展php中间有一个%0D,在数据库ID中间有一个%08,它来自$last_id,即插入数据库的记录的ID

我也试过 href='" . $url_pdf ."'

这是脚本的链接部分。

$message .= "<tr><td colspan='2'>Link to full history: <a href='$url_pdf' target='_blank'>" . $url_pdf ." </a></td></tr>";




$last_id = $stmt->insert_id;
    $PetName2 = trim($_POST['Pet_Name']);

    $url = "https://URL/public/dermatology/2019/client_upload_form.php?id=". $last_id . "&pid=" . $PetName2 ;
    $url_pdf = "https://URL/public/dermatology/2019/client_generatePDF.php?id=". $last_id . "&pid=" . $PetName2 ;

    $email = "SEND EMAIL";
    $to = "EMAIL, $ClientEmailAddress";
    $from = "VMC Dermatology Form Submission";
    $subject = "Dermatology Client Form Submission: " . $UMNCaseNo . "";

    $headers = "From: " . strip_tags($email) . "\r\n";  
    $headers .= "MIME-Version: 1.0 \r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1 \r\n";

    $message = '<html><body><h3>A Dermatology Consultation Has Been Submitted.</h3><br />';
    $message .= "<br />";
    $message .= "<br />";
    $message .= "Thank you&nbsp; " . $Client_First_Name ." &nbsp; for filling out the Dermatology Questionnaire for your pet " .$Pet_Name . ".&nbsp;Your information has been received. If applicable, you may submit photos regarding your pets skin condition using the following link. <a href='" .$url. "' > ". $url ."</a>";
    $message .= "<br />";
    $message .= "<br />";
    $message .= "<table rules='all' style='border-color: #666;' cellpadding='10'>";
    $message .= "<tr style='background: #eee;'>  <td width='178px'><strong>Today's Date:</strong> </td>  
                  <td width='380px'>" . $date2 . "</td></tr>";
    $message .= "<tr> <td><strong>Case Number:</strong></td>  <td>" . $UMNCaseNo . "</td></tr>";
    $message .= "<tr> <td><strong>Clinic to Be Seen at:</strong></td>  <td>" . $ClinicToBeSeenAt . "</td></tr>";
    $message .= "<tr><td colspan='2'>&nbsp;</td></tr>";
    $message .= "<tr> <td><strong>Client Name:</strong> </td><td>" . $Client_First_Name . " ". $Client_Last_Name ."</td></tr>";
    $message .= "<tr><td><strong>Client Phone Number:</strong></td> <td>" . $Phone . "</td></tr>";
    $message .= "<tr><td><strong>Client Email:</strong></td> <td>" . $ClientEmailAddress . "</td></tr>";
    $message .= "<tr><td colspan='2'>&nbsp;</td></tr>";

    $message .= "<tr><td colspan='2'>&nbsp;</td></tr>";
    $message .= "<tr><td><strong>Pet Name:</strong></td> <td>" . $Pet_Name . "</td></tr>";  
    $message .= "<tr><td><strong>Species:</strong></td> <td>" . $Species . "</td></tr>";    
    $message .= "<tr><td><strong>Breed:</strong></td> <td>" . $Breed . "</td></tr>";
    $message .= "<tr><td colspan='2'>&nbsp;</td></tr>";
    $message .= "<tr style='background: #eee'><td colspan='2'><strong>Reason for Visit:</strong></td></tr>";
    $message .= "<tr><td colspan='2'>" . $Reason_for_Visit . "</td></tr>";
    $message .= "<tr><td colspan='2'>&nbsp;</td></tr>";
    $message .= "<tr><td colspan='2'>Link to full history: <a href='$url_pdf' target='_blank'>" . $url_pdf ." </a></td></tr>";
    $message .= "<tr><td colspan='2'>&nbsp;</td></tr>";
    $message .= "</table>";
    $message .= "</body></html>";
    $message .= "<br />";

if(mail($to,$subject,$message,$headers))

【问题讨论】:

【参考方案1】:

%0D%20 是一个 URL 编码的换行符,后跟一个空格。浏览器会显示它的解码版本,这就是为什么你只能在翻转时看到它。过滤您的文件名中的字符,例如:

$url_pdf = preg_replace('/[ \n\r\t]/', '', $url_pdf);

您当然需要确保使用此过滤后的名称保存文件,否则您的下载将中断。

我还建议使用 PHPMailer,因为您用它标记了问题。

【讨论】:

谢谢。那是行不通的。我没有在上面包含它,我应该包含这些字符,这些字符被包含在服务器上“静态”文档的名称中。因此,显示的可悬停 URL 类似于 URL/public/dermatology/2019/client_generatePDF.p%0D hp?id=21%08 8&pid=Horus,其中服务器上的文档称为 client_generatedPDF.php,然后在数据库 ID 中间抛出 %08 $last_id 看起来您需要对输入进行更多过滤;那些角色不应该首先进入那里。 没有输入该信息。它是一个固定的 URL。链接已设置。我唯一包括的是数字,它来自数据库。它不是由数据库以外的任何人在任何地方输入的任何数据。 硬编码的设置 URL 是 client_generatePDF.php?id=$last_id&pid=$Pet_Name ($Pet_Name 是唯一以 html 形式输入的数据。但这不是问题.. . 问题在于实际的硬编码 URL 和 $last_id,它被插入到数据库中的 URL 字符串中。 它不知何故进入了那里。验证一切。假设什么。不要相信你能看到的 - 十六进制转储你的字符串并检查每个字节。

以上是关于MIME 1.0 URL 包含 %0D%20的主要内容,如果未能解决你的问题,请参考以下文章

包含扩展字符的 MIME 附件名称失败

发送包含这些附件、htmlbody、内联图像或所有这些附件的 mime 消息?

多部分/表单数据请求的 Indy MIME 解码返回尾随 CR/LF

Http 响应包含 MIME 流.. 它具有由边界字符串分隔的二进制图像.. 需要获取这些图像并使用 c# 保存

在 MIME 多部分消息中显式指定边界?

仅发送纯文本电子邮件,正文中包含 Rails mime 部分