警告
本文最后更新于 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>
|