我的 php 中有一个表,显示了我数据库中一个表的数据:用户名、电子邮件等,我还添加了一个删除选项。删除选项正常工作,并且在删除之前还会显示一条确认消息,其中包含必要的密码。
我将密码保存在数据库的表中但未加密。
问题在于,如果用户浏览页面内容,他们可以看到密码是什么,因此任何人都可以从数据库中删除数据。因此,或多或少熟练的用户可以轻松浏览该内容。
我该怎么做才能防止这种情况发生?我应该在另一个脚本中复制相同的 JavaScript 代码并将其从 index.php 中删除吗?为了更加安全,我尝试在同一 index.php 页面上使用哈希,但您也可以看到密码是什么。
这是我的代码:
索引.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");
?>
最佳答案
为了使这更安全,您应该考虑执行以下操作:
确保凭据在服务器端代码 (PHP) 中进行验证,而不是在客户端代码中进行验证。由于恶意用户可以很容易地编辑 JavaScript 或直接将数据发布到您的服务器并完全绕过您的代码。
应使用适当的密码哈希算法对密码进行哈希处理。 SHA1 不是一个好的密码散列算法,因为它太快了,这使得暴力和字典攻击更容易。更好的选择是像 bcrypt 或 pbkdf2 这样的东西,它们要慢得多,使上述攻击更加困难。你还应该加盐你的密码。这意味着在对密码进行哈希处理之前,只需在密码中添加一些随机性。这将有助于防止称为彩虹表攻击的攻击,在这种攻击中,攻击者使用一组预哈希值和相应的纯文本来加速暴力破解过程。
不要通过字符串联系构建 SQL 查询字符串,因为这会使您的应用程序容易受到 SQL 注入(inject)攻击。如果恶意用户发送 1' OR 1=1 -- 作为 id 参数,那么所有用户都将被删除,这种技术也可以用于从数据库中转储所有数据,甚至完全删除数据库。改用参数化查询。
幸运的是,已经有大量关于如何正确执行此操作的信息。我建议您查看 OWASP 网站,其中有大量示例。
关于javascript - 在 javascript 中管理 secret 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55638692/