Php 如何防止用户通过表单欺骗数据?

Php 如何防止用户通过表单欺骗数据?,php,javascript,forms,firebug,Php,Javascript,Forms,Firebug,我有一个网站已经运行了一段时间,它使用大量的用户输入来构建网站。当然,网站上有几十种表单。在构建站点时,我经常使用隐藏的表单字段将数据传递回服务器,以便知道要更新的记录 例如: 提交表单时,这些值将传递给服务器,我根据传递的数据更新记录,即记录132的价格将更改为15.02 我最近发现,您可以通过像firebug这样简单的方法更改属性和值。所以…我打开firebug,将id值更改为155,将价格值更改为0.00,然后提交表单。中提琴!我在网站上查看了155号产品,它现在说是0.00美元。这与我

我有一个网站已经运行了一段时间,它使用大量的用户输入来构建网站。当然,网站上有几十种表单。在构建站点时,我经常使用隐藏的表单字段将数据传递回服务器,以便知道要更新的记录

例如:

提交表单时,这些值将传递给服务器,我根据传递的数据更新记录,即记录132的价格将更改为15.02

我最近发现,您可以通过像firebug这样简单的方法更改属性和值。所以…我打开firebug,将id值更改为155,将价格值更改为0.00,然后提交表单。中提琴!我在网站上查看了155号产品,它现在说是0.00美元。这与我有关

如果没有一个容易修改的查询字符串或一个将id传递给服务器的隐藏输入元素,我如何知道要更新哪个记录

如果没有更好的方法可以让我看到成千上万的网站以这种方式传递数据,那么我该如何做才能让用户更改这些值,服务器端的数据不会被执行或类似的方法来解决问题

我曾考虑过对id进行加密,然后在另一端对其进行解密,但这仍然不能防止有人更改它,并碰巧得到与数据库中另一个id匹配的内容

我也想过饼干,但我听说那些饼干也可以被操纵


有什么想法吗?这对我来说似乎是一个巨大的安全风险。

不要试图控制提交的数据,因为你不能

检查提交的用户是否有权进行任何更改


e、 g.如果他们将id更改为155,将价格更改为0.00,则确保他们有权更新记录155并将价格设置为0.00。

在敏感页面上检查$\u服务器['HTTP\u REFERER'],方法如下:

if ($_SERVER['HTTP_REFERER'] !== "previous_page.php") {
 header("Location: error_page.php");
 session_destroy();
 exit;
}
但这并不是完全可以证明的,因为如果攻击者位于前一个_page.php上,他可以简单地浏览到我们试图保护的页面,因此需要进一步的保护

您可以而且应该实现令牌系统。在表单页面上,添加以下PHP代码:

$_SESSION['token'] = md5(uniqid(rand(), TRUE));
$token = $_SESSION['token'];
在表格中的某个地方,添加:

<input type="hidden" name="token" value="<?php echo $token; ?>"/>

我建议对CSRF伪造做更多的研究。希望这能让您走上正确的方向。

听起来您需要实施一些服务器端验证。根据ID而不是隐藏字段查找价格?您的体系结构中存在一个根本问题:您的服务器不应该从客户端获取价格。让价格成为客户无法改变的东西,然后你就定下来了。永远不要相信黑暗面……我的意思是客户方:但这一点是有效的:来自客户的一切都是不安全的,你必须期望人们会干预,甚至是为了好玩而故意寻找你的安全漏洞。换句话说,您需要将数据存储在服务器端,然后当您从客户端接收到数据时,您需要根据存储的数据对其进行验证。再加上Quentin和Moses所说的,您可以做一个比cookies更安全的替代方法,将会话数据存储在服务器端。同样,序列化标识符也会带来奇迹。所以…如果我做了一个检查,确保用户有权更新,然后加密id字段,使其更难判断如何更改,这将基本上解决我的问题?
$token = $_SESSION['token']; //re declaring your session variable

if ($_POST['token'] !== $_SESSION['token']) {
 header("Location: error_page.php");
 session_destroy();
 exit;
}