2012-03-04 82 views
3

我允许我的用户喜欢更新或论坛主题。 所以当用户试图最喜欢其中的一个时,我会通过Ajax 2发送东西,item_id(更新或主题)作为id(例如1321313213)及其类型(“update”或“topic”)作为字符串。如何防止用户通过ajax请求中的萤火虫更改变量

但是可以说某人试图喜欢用id更新不变,但类型更改为“主题”(通过萤火虫或任何其他)...

这不应该procceed,因为这个组合是不正确的...我如何确保发送的item_id是更新或主题,因为这个ID可能共存于两个表中?

当前的解决方案:

创建隐藏的输入元素,并添加作为值5个随机字符(A-ZA-Z0-9)和MD5类型名称(更新或主题)

像:

$random_str = $this->my_model->generateRandomString(5); 
<input type="hidden" value="<?php echo $random_str.md5("update"); ?>" id="type" /> 

所以当我尝试验证数据判断是否为i的前5个字符分割类型的更新或主题和更高,并检查后的字符是MD5散列是更新或主题并继续验证

我想一些帮助的情况下,这也可被改变......

回答

2

你的服务器端脚本(PHP)必须承担起它变得虚假数据。切勿单纯依靠javascript来处理任何消毒/验证。

如果你的javascript可以确定工作是否应该是“更新”或“主题”,我相信你的PHP也可以做到这一点。可能还会使用更多的数据库查询或其他一些方法,但这是您必须付出的代价。

+0

当然我从来没有回复的javascript数据这就是为什么我总是验证它们,以及通过PHP ...但是这一次我无法找到一种方法来验证发送的ID是更新还是主题,因为这个ID在将来不会在这两个表中共存......并且我也不能发送任何可以帮助验证的事情,因为这可以被修改以及... – fxuser 2012-03-04 09:24:10

+0

在这种情况下,我建议你添加一个标识符来告诉PHP“这是一个更新”。如果该标识符不存在,则中止。 – rodneyrehm 2012-03-04 09:25:53

+0

你可以更具体一点吗?我也可以做的不是做1个函数中的1个Ajax调用...我可以创建2个独立的函数和1个调用更新函数,另一个调用主题函数,也可以解决问题 – fxuser 2012-03-04 09:32:26

0

您正在从错误的角度看待问题。特别是从你的服务器端(PHP)代码。

您的服务器获取数据。它得到的数据是这样的:user(来自会话),idtype。你的服务器需要提出一个问题:它是有效的数据吗?如果是 - 将其保存到数据库;如果不是,请不要将其保存到数据库。这很简单。

您可以从这个角度看:您的客户端代码只是一种与您的服务器通信的方式。另一种方式是使用网络浏览器+萤火虫。这是您的服务器端应用程序的完全有效的用法。而你的PHP代码不应该关心请求到达的方式。

因此,如果您当前的代码不允许你在你的PHP代码感到舒适和自由决定是否为它更新或者主题产生比你需要改变你的服务器端代码(也许是DB模式),以及。

您目前的解决办法是不好的,因为如果我知道如何使用萤火我可能会发现,“9d9b68ac2b1de18d3712096354b3c3a5”是指“主题”和“3ac340832f29c11538fbe2d6f75e8bcc”的意思是“更新”。

我认为你正在试图发明自己CSRF保护。所以去互联网上并阅读它。

+0

这2个散列不是静态的......它们随着内部的变化而变化,其中有一个随机变量,其中包含5个随机字符(盐)...如果我再加入1个盐,该怎么办? - 另一种解决方案是简单地去功能1最喜欢的更新,并去功能2最喜欢的话题... – fxuser 2012-03-04 10:26:47

+0

我的错误,我错过了随机salt str。但是,只要有效且CSRF攻击证明无误,数据如何到达您的服务器并不重要。 – petraszd 2012-03-04 12:06:31

+0

我做了CSRF的一些研究,因为我看到它只对POST有效......所以通过添加它可以覆盖我,我可以毫无问题地使用我的方法? – fxuser 2012-03-04 13:23:47