当使用按钮提交准备好的信息时,但您想在按钮上添加类似的标题,因此"值"的形式如下:
<form action="" method="POST">
<input type="submit" name="Man" value="Man">
</form>
使用如下php代码:
if (isset($_POST['Man'])) {
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "
UPDATE users
SET gender = ?
WHERE username = ?
";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $_POST['Man'], $_SESSION['username']);
$ok = $stmt->execute();
if ($ok == TRUE) {
echo "<font color='#00CC00'>Your gender has been updated.</font><p>";
} else {
echo "Error: " .$stmt->error;
}
}
这是很多人使用的代码(带有准备好的语句的普通简单代码),但有一个错误。。。如果有人将Man的值更改为例如lol,则数据库中的性别将设置为"lol",因为该值为"lol"。。。我在很多网站和代码中都注意到了这个问题,所以解决这个问题的方法是预先定义$_POST。。。检查答案
您需要将数组中允许的值列入白名单
if (isset($_POST['Man'])) {
$allowed_values=array("Man","Women");
if(!in_array($_POST['Man'],$allowed_values)){
echo"error message";
die();
}
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "
UPDATE users
SET gender = ?
WHERE username = ?
";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ss', $_POST['Man'], $_SESSION['username']);
$ok = $stmt->execute();
if ($ok == TRUE) {
echo "<font color='#00CC00'>Your gender has been updated.</font><p>";
} else {
echo "Error: " .$stmt->error;
}
}
一件简单的事情就是预先定义$_POST,这样值就永远不会更改。。。使用简单的单行代码:
$_POST['Man'] = Man;
通过将此代码添加到代码中,值不能用html更改,因此结果仍然是"男人",你可以走了。