隐藏字段的输入表单如何保护它

时间:2013-02-02 13:22:55

标签: php security

在我知道如何保护上传图片Bypassing forms input fields to upload unwanted files后,我想提供另一个来自2个字段的例子,其中一个是隐藏的。

SQL表(id,name,jod,number)

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扩展可以绕过服务器端的不同输入绕过检查,可能会造成很多破坏,所以这里它可以停止整个过程并使你能够编辑隐藏表{{1导致成员的更新信息number导致value="1"

enter image description here

该扩展程序的工作方式如下,它可以在传输到服务器端之前伪造输入数据。

enter image description here

PHP代码Send.php

value number 1

问题 然后如何从这种输入形式保护这个简单的形式? 〜谢谢

这个问题真的很痛,因为它让我的网站免费被黑客入侵:)

4 个答案:

答案 0 :(得分:2)

如果用户授权不是您选择的选项,您可以尝试以下技术:

  • 使用包含其他信息的数字哈希设置隐藏字段
  • 使用加密的数字设置隐藏字段(可能的盐也可以提高安全性)

当然,在发送表单HTML和验证帖子信息时会增加额外的步骤,但至少攻击者在帖子上伪造有效号码会更加困难。虽然如果攻击者知道不同用户的加密/哈希值,除非明智地使用带有隐藏字段的盐渍信息,否则它不会为您节省。

答案 1 :(得分:1)

您无法控制人们向您的服务器提交的数据。

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

例如:

  

能够将隐藏表号的值编辑为任何诸如value =“1”之类的值,从而导致成员的更新信息具有该值1。

过程如下:

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

答案 2 :(得分:1)

如果您有一个表单和任何用户来编辑值,那么这个问题就会存在。更好的方法是验证用户。仅允许使用帐户登录的用户对其各自的帐户进行更改。

另外,不要使用mysql_query或mysql_ *之类的东西,它们在php5中不安全且折旧。

答案 3 :(得分:0)

无法保护隐藏字段。 100% 不可能阻止恶意人员对其进行编辑。

你能做的最好的事情就是验证它的数据。

对于示例字段,您能做的最好的事情就是确保它实际上是一个数字。

但这没有任何帮助。

您需要做的是将旧数据作为隐藏数据发送。所有的。用旧 ID 完成。

然后验证旧数据和新数据。确保其中没有注入的 sql 代码。完成此操作后,您将

$name
$job
$id
$old_name
$old_job

一切就绪。那你就可以了。

select * from users where name="$old_name" and job="$old_job

如果你回到一排,那么你可以 update users set name="$name", job="$job$" where id=$id

现在,即使用户更改了 ID,它也不会做任何事情,因为选择将返回 0 行,因此编辑尝试将中止。

现在,如果有人碰巧知道其他人条目的所有三个字段,他们仍然可以更改它。唯一的方法是强制身份验证,并使用另一个数据库将用户名/密码对绑定到 ID。