如果我在下面有这个简单的表单选择器:
<form id="myform" class="form" role="form" accept-charset="utf-8" method="post" action="/mypage.php">
<select id="gender" name="gender">
<option selected="" value=""></option>
<option value="man">man</option>
<option value="women">women</option>
</select>
<button type="submit" name="insert"> Send </button>
</form>
这个用于检索数据的小PHP代码:
if (isset($_POST['insert'])) {
if(!isset($_POST['gender']) || strlen($_POST['gender'])<3)
{
header('location:'.$_SERVER['PHP_SELF'].'?error');
exit;
}
$gender = ($_POST['gender']);
...
// INSERT INTO DATABASE
}
现在有人使用Firebug将选项值从“man”修改为“漏洞”并单击“提交”这个新值将插入到我的数据库而不是前一个。
我的问题是:如何使用php语言来防止这种情况?
感谢。
答案 0 :(得分:1)
您的数据库部分未给出,因此我无法确定哪种解决方案最适合您。但是,如果你在这种情况下使用PDO绑定系统以及一些简单的if-else逻辑检查,那就更好了。
就像这个例子:
$this->db_connection = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME . ';charset=utf8', DB_USER, DB_PASS);
$query_new_user_insert = $this->db_connection->prepare('INSERT INTO users (user_name, user_password_hash, user_email, user_activation_hash, user_registration_ip, user_registration_datetime, usertype, user_fname, user_lname) VALUES(:user_name, :user_password_hash, :user_email, :user_activation_hash, :user_registration_ip, now(), :usertype, :user_fname, :user_lname)');
$query_new_user_insert->bindValue(':user_name', $user_name, PDO::PARAM_STR);
$query_new_user_insert->bindValue(':user_password_hash', $user_password_hash, PDO::PARAM_STR);
$query_new_user_insert->bindValue(':user_email', $user_email, PDO::PARAM_STR);
$query_new_user_insert->bindValue(':user_activation_hash', $user_activation_hash, PDO::PARAM_STR);
$query_new_user_insert->bindValue(':user_registration_ip', $_SERVER['REMOTE_ADDR'], PDO::PARAM_STR);
$query_new_user_insert->bindValue(':usertype', $usertype, PDO::PARAM_STR);
$query_new_user_insert->bindValue(':user_fname', $user_fname, PDO::PARAM_STR);
$query_new_user_insert->bindValue(':user_lname', $user_lname, PDO::PARAM_STR);
$query_new_user_insert->execute();
现在你可以在这里看到我们是绑定值。他永远不会知道你的变量。此外,您可以使用生成的表单而不是直接编码。 使用数组传递数据也是另一个好习惯! 看看这个:http://blog.stackoverflow.com/2008/06/safe-html-and-xss/
答案 1 :(得分:1)
由于您有一组已定义的可能值,因此很容易验证提交的值:
$options = array('', 'man', 'woman');
if (!in_array($_POST['gender'], $options)) {
// invalid value
}
答案 2 :(得分:0)
if($_POST['insert'] == "vulnerability"){
//refresh the page and notify
}
if (isset($_POST['insert'])) {
if(!isset($_POST['gender']) || strlen($_POST['gender'])<3)
{
header('location:'.$_SERVER['PHP_SELF'].'?error');
exit;
}
$gender = ($_POST['gender']);
...
// INSERT INTO DATABASE
}
一旦确定变量是安全的或者是预期的,你只想将变量插入到数据库中,即如果在插入数据库之前php代码中没有有效性检查,则用户可以使用用于删除表或更改数据的mysql语句,即"TRUNCATE TABLE MY_AWESOME_TABLE"
。这将删除表中的所有数据(用户,密码等)。