php安全评论逻辑?

时间:2011-06-01 00:37:13

标签: php database logic

好的,这可能是显而易见的,但它还没有点击。我正在创建一个论坛/博客esque应用程序。

我非常安全地从数据库中抓取帖子,但评论开始变得更加困难。 (我可能只是偏执狂,对吗?)

如何在不暴露父邮件ID的情况下添加评论? (比如隐藏的表单字段或查询字符串或其他内容)。

我想我有点偏执,有人可能会使用firebug或其他东西进入代码,并在提交之前将隐藏的表单字段值更改为其他内容。我想我必须确保用户有权对该特定帖子/类别发表评论吗?

注意事项: 用户已登录。 它不是一个公开的帖子

4 个答案:

答案 0 :(得分:3)

我建议您像这样设置数据库:

Comments
---------
id
encodedID
authorID
parentID
message

然后,对于表单字段有两个隐藏值,一个将是encodedID,第二个将是您创建的哈希值。我建议使用哈希:

<?php

$hash = sha1(md5($encodedID . $userID . $_SERVER['REMOTE_ADDR'] . "abc1234"));

?>

然后,当用户提交表单时,验证散列对特定的encodedID和用户是否有效。这是一段简短的代码:

<?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更改为抽象的东西,不要将其称为encodedID或类似的东西,只是为了让它混淆任何用户将尝试打破它。

是的md5和sha1并不是完全安全的,但是对于这种情况它会起作用,因为你希望能够快速有效地处理评论。

答案 1 :(得分:2)

这可能是一种矫枉过正但如果你真的想要隐藏当前消息的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']; ?>

答案 2 :(得分:0)

您可以将表单分配为“id”作为隐藏字段,并创建一个数据库表来跟踪表单ID及其关联的帖子ID,这样当表单提交时,您可以检查数据库中的帖子ID而无需发送它基于与帖子

一起返回的表单ID到客户端

答案 3 :(得分:0)

你在这里提出了一个错误的问题:不是担心用户获得一些内部ID而不是你的应用程序之外的任何内容,你的主要关注点应该让他们不要做任何不愉快的事情它

想象一下,我刚开始发送POST请求,为1到10,000之间的每个ID添加注释。我肯定迟早会打一个真正的帖子。

关于编写安全Web应用程序的规则#1:不要信任该用户。

换句话说,是的,您应该检查以确保他们有权在您收到来自发件人的结果时发表评论。