当只有$text是用户输入时,向邮件命令注入


Injection to the mail command when only $text is user input

以下PHP脚本中是否存在注入的安全风险?

<?php
$empfaenger_1 = "test@example.com";
$sender = "test@example.com";
$name = $_POST['name'];
$telefon = $_POST['phone']; 
$betreff = "Test";
$text =
"Please contact me
Name: $name
Telefon: $telefon";
mail($empfaenger_1, $betreff, $text,"from:$sender");
$url = htmlspecialchars($_SERVER['HTTP_REFERER']);
echo "<center><br><br>Thank you<br><br>";
echo "<center><a href='$url'>Back</a>";

我认为邮件注入只能在头字段中进行。邮件注入正文我不知道。

无论如何,注意XSS,您应该使用strip_tags():

$name = strip_tags($_POST['name']);
$telefon = strip_tags($_POST['phone']); 

mail中的注入

在这里,风险似乎很小。这里有几个答案指出了在电子邮件中注入HTML的可能性。对于HTML电子邮件,这是可能的,但HTML邮件消息的Content-type标头将设置为text/html或作为多部分消息的一部分。RFC 1521规定必须显式设置HTML内容类型,并且如果没有指定内容类型,则默认为纯文本:

默认的RFC 822消息由该协议在US-ASCII字符集中以纯文本形式键入,该字符集可以明确指定为"内容类型:text/plain;charset=US-ASCII"。如果未指定"内容类型",则假定为此默认值。

在上面的代码中,用户提供的文本被插入到标题之后;攻击者将没有机会更改内容类型(要么更改为HTML,要么更改为multipart,后者允许注入MIME边界)。

最终结果只能是一条纯文本消息。如果用户在邮件中注入HTML标记,阅读电子邮件的人就会在邮件中看到这些HTML标记。电子邮件客户端通常不会机会主义地检查纯文本消息来定位和解析嵌入的HTML和JavaScript。

其他地方注射

虽然使用mail可能是安全的,但剩余代码中存在潜在的注入漏洞:

$url = htmlspecialchars($_SERVER['HTTP_REFERER']);
echo "<center><a href='$url'>Back</a>";

默认情况下,htmlspecialchar使用ENT_COMPAT | ENT_HTML401标志,该标志不会将单引号转换为&039;。链接href属性用单引号分隔。因此,如果攻击者可以强迫HTTP引用者包含一个引号,他/她就可以调用常规XSS攻击。(例如,如果referrer被强制为等效的http://whatever/a' onclick='alert(),则单击链接可以调用任意JavaScript。要解决此问题,请将"$url"放在第二行的双引号中,或者使用ENT_QUOTES标志调用htmlspecialchars

有可能是的,可以注入javascript代码,例如,如果有人将其作为自己的名称:

<script type="text/javascript">
window.location = "http://www.google.com/"
</script>

任何查看该名称的人都会被重定向到google.com;你可以说:

$name = htmlentities(strip_tags($_POST['name']));

如果以html视图模式打开电子邮件的客户端,并且用户注入脚本,那么是的,它容易受到XSS的攻击,进而受到CSRF的攻击。当然,您应该清除所有不受信任的输入。

更具体的XSS保护信息可以在OWASP网站上找到。