如何在邮寄之前清理PHP中的用户输入?

Mat*_*pel 47 php security email sanitize

我有一个简单的PHP邮件程序脚本,它从通过POST提交的表单中获取值并将它们发送给我:

<?php
$to = "me@example.com";

$name = $_POST['name'];
$message = $_POST['message'];
$email = $_POST['email'];

$body  =  "Person $name submitted a message: $message";
$subject = "A message has been submitted";

$headers = 'From: ' . $email;

mail($to, $subject, $body, $headers);

header("Location: http://example.com/thanks");
?>
Run Code Online (Sandbox Code Playgroud)

我该如何消毒输入?

Hai*_*vgi 52

filter_var().清理post变量.

这里的例子.喜欢:

echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);   
Run Code Online (Sandbox Code Playgroud)

  • 并非所有主机设置都有5.2,呵呵,那就是2009年.现在更像是如果他们仍在运行5.4他们很可疑. (2认同)

Wad*_* M. 12

由于您没有在此处构建SQL查询或任何内容,我可以看到这些输入的唯一相关验证是$ _POST ["email"]的电子邮件验证,如果您真的想要,可能是其他字段的字母数字过滤器限制消息可以包含的范围.

要过滤电子邮件地址,只需使用filter_var:

$email = filter_var($email, FILTER_SANITIZE_EMAIL);
Run Code Online (Sandbox Code Playgroud)

根据Frank Farmer的建议,您还可以过滤掉电子邮件主题中的换行符:

$subject = str_replace(array("\r","\n"),array(" "," "),$subject);
Run Code Online (Sandbox Code Playgroud)

  • 根据exaclty电子邮件的构造方式,可以将换行符注入任何电子邮件标题,允许攻击者添加他喜欢的任何新的或替换的电子邮件标题.除此之外,注入一个完整的空白行(两个换行符)然后允许攻击者插入他选择的电子邮件正文,完全覆盖生成的电子邮件. (9认同)
  • 电子邮件主题行中的换行符有些问题. (2认同)

art*_*ung 5

正如其他人所指出的那样,filter_var很棒。如果它不可用,请将其添加到您的工具箱中。

$headers变量在安全方面尤其糟糕。它可以附加到并导致添加欺骗标题。这篇名为电子邮件注入的帖子对此进行了很好的讨论。

filter_var i很好,但另一种确保某些东西是电子邮件地址而不是坏东西的方法是使用isMail()函数。这是一个:

function isEmail($email) {
    return preg_match('|^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$|i', $email);
};
Run Code Online (Sandbox Code Playgroud)

所以要使用它,你可以这样做:

if (isset($_POST['email']) && isEmail($_POST['email'])) {
    $email = $_POST['email'] ;
} else {
    // you could halt execution here, set $email to a default email address
    // display an error, redirect, or some combination here,
}
Run Code Online (Sandbox Code Playgroud)

在手动验证方面,限制使用substr()、运行strip_tags()和以其他方式限制可以放入的内容的长度。