简单评论模块--php 表单练习

警告
本文最后更新于 2023-07-07,文中内容可能已过时。

简单模仿了一个评论模板,当然肯定是没有博客的 valine 这么强大的 hhhh,
PHP 表单安全性的重要提示
$_SERVER["PHP_SELF"]变量能够被黑客利用!
如果页面中使用了PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)。
比如说注入 js 脚本等,valine 以前的版本也有过这样的漏洞。

跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于 Web 应用程序。XSS 能够使攻击者向其他用户浏览的网页中输入客户端脚本。

可以像 valine 一样在用户输入完后保留输入,还有一些正则控制输入提示等简单功能。UI 就丑爆了算了。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
.main{
   width: 20%;
   height: 100%;
   border: 1px #000 solid;
   padding: 20px;
}
</style>
</head>
<body>

<?php
// 定义变量并设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

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";
    }
  }

  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
    // 检查电邮地址语法是否有效
    if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
      $emailErr = "Invalid email format";
    }
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
    // 检查 URL 地址语言是否有效(此正则表达式同样允许 URL 中的下划线)
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
    =~_|]/i",$website)) {
      $websiteErr = "Invalid URL";
    }
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }

}

function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>
<div class="main">
   <h2>PHP 验证实例</h2>
   <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>">
      姓名:<input type="text" name="name" value="<?php echo $name;?>">
      <span class="error">* <?php echo $nameErr;?></span>
      <br><br>
      性别:
      <input type="radio" name="gender" <?php if (isset($gender) && $gender=="女性") echo "checked";?> value="女性">女性
      <input type="radio" name="gender" <?php if (isset($gender) && $gender=="男性") echo "checked";?> value="男性">男性
      <span class="error">* <?php echo $genderErr;?></span>
      <br><br>
      电邮:<input type="text" name="email" value="<?php echo $email;?>">
      <span class="error">* <?php echo $emailErr;?></span>
      <br><br>
      网址:<input type="text" name="website" value="<?php echo $website;?>">
      <span class="error"><?php echo $websiteErr;?></span>
      <br><br>
      评论:<textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>
      <br><br>
      <input type="submit" name="submit" value="提交">
      <h2>你的输入是:</h2>
      <?php
         echo $name."<br/>";
         echo $gender."<br/>";
         echo $email."<br/>";
         echo $website."<br/>";
         echo $comment."<br/>";
      ?>
      <br/>
   </form>
</div>
</body>
</html>

Buy me a coffee~
支付宝
微信
0%