【发布时间】:2019-09-02 10:55:37
【问题描述】:
我的 php 中有一个表,它显示了我的数据库中的一个表的数据:用户名、电子邮件等,我还添加了一个删除选项。删除选项可以正常工作,并且在删除之前还会显示带有必要密码的确认消息。
我将密码保存在数据库的表中,但未加密。
问题在于,如果用户浏览页面内容,他们可以看到密码是什么,因此任何人都可以从数据库中删除数据。因此,或多或少熟练的用户可以轻松探索该内容。
我能做些什么来防止这种情况发生?我应该在另一个脚本中复制相同的 JavaScript 代码并将其从 index.php 中删除吗?为了更安全,我尝试在同一个 index.php 页面上使用哈希,但您也可以看到密码是什么。
这是我的代码:
index.php
<table id="professorsRegistered" border="1px">
<tr>
<th colspan="3"><h2>Users</h2></th>
</tr>
<tr>
<th> Name </th>
<th> Email </th>
<th> Delete </th>
</tr>
<?php
$sql = "SELECT * FROM users"; /*Select from table name: users*/
$result = $conn->query($sql); /*Check connection*/
if ($result->num_rows==0){
echo "No users";
}else{
while($row = $result->fetch_assoc()) {
echo "<tr><td>".$row["username"]."</td><td>".$row["email"]."</td><td><a class='eliminate' onClick=\"getPass(".$row['id'].");\">X</a></td></tr>";
}
}
?>
</table>
<?php
$sql = "SELECT password FROM passwords WHERE passwords_id = '1';"; /*Select from table name: passwords*/
$result = $conn->query($sql); /*Check connection*/
$row = $result->fetch_assoc();
$password = $row["password"];
$hash = sha1($password);
/*echo "<p>".$hash."</p>";*/
?>
<script type = "text/javascript">
function getPass(user) {
var securePass = "<?php echo $password ?>";
var pass = prompt("Introduce password to delete: ", "Password");
if (pass!=securePass) {
return confirm('Incorrect Password');
}
else if (pass==securePass) {
window.location='delete.php?id='+user;
}
}
</script>
删除.php
<?php
include('Conexion.php'); // Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$id = $_GET['id']; // $id is defined
mysqli_query($conn,"DELETE FROM users WHERE id='".$id."'");
mysqli_close($conn);
header("Location: index.php");
?>
【问题讨论】:
-
没有任何变体提供任何安全性。找到一种不同的方式来处理删除授权。比如:在服务器上存储(或“计算”)什么用户可以做什么样的动作,例如为可能这样做的用户设置“管理员”标志。然后 - 当然 - 在对服务器的每个请求检查登录用户(通过 authtoken、会话等)
-
还要确保准备好你的sql语句!现在我可以轻松删除所有个用户。
-
我认为您更大的问题是任何人都可以删除数据库中的所有内容。如果有人调用
delete.php?id=1%27+OR+%271%27%3D%271Bye bye 数据库表会发生什么。查看准备好的语句。 -
我同意@Jeff 和@Miken 的观点——如果仅仅浏览页面源代码就可以发现弱点,那么这似乎并不安全。
delete.php脚本中的 sql 很容易受到第一次 sql 注入的攻击,并且用户可能仅通过更改 ID 就可以删除许多用户。不要使用sha1,使用密码哈希来存储密码。
标签: javascript php mysql security hash