PHP会话;我该如何解决这个大安全问题?

时间:2010-10-24 11:35:55

标签: php security session authentication

我对会话很新。

我有一个分类广告网站,用户可以选择“编辑”他们的分类广告。

他们必须输入的是他们在创建分类时选择的密码。

在“edit.php”页面中,如果密码正确,则会显示已分类的详细信息。有一个图片上传工具,可以重新加载页面,但同时上传图片,并预览给用户。

问题是当上传图片时,我不希望页面再次要求输入密码。 (这是因为页面重新加载)如果每张图片上传都需要密码,那就不太好了。

所以我设置了一个像这样的会话变量:

 if($pass==$row['pass']){ $_SESSION['correct_pass']=1; }

然后在重新加载的edit.php中,我检查这个条件:

 if($pass==$row['pass'] || $_SESSION['correct_pass']==1){
    EDIT AD HERE
 }

问题(BIG PROBLEM)是一旦用户输入正确的密码,就会创建SESSION ['correct_pass']并设置为1.

在此之后,用户可以在浏览器上单击“返回”并在URL中输入另一个分类ID nr,PHP会话将认为密码仍然正常。

换句话说,如果你弄明白的话,可能会改变其他人的分类。

应如何解决这个问题?

如果您需要更多输入,请告诉我......

下面是几行代码,它们进一步描述了edit.php文件(未经测试):

//FIRST VISIT TO "EDIT.PHP?ad_id=ID_OF_CLASSIFIED_HERE"
if($todo==0){
  //User is shown 2 radios, and a password form, and choses either to remove classified, or change classified
}

//REMOVE CLASSIFIED
if($todo==1){
   //User has chosen to remove a classified
    if($pass==$row['pass']){ 
        //DELETE CLASSIFIED
    }
    if($pass!=$row['pass']){
        //SHOW WRONG PASSWORD WARNING
    }
 }

 if($todo==2){
   //User has chosen to change a classified
   if($pass==$row['pass'] || $_SESSION['correct_pass']==1){
        if(!isset($_SESSION['correct_pass'])){
            $_SESSION['correct_pass']=1;
        }
    //EDIT AD HERE
   }
   else {
    //SHOW WRONG PASSWORD WARNING
   }
 }

由于

3 个答案:

答案 0 :(得分:2)

不是存储标志,无论用户是否输入了正确的密码,都要在会话中存储密码的哈希值。然后,当他们尝试编辑分类时,将会话中密码的哈希值与用于创建分类的密码的哈希值进行比较。

使用用户ID(如果有的话)填写密码,这样可以防止密码泄露。

答案 1 :(得分:1)

让我建议一种可能的方法来解决这种问题。

您可以生成一些长的随机字符串(uploadId),记住它在服务器端(在数据库/会话中)并作为隐藏输入元素中的附加请求参数传递。

然后,上传图片时,您可以比较这些值并检查是否已使用此“uploadId”上传任何图片。如果这是第一次使用此uploadId的图像,那么您应该记住在服务器端,此uploadId已经使用过一次,并接受上传。

在用户注销后超时/用户注销后,可能会删除已使用的uploadId值。

答案 2 :(得分:0)

为什么不只是存储他们被授权的项目列表,例如:

$_SESSION['authorizedPages']['pageID'];



if (isset($_SESSION['authorizedPages']['pageID']) == false) 
{
    echo loginForm;
}
else
{
    echo editForm;
}