4

在我知道如何保护上传图像绕过表单输入字段以上传不需要的文件后,我想给出另一个来自 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";
}

那么如何 保护这个简单的表单免受这种输入表单的影响?~ 谢谢

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

4

4 回答 4

2

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

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

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

于 2013-02-02T13:35:15.717 回答
1

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

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

例如:

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

该过程将类似于:

  1. 是否允许编辑此字段?如果是这样,那么确定。
  2. 请求是否来自经过身份验证的用户?如果不是,则返回错误消息和登录表单
  3. 请求是否来自 id=1 的用户?如果是这样,那么确定
  4. 如果请求来自具有管理员权限的用户?如果是这样,那么确定
  5. 返回错误消息。
于 2013-02-02T13:29:20.290 回答
1

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

另外,不要使用 mysql_query 或 mysql_* 之类的东西,它们在 php5 中是不安全的和贬值的。

于 2013-02-02T13:31:10.563 回答
0

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

您能做的最好的事情就是验证其数据。

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

但这无济于事。

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

然后验证旧数据和新数据。确保其中没有注入的 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。

于 2021-05-13T05:22:53.300 回答