【问题标题】:Manage confidential information in javascript在 javascript 中管理机密信息
【发布时间】: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%271 Bye bye 数据库表会发生什么。查看准备好的语句。
  • 我同意@Jeff 和@Miken 的观点——如果仅仅浏览页面源代码就可以发现弱点,那么这似乎并不安全。 delete.php 脚本中的 sql 很容易受到第一次 sql 注入的攻击,并且用户可能仅通过更改 ID 就可以删除许多用户。不要使用sha1,使用密码哈希来存储密码。

标签: javascript php mysql security hash


【解决方案1】:

为了更安全,您应该考虑执行以下操作:

  1. 确保在服务器端代码 (PHP) 中验证凭据,而不是在客户端代码中。由于恶意用户可以很容易地编辑 JavaScript 或直接将数据发布到您的服务器并完全绕过您的代码。

  2. 应使用适当的密码散列算法对密码进行散列。 SHA1 不是一个很好的密码散列算法,因为它太快了,这使得蛮力和字典攻击更容易。更好的选择是 bcrypt 或 pbkdf2 之类的,它们的速度要慢得多,从而使上述攻击更加困难。你还应该给你的密码加盐。这意味着只需在密码散列之前为密码添加一些随机性。这将有助于防止被称为彩虹表攻击的攻击,其中攻击者使用一组预散列值和相应的纯文本来加速暴力破解过程。

  3. 不要通过字符串联系构建 SQL 查询字符串,因为这会使您的应用程序容易受到 SQL 注入攻击。如果恶意用户发送 1' OR 1=1 -- 作为 id 参数,则所有用户都将被删除,这种技术也可以用于从数据库中转储所有数据,甚至完全删除数据库。考虑改用参数化查询。

幸运的是,已经有大量关于如何正确执行此操作的信息。我建议您查看有大量示例的 OWASP 网站。

【讨论】:

    【解决方案2】:

    这个设计有几处是非常错误的。你需要修复它们。

    1. 不要在数据库中存储明文密码。使用密码哈希函数(如 PHP 的 password_hash()sodium_crypto_pwhash()将密码存储在数据库中之前对密码进行哈希处理。 (SHA1 不是密码哈希,不应用于此目的。)

    2. 请勿使用字符串插值或连接构造 SQL 查询。您已经在使用 PDO,因此您可以轻松地使用参数占位符来防止 SQL 注入。

    3. 不要以任何形式向浏览器公开密码哈希。如果您需要验证密码,请将其作为请求的一部分提交给服务器以执行受密码保护的操作,这样用户就无法通过手动输入 URL 来绕过密码检查。

    【讨论】:

    • 谢谢,我正在努力解决你回答我的问题。我可以通过以下方式更改数据库的密码: UPDATE passwords SET password = SHA ('hello') WHERE passwords_id = '1';它是安全的好选择吗?
    • 没有。正如我在回答中所说:SHA1 不是密码哈希,不应用于此目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多