【发布时间】:2015-10-27 22:35:51
【问题描述】:
我正在创建一个仅允许用户在登录后访问的管理页面。当用户尝试直接访问该页面时,他将被重定向到带有“请登录!”的登录页面。然而,这奏效了,一个奇怪的问题出现了。
管理页面有两个功能“编辑类别”和“删除类别”。
当我尝试在删除页面上删除类别时,我被踢回登录页面并显示“请登录!”即使我已经登录了。但是,编辑类别工作正常。
下面是登录、编辑和删除页面的代码。
登录页面:
<form method="post" action="login.php">
<input type="text" name="email" placeholder="Email" required="required" />
<input type="password" name="password" placeholder="Password" required="required" />
<input type="submit" class="btn btn-primary btn-block btn-large" name="login"/>
</form>
</div>
<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
</body>
</html>
<?php
include("includes/db.php");
if(isset($_POST['login']))
{
$email = mysqli_real_escape_string($con,$_POST['email']);
$pass = mysqli_real_escape_string($con,$_POST['password']);
$query = "select * from admins where user_email='$email' AND user_pass='$pass' ";
$popo = mysqli_query($con,$query);
$check = mysqli_num_rows($popo);
if($check == 0)
{
echo "<script> alert('Password or Email is wrong,try again!')</script>";
}
else
{
$_SESSION['user_email']=$email;
echo"<script>window.open('index.php?login=Welcome to Admin Area!','_self')</script>";
}
}
?>
编辑类别:
if(!isset($_SESSION['user_email']))
{
echo "<script>window.open('login.php?not_admin=Please Login!','_self') </script>" ;
}
else
{
if(isset($_GET['edit_cats']))
{
$cat_id=$_GET['edit_cats'];
$query= "select * from categories where cat_id ='$cat_id'";
$run = mysqli_query($con,$query);
$fetch = mysqli_fetch_array($run);
$cat_id = $fetch['cat_id'];
$cat_title = $fetch['cat_title'];
}
?>
<form action="" method="post" style="padding:80px;">
<b>Update Category:</b>
<input type="text" name="new_cat" value = "<?php echo $cat_title;?>"/>
<input type="submit" name="update_cat" value="Update Category"/>
</form>
<?php
if(isset($_POST['update_cat']))
{
$update_id=$cat_id;
$new_cat = $_POST['new_cat'];
$query= "UPDATE categories SET cat_title= '$new_cat' WHERE cat_id = '$update_id' ";
$run = mysqli_query($con,$query);
if ($run)
{
echo "<script>alert('Updated!')</script>";
echo "<script>window.open('index.php?view_cats','_self')</script>";
} // display when product is added
else{
echo"Error in updating category"; // display when there is error
}
}
?>
<?php }?>
删除类别:
<?php
include("includes/db.php");
if(!isset($_SESSION['user_email']))
{
echo "<script>window.open('login.php?not_admin=Please Login!','_self') </script>" ;
}
else
{
if(isset($_GET['delete_cat']))
{
$del_id = $_GET['delete_cat'];
$query= "delete from categories where cat_id='$del_id'";
$nob=mysqli_query($con,$query);
if($nob)
{
echo "<script>alert('A category has been deleted!') </script>";
echo "<script>window.open('index.php?view_cats','_self') </script>";
}
else
{
echo "Unsuccessful in deleting category!";
}
}
}
?>
P.S 我有我的 session_start();在包含编辑和删除页面的登录和索引页面上完成
【问题讨论】:
-
我看到的工作编辑和非工作删除之间的唯一区别是包含
db.php。它有什么作用? -
很抱歉让您感到困惑......我错过了编辑页面的第一行。两者都有 db.php 及其用于连接 mysql 数据库。
-
PS:您的代码对 SQL 注入、XSS 和 CSRF 是开放的。为了防止它们,您应该在将数据传递到数据库时使用准备好的语句,在回显数据时对数据进行编码,并分别对改变状态的操作使用反 CSRF 随机数。
-
是的,我知道这一点。在我知道这些功能已经起作用之后,我更喜欢将代码更改为准备好的语句..坏习惯..
-
我认为当时缺少一些相关代码。使用您发布的代码,删除和编辑之间似乎没有区别,因此两者都应该起作用,或者两者都不应该起作用。而且先写易受攻击的代码,然后再把它保护起来,希望能抓住所有的漏洞,这确实是一个坏习惯;错过一些太容易了。在公共网站上发布易受攻击的代码也不是一个好主意,因为它会使不安全的编码实践正常化;经验不足的人会看到它并可能模仿/复制它。
标签: php authentication mysqli