gpt4 book ai didi

php - 我可以通过仅替换 CR 来避免 CRLF 注入(inject)攻击吗?

转载 作者:可可西里 更新时间:2023-10-31 22:06:40 25 4
gpt4 key购买 nike

我有一个允许一个文件附件并生成一封电子邮件到硬编码地址的表单。我想避免恶意用户输入自定义邮件 header 的可能性(CRLF 注入(inject),因为根据 RFC 电子邮件 header 以\r\n 结尾,所以称为 CRLF 注入(inject))。

假设我对可能进入 $additional_headers 的每条数据运行以下函数参数:

<?php

function strip_crlf($string){ return str_replace("\r\n", "\n", $string); }

?>

这仅替换了 CRLF 对的回车一半。这能充分防止潜在的攻击吗?

通常我会用空字符串替换\r\n 。但是这种特殊形式允许一个附件,这意味着消息正文实际上最终会通过 $additional_headers 参数传递,因为 PHP 没有用于构建多部分 MIME 编码电子邮件的 native 函数(据我所知)。

如果有人关心,这是我发送附件的函数:

<?php
function mail_attachment($to, $from, $from_name, $subject, $message, $file = false, $filename = false, $filetype = false){

// Remove CRLF sequences from everything that might go into a header
$from = strip_crlf($from);
$from_name = strip_crlf($from_name);
$message = strip_crlf($message);
if($filename){ $filename = strip_crlf($filename); }
if($filetype){ $filetype = strip_crlf($filetype); }

// $to and $subject escaping handled natively by mail();
// $file is base64 encoded before mail_attachment() is called.

$header = '';

// No file attachment; just send a regular email.
if(!$file){
$header .= "From: ".$from_name." <".$from.">\r\n";
return mail($to, $subject, $message, $header);
}

$uid = md5(uniqid(time()));

// Build a MIME encoded message.
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"$uid\"\r\n\r\n";
$header .= "This is a multi-part message in MIME format.\r\n";
$header .= "--$uid\r\n";
$header .= "Content-type:text/plain; charset=utf-8\r\n";
$header .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
$header .= "$message\r\n\r\n";
$header .= "--$uid\r\n";
$header .= "Content-Type: $filetype; name=\"$filename\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"$filename\"\r\n\r\n";
$header .= "$file\r\n\r\n";
$header .= "--$uid--";

// Send the mail.
return mail($to, $subject, '', $header);
}

?>

最佳答案

如果您担心注入(inject),请不要构建自己的消息。使用 SwiftmailerPHPMailer ,它会为您解决所有这些后顾之忧。

关于php - 我可以通过仅替换 CR 来避免 CRLF 注入(inject)攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com