2013-02-02 28 views
4

我知道如何确保上传图片Bypassing forms input fields to upload unwanted files我想给出另一个来自2个字段的例子,其中一个隐藏。隐藏字段输入表格如何保护它

SQL表(ID,姓名,约旦第纳尔,数量)

CREATE TABLE `users` (
    `id` bigint(20) unsigned NOT NULL auto_increment, 
    `name` varchar(255) default '0', 
    `job` varchar(255) default NULL, 
    `number` varchar(255) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

表单代码(支撑构件可以编辑自己的信息)

<form action="send.php" method="post" name="send" id="send"> 
<input type="text" name="name" id="name" value="John"/> 
<input type="text" name="job" id="job" value="Plumber"/> 
<input type=hidden name="number" id="number" value="1234"/> 
<input type="Submit" name="Submit" value="Submit"/> 
</form> 

后来有一个Firefox扩展,可以绕过不同的输入到服务器端的旁路检查,并可能会造成很大的损害,所以在这里它可以停止整个过程并使您能够编辑隐藏表的值number到任何如value="1"导致成员更新信息有value number 1

enter image description here

该扩展工作如下,它可以伪造输入数据之前,它传递到服务器端。

enter image description here

PHP代码Send.php

if(isset($_POST['send'])){ 

$name = mysql_real_escape_string($_POST[name]); 
$job = mysql_real_escape_string($_POST[job]); 
$number = mysql_real_escape_string($_POST[number]); 

$sql= "update users SET name='$name',job='$job' WHERE number='$number'"; 
     mysql_query($sql) or die("query failed: $sql".mysql_error()); 

echo "Update Done"; 

} else { 
echo "Nothing to update"; 
} 

问题 那么,如何保护这样的输入形式这种简单的形式? 〜感谢

这个问题真的好痛因为它使我的网站上免费给砍死:)

+1

而不是绑定他们的数字,使用一个UNIQUE ID,如PHP的SESSION ID? – hjpotter92

+1

您正在使用[an **过时的**数据库API](http://stackoverflow.com/q/12859942/19068)并应使用[现代替换](http://php.net/manual/en/ mysqlinfo.api.choosing.php)。 – Quentin

回答

1

你无法控制哪些数据用户提交对您的服务器。

您必须在服务器上检查用户是否有权查看信息或进行他们要求的更改。

例如:

能够隐藏表数的值编辑到任何诸如值=“1”构件使更新信息具有值号码1.

的方法会是这样的:

  1. 是否允许任何人编辑此字段?如果是这样,那么确定。
  2. 请求是否来自经过身份验证的用户?如果没有,则返回错误消息和登录表
  3. 请求是否来自id = 1的用户?如果是,那么确定
  4. 如果请求来自拥有管理员权限的用户?如果是这样,那么确定
  5. 返回错误消息。
1

如果你有一个窗体和任何用户来编辑值,这个问题将在那里。更好的方法是验证用户。只允许使用帐户登录的用户对其各自的帐户进行更改。

此外,不要使用mysql_query或任何类似mysql_ *,它们是不安全的,并在php5中折旧。

2

如果用户授权是不是在你的事业的一个选项,你可以尝试以下方法:

  • 设置隐藏字段以及其他一些信息
  • 设置隐藏腌制数的散列(可能的盐会增加安全性)

当然,它会在发送表单HTML和验证发布信息时添加额外的步骤,但至少对于攻击者来说更难以伪造一个va盖子上的号码。尽管如果攻击者知道不同用户的加密/散列号码,除非明智地使用带隐藏字段的盐信息,否则它不会节省您的时间。