CodeIgniter - 使用Inspect Element </form>防止因编辑<form>操作而导致的问题

时间:2013-11-22 18:18:26

标签: php html forms codeigniter google-chrome-devtools

我很确定每个Web开发人员都知道可以使用浏览器的Inspect Element功能编辑网页内容。

例如,我实际上可以编辑表单的操作属性的值,立即提交(不刷新),并将表单的值发布到相当于我编辑的新值的URL。

这给我实现类似于Facebook的页面评论功能带来了严重的漏洞。我使用CodeIgniter。我所做的是将用户评论的页面的ID作为URL中的参数传递。

<?php 
echo form_open(base_url().'pages/process_comment/'.$page_id, $attributes) 
?>

生成的标记如下所示:

<form action="http://localhost/myproject/index.php/pages/process_comment/3" method="post" accept-charset="utf-8" id="comment" name="comment">
    <textarea name='comment_content'></textarea>
    <input type='submit' id='post' name='post' value='post' />
</form>

这种实现的危险在于我可以编辑page_id(即3),当我提交评论时,它会发布到不同的页面,因为它引用了不同的page_id。我该如何防止这种情况?有没有更好的实施?任何帮助赞赏。提前谢谢!

5 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我的解决方案是:

在数据库中,我添加了一个名为identifierHash的列,并为其分配了9个字符的散列值。然后在表单中我将获得index.php / controller / postFunction的表单操作链接。表单将包含两个隐藏值,一个包含userID,另一个包含此哈希值。两者都必须匹配才能正确发布。

答案 1 :(得分:0)

发布是客户端服务器。因此,您应该始终检查是否允许用户在帖子上发帖。或者,如果任何值不正确/无效 必须在服务器端检查这一点。

答案 2 :(得分:0)

有没有更好的实施?

有了这个视角(保护开发人员工具),可能没有。请继续阅读。

当有人使用开发者工具时,他/她应该小心,他应对自己所做的事负责。我可以使用诸如“高级休息客户端”之类的工具在标准网站上发布一百条评论 - 但是由于这个原因而不是网站的开发者,我负责所造成的混乱。开发人员可以做的最好的事情是开发一种检测垃圾邮件的好算法。

事实上,当Web服务可用时,您可以发布评论或其他数据,而无需打开网站的前端!然而,在以适当方式使用验证码的情况下,该问题可能受到限制。反过来,这将确保您确实看一下前端。

因此,为了回答您的问题,有一种方法可以让开发人员意外地使用错误的值提交更多困难:您可以创建特定于页面的“令牌” - 可以再次被操纵,但很难这样做。

答案 3 :(得分:0)

帮助阻止这种情况的一种方法是使用加密。像

这样的东西
echo form_hidden('page_id', $this->encrypt->encode($page_id)); 

并使用它而不是URL中的param来确定要发布到的页面的ID。它仍然可以被操纵,但对于攻击者来说,找出价值是什么/意味着什么以及如何利用它将是一项艰巨的任务。

答案 4 :(得分:0)

我们修改了我们的Markdown解析器以支持“裸”URL(在大多数情况下,但并非所有情况下 - 请注意网址中的异常字符);它们将自动转换为链接:

I often visit http://example.com.

将URL括在尖括号中强制使用URL:

Have you seen <http://example.com>?

网址可以是相对的或完整的。