我允许用户收藏更新或论坛主题。 因此,当用户尝试收藏其中一个时,我将通过Ajax 2发送,item_id(更新或主题)作为id(例如1321313213)及其类型(“更新”或“主题”)作为字符串。
然而,让我们说某些人尝试更新ID未更新的更新但类型更改为“主题”(通过firebug或其他任何方式)......
由于这种组合不正确,所以不应该这样做...我如何确保发送的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" />
所以,当我尝试验证数据以检查它是否是更新或主题时,我将前五个字符的类型拆分,然后检查后面的字符是否为md5哈希是更新还是主题并继续验证
我希望得到一些帮助,以防这种情况也可以改变......
答案 0 :(得分:2)
您的服务器端脚本(PHP)必须始终假设它正在获取虚假数据。永远不要仅仅依靠javascript来处理任何清理/验证。
如果您的javascript可以确定作业是“更新”还是“主题”,我相信您的PHP也可以这样做。可能使用更多的数据库查询或其他一些,但这是你必须付出的代价。
答案 1 :(得分:0)
您正在从错误的角度看问题。特别是来自你的服务器端(PHP)代码。
您的服务器获取数据。它获取的数据类似于:user
(来自会话),id
和type
。您的服务器需要提出一个问题:它是有效的数据吗?如果是 - 将其保存到DB;如果不是 - 请不要将其保存到DB。就这么简单。
您可以从这个角度看:您的客户端代码只是与您的服务器通信的一种方式。另一种方法是使用Web浏览器+ firebug。它完全有效地用于您的服务器端应用程序。而且你的PHP代码不应该关心请求是如何到达它的。
因此,如果您当前的代码不允许您在PHP代码中感到舒服并自由决定是否更新或创建主题,那么您需要更改服务器端代码(也可能是数据库架构)。
您当前的解决方案并不好,因为如果我知道如何使用firebug,我可能会发现“9d9b68ac2b1de18d3712096354b3c3a5”表示“主题”而“3ac340832f29c11538fbe2d6f75e8bcc”表示“更新”。
我认为您正试图发明自己的CSRF保护。所以上网并阅读它。