使用javascript

时间:2019-04-11 18:03:56

标签: javascript php mysql security hash

我在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>

Delete.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");
?>

2 个答案:

答案 0 :(得分:2)

要使其更加安全,您应该执行以下操作:

  1. 确保在服务器端代码(PHP)中而非客户端代码中验证凭据。作为恶意用户,您可以轻松地编辑JavaScript或将数据直接发布到您的服务器,从而完全绕开您的代码。

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

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

幸运的是,已经有大量有关如何正确执行此操作的信息。我建议您浏览OWASP网站,其中包含很多示例。

答案 1 :(得分:1)

关于此设计,有几件事是非常错误的。您需要修复它们。

  1. 请勿在数据库中存储明文密码。使用密码散列功能(例如PHP的password_hash()sodium_crypto_pwhash())散列密码之前,然后将其存储在数据库中。 (SHA1不是密码哈希,因此不应用于此目的。)

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

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