我有一个管理页面,列出了一堆记录,每个记录旁边都有一个复选框,将其设置为“活动”状态。每个复选框都有一个值,该值与数据库中记录的ID相关联。如果有人使用FireBug,他们可以轻松地将复选框的值更改为不同的数字,从而影响数据库中的错误记录。
我并不是非常担心这种情况,因为它只是一个只有一个用户的管理页面,我确信他对FireBug一无所知..但只是好奇,因为我遇到了这个问题面向公众的未来。
这是我目前的代码,这样你就可以了解我在做什么。
HTML + PHP ..
<input type="checkbox" class="active" name="active<?php echo $id; ?>" id="active<?php echo $id; ?>" <?php if ($active == 1): ?>checked="checked"<?php endif; ?> value="<?php echo $id; ?>">
jQuery ajax ..
$("input.active").click(function() {
var loader = $(this).prev().prev();
$(loader).css("visibility","visible");
// store the values from the form checkbox box, then send via ajax below
var check_active = $(this).is(':checked') ? 1 : 0;
var check_id = $(this).attr('value');
console.log(check_active);
console.log(check_id);
$.ajax({
type: "POST",
url: "active.php",
data: {id: check_id, active: check_active},
success: function(){
$(loader).css("visibility","hidden");
}
});
return true;
});
这是active.php ..
<?php
include("dbinfo.php");
mysql_connect($server,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$active = mysql_real_escape_string($_POST['active']);
$id = mysql_real_escape_string($_POST['id']);
$addEntry = "UPDATE entries SET active = '$active' WHERE id = '$id'";
mysql_query($addEntry) or die(mysql_error());
mysql_close();
?>
答案 0 :(得分:2)
您应该使用其中的帐户信息设置$_SESSION
值,这样如果他们尝试访问不存在的帐户,您就可以抓住并正确标记。只需他们帐户的ID号就足够了。你绝对应该不将它放在隐藏的字段或用户可以更改它的任何地方。
答案 1 :(得分:1)
你不能。
firebug可以完全控制HTML。
但是你并不担心HTML,你实际上担心用户会在active.php中做一些时髦的事情,这正是你应该添加更多保护的地方。
如果管理员有权编辑条目的活动状态,那么他应该能够以任何方式编辑他想要的任何条目。
您描述的安全问题,某些恶意管理员可以更改HTML中的ID,并且错误的记录更改了活动状态,与更恶意的用户相比无关紧要可以像你的ajax脚本那样向你的active.php页面发送一个post请求,但是使用他的服务器,有效地访问任何条目的任何活动状态。
您应该做的是在active.php上执行某种身份验证
使用SESSIONS或HTTP