繁体   English   中英

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

[英]Input form with hidden field how to secure it

在我知道如何保护上传图像绕过表单输入字段以上传不需要的文件后,我想再举一个 from with 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扩展,它可以绕过不同的输入到服务器端绕过检查,可能会造成很多损害,所以在这里它可以停止整个过程,并使您能够将隐藏表number的值编辑为任何value="1"导致成员的更新信息具有该value number 1

在此处输入图片说明

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

在此处输入图片说明

PHP代码发送.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";
}

问题然后如何保护这个简单的表单免受这样的输入表单的影响? ~谢谢

这个问题真的很痛苦,因为它使我的网站可以自由地被黑客入侵:)

如果用户授权不是您的原因中的一个选项,您可以尝试以下技术:

  • 使用带有一些其他信息的数字散列设置隐藏字段
  • 使用加密数字设置隐藏字段(可能的盐也可以提高安全性)

当然,在发送表单 HTML 和验证帖子信息时会增加额外的步骤,但至少攻击者在帖子上伪造有效数字会困难得多。 尽管如果攻击者知道不同用户的加密/散列号码,它不会拯救您,除非明智地使用带有隐藏字段的加盐信息。

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

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

例如:

能够将隐藏表编号的值编辑为任何值,例如 value="1" 导致成员的更新信息具有该值编号 1。

该过程将类似于:

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

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

另外,不要使用 mysql_query 或任何类似 mysql_* 的东西,它们在 php5 中是不安全的并且会贬值。

无法保护隐藏字段。 阻止恶意人员编辑它是 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM