按钮信息提交的更简单方式(安全)


Easier way for button information submits (secure)

当使用按钮提交准备好的信息时,但您想在按钮上添加类似的标题,因此"值"的形式如下:

<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更改,因此结果仍然是"男人",你可以走了。