我对会话很新。
我有一个分类广告网站,用户可以选择“编辑”他们的分类广告。
他们必须输入的是他们在创建分类时选择的密码。
在“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
}
}
由于
答案 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;
}