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 " . $Client_First_Name ." for filling out the Dermatology Questionnaire for your pet " .$Pet_Name . ". 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'> </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'> </td></tr>";
$message .= "<tr><td colspan='2'> </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'> </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'> </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'> </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的主要内容,如果未能解决你的问题,请参考以下文章
发送包含这些附件、htmlbody、内联图像或所有这些附件的 mime 消息?
多部分/表单数据请求的 Indy MIME 解码返回尾随 CR/LF