我的PHP表单安全吗?
我从W3schools编写了一个PHP脚本。脚本用于检查值通过表格提交。所以我修改了它来检查值并将其作为电子邮件发送。我想问一下脚本是否足够安全?所以垃圾邮件发送者和黑客不能使用它 代码的第一部分是验证输入正确我的PHP表单安全吗?,php,html,forms,phpmailer,Php,Html,Forms,Phpmailer,我从W3schools编写了一个PHP脚本。脚本用于检查值通过表格提交。所以我修改了它来检查值并将其作为电子邮件发送。我想问一下脚本是否足够安全?所以垃圾邮件发送者和黑客不能使用它 代码的第一部分是验证输入正确 <?php require_once 'includes/header.php' ?> <?php $nameErr = $emailErr = $predmetErr = $textErr = ""; $n
<?php
require_once 'includes/header.php'
?>
<?php
$nameErr = $emailErr = $predmetErr = $textErr = "";
$name = $email = $predmet = $text = "";
$myMail = "example@example.com";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
$nameErr = "Only letters and white space allowed";
$name = "";
}
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
$email = "";
}
}
if (empty($_POST["predmet"])) {
$predmetErr = "vyplnte pole";
$name = "";
} else {
$predmet = test_input($_POST["predmet"]);
}
if (empty($_POST["text"])) {
$textErr = "vyplnte pole";
$name = "";
} else {
$text = test_input($_POST["text"]);
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
下面是表单的html代码
<h2>Form test</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<input type="text" name="predmet">
<span class="error">* <?php echo $predmetErr;?></span>
<textarea name="text" cols="30" rows="10"></textarea>
<span class="error">* <?php echo $textErr;?></span>
<button type="submit" name="submit">ODESLAT</button>
</form>
如果一切正常,将发送一封电子邮件
<?php
if(empty($name)){
echo "wrong characters";
} else{
if(empty($email)){
echo "wrong characters";
} else{
$message = "Mail from ". $name . "\n\n". $text;
mail($myMail, $predmet,$message);
echo "email send";
}
}
?>
<?php
require_once 'includes/footer.php';
?>
这里有很多错误 默认情况下,表单的操作是当前URL,因此不需要设置操作属性 有一个电子邮件输入类型,请使用它:
<input type="email" name="email">
您的test_输入函数需要是递归的,以便有效地清除乘法编码的内容,但在大多数情况下,您不需要执行它正在执行的操作:为什么要在非HTML上下文中应用htmlspecialchars
当您过滤输入时,您并没有转义输出,在这个地方htmlspecialchars`是合适的
错误字符错误消息无法提供足够的上下文–用户无法判断他们做错了什么
您使用的是邮件功能,但它存在安全问题,要正确设置电子邮件格式非常困难–您没有创建任何所需的标题,没有建立正确的邮件格式您使用了错误的换行符:电子邮件需要\r\n,尽管邮件功能有时可以处理此问题,并且您很容易受到标头注入攻击。您没有检查mail0函数的返回值,因此在返回电子邮件时不知道该函数是否有效
您从W3Schools获得这段代码并不让我感到惊讶,W3Schools以代码差而闻名,尽管它们在SEO方面非常出色!。你最好使用一个库,比如你在这个问题上加了“我是维护者”的标签的PHPMailer。好吧,因为它没有验证码或速率限制,有人可以轻松地以每秒100个请求的速率发布相同的数据,你会有一个满得令人不快的收件箱。看看filter_var函数:添加一个验证码和一个蜜罐字段让我们换一种方式问:是什么让你认为这在任何方面都是安全的?如果我是试图攻击你的人,那么确保这足够安全。如果最近黑客攻击PHP发行版的人试图攻击你,那就另当别论了。谢谢你,你知道他们展示和解释如何安全编写PHP的任何页面、课程、视频吗?从PHP自己的文档开始总是一个好主意。为了代码安全,我建议查看OWASP
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {