问题描述
|
好的,这可能很明显,但是还没有点击。我正在创建一个论坛/博客风格的应用程序。
我从数据库中安全地获取了帖子,但是评论变得有点困难了。 (我可能只是偏执,对吧?)。
如何在不公开父邮件ID的情况下添加评论? (例如隐藏表单字段或查询字符串等)。
我想我有些偏执,有人可能会在代码中加入Firebug或其他内容,然后在提交之前将隐藏的表单字段值更改为其他内容。我想我必须确保用户有权对此特定帖子/类别发表评论?
注意事项:
用户已经登录。
它不是公开帖子
解决方法
我建议您像这样设置数据库:
Comments
---------
id
encodedID
authorID
parentID
message
然后,对于form字段,有两个隐藏值,一个为值,第二个为您创建的哈希值。我建议哈希为:
<?php
$hash = sha1(md5($encodedID . $userID . $_SERVER[\'REMOTE_ADDR\'] . \"abc1234\"));
?>
然后,当用户提交表单时,请验证哈希对特定的已编码ID和用户有效。这是一个简短的代码编写:
<?php
if(isset($_POST[\'submit\']))
{
//Get the variables and all and sanitize the input of \'message\'
if(sha1(md5($_POST[\'value1\']. $userID . $_SERVER[\'REMOTE_ADDR\'] . \"abc1234\")) == $_POST[\'value2\'])
{
//User is valid.
}
else
{
//Invalid user.
//Document this.
}
}
$value1 = $encodedID; //Grab this from your database
$value2 = sha1(md5($value1 . $userID . $_SERVER[\'REMOTE_ADDR\'] . \"abc1234\"));
?>
<form method=\"post\" action=\"comment.php\">
<input type=\"text\" name=\"message\" />
<input type=\"hidden\" name=\"value1\" value=\"<?php echo $value1; ?>\" />
<input type=\"hidden\" name=\"value2\" value=\"<?php echo $value2; ?>\" />
<input type=\"submit\" name=\"submit\" value=\"Comment\" />
</form>
编辑:只是一个小技巧,但我建议您将value1和value2更改为抽象的东西,不要将其称为encodingID或类似的名称,只是这样会使所有试图尝试破坏它的用户感到困惑。
是的,md5和sha1并不完全安全,但是在这种情况下它将起作用,因为您希望能够快速有效地处理注释。
, 这可能是一个矫kill过正,但是如果您确实要隐藏当前消息的post_id,则应考虑使用session。因此,不要在表单上使用类似这样的内容:
<form action=\"/postcomment.php\" method=\"post\" >
<input name=\"post_id\" type=\"hidden\" value=\"123\" />
<textarea name=\"message\"></textarea>
</form>
将其减少为如下所示:
<?php $_SESSION[\'post_id\'] = \'123\'; ?>
<form action=\"/postcomment.php\" method=\"post\" >
<textarea name=\"message\"></textarea>
</form>
当然,这是“令人讨厌”的编码,但至少您能理解。
哦,别忘了在postcomment.php上验证所有内容。还转义所有字符串输入值,并确保所有数字输入确实是数字(将它们乘以1?)。
[编辑:由于公众的坚持要求,请允许我修改上述内容:]
代替:
<?php $_SESSION[\'post_id\'] = \'123\'; ?>
生成表单ID:
<?php $_SESSION[\'form_id\'] = $_SESSION[\'user_id\'].\'_\'.md5(time()); ?>
然后生成唯一的post_id:
<?php $_SESSION[$_SESSION[\'form_id\'].\'_post_id\'] = \'123\'; ?>
提交后获取post_id:
<?php $post_id = $_SESSION[$_SESSION[\'form_id\'].\'_post_id\']; ?>
, 您可以为表单分配一个\“ id \”作为隐藏字段,并创建一个数据库表来跟踪表单ID及其相关的帖子ID,这样,当表单提交后,您可以在数据库中检查帖子ID,而无需发送根据帖子返回的表单ID发送给客户
, 您在这里问错了一个问题:与其担心用户获得的内部ID意味着在您的应用程序之外没有其他东西,您主要关心的是防止他们对它进行任何不愉快的事情。
想象一下,我刚刚开始发送POST请求,以为1到10,000之间的每个ID添加注释。我肯定迟早会发表真实的文章。
有关编写安全的Web应用程序的规则#1:不信任用户。
换句话说,是的,当您从发回的结果时,应检查并确保他们有权发表评论。