提供按钮信息的更简单方法(安全)

时间:2015-04-01 09:41:08

标签: php mysqli

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

<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 ,数据库中的性别将设置为&#34; lol&#34;因为价值是&#34; lol&#34; ... 我在这里有很多网站和代码注意到这个问题,所以解决这个问题的方法是预先定义$ _POST ...检查答案

2 个答案:

答案 0 :(得分:0)

您需要将数组中允许的值列入白名单

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

答案 1 :(得分:-1)

一件简单的事情是预先定义$ _POST,这样价值永远不会改变...... 简单的一行代码:

$_POST['Man'] = Man;

通过将此代码添加到代码中,无法使用html更改该值 结果仍然是&#34; Man&#34;你很高兴。