如果您有一个允许用户添加注释的项目,那么如何传递用户正在回复的项目?
我虽然在表单中使用隐藏字段,但是可以使用诸如firebug之类的插件轻松更改:
<form method="post" action="blah">
<input type="hidden" name="item_id" value="<?php echo $item_id; ?>">
<!-- other form data here -->
<input type="submit" name="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
或者只是简单地使用会话:
$_SESSION['item_id'] = $item_id
Run Code Online (Sandbox Code Playgroud)
有没有一种安全的方式来发送表单中的项目数据?
编辑: 这是在验证后,...我实现了一些XSS保护(形式令牌等).我问的原因只是要知道最佳做法是什么.
我虽然做了类似的事情
$_SESSION['item_id'] = $id //this is set when they visit the current item
Run Code Online (Sandbox Code Playgroud)
然后在表单中有一个隐藏的字段:
<input type="hidden" name="item_id" value="<?php echo $id?>">
Run Code Online (Sandbox Code Playgroud)
最后检查会话是否与点击的id匹配:
if ($_SESSION('item_id') !== $item_id) //the value posted in the form
{
die('There\'s got to be a morning after
If we can hold on through the night
We have a chance to find the sunshine
Let\'s keep on looking for the light');
}
Run Code Online (Sandbox Code Playgroud)
但是在看完你的一些评论后我想这是一个坏主意?
公平地说(@Surreal Dreams):如果他们确实改变了身份证,这并不是什么大不了的事情,正如我所说,我只是在寻找最佳实践.
干杯.
以你建议的方式使用会话会搞砸案例,其中(1)访问者在多个标签中打开几个不同的文章,(2)尝试在除最后打开的标签之外的任何标签上写回复.用户甚至可以在不同的选项卡中同时写两个回复; 我有时会在StackOverflow上这样做.Web开发人员很容易忘记今天的访问者可能同时打开多个浏览器选项卡.真的,我们不再使用IE6了.
一个解决方案是制作$_SESSION['item_id']一组最近查看的文章ID,但是你将无法阻止一些Firebug用户(或任何其他技术娴熟的人)回复以前查看过的文章.添加时间限制也不会改变任何事情.
但是为什么有人会故意更改他们回复的帖子的ID,除了对网站进行欺骗或垃圾邮件?如果有人真的想要搞砸你的网站,他们可以通过在发布垃圾评论之前让他们的机器人请求适当的页面来轻松绕过任何保护.投资更好的CSRF令牌生成器,垃圾邮件过滤器,速率限制器等,你会好得多.