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)
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)
正如其他人所指出的那样,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()
和以其他方式限制可以放入的内容的长度。