Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的PHP表单安全吗?_Php_Html_Forms_Phpmailer - Fatal编程技术网

我的PHP表单安全吗?

我的PHP表单安全吗?,php,html,forms,phpmailer,Php,Html,Forms,Phpmailer,我从W3schools编写了一个PHP脚本。脚本用于检查值​​通过表格提交。所以我修改了它来检查值​​并将其作为电子邮件发送。我想问一下脚本是否足够安全?所以垃圾邮件发送者和黑客不能使用它 代码的第一部分是验证​​输入正确 <?php require_once 'includes/header.php' ?> <?php $nameErr = $emailErr = $predmetErr = $textErr = ""; $n

我从W3schools编写了一个PHP脚本。脚本用于检查值​​通过表格提交。所以我修改了它来检查值​​并将其作为电子邮件发送。我想问一下脚本是否足够安全?所以垃圾邮件发送者和黑客不能使用它

代码的第一部分是验证​​输入正确

<?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)) {