Управление конфиденциальной информацией в javascript - PullRequest
0 голосов
/ 11 апреля 2019

В моем 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 ]

2 голосов
/ 12 апреля 2019

Чтобы сделать это более безопасным, вы должны выполнить следующие действия:

  1. Убедитесь, что учетные данные проверены в коде на стороне сервера (PHP), а не на коде на стороне клиента.Злоумышленник может очень легко либо редактировать JavaScript, либо публиковать данные непосредственно на вашем сервере и полностью обойти ваш код.

  2. Пароли должны быть хэшированы с помощью соответствующего алгоритма хэширования паролей.SHA1 не является хорошим алгоритмом хеширования паролей, так как он слишком быстрый, что облегчает атаки методом "грубой силы" и атаки по словарю.Лучшим выбором было бы что-то вроде bcrypt или pbkdf2, они намного медленнее, что усложняет вышеуказанные атаки.Вы также должны солить свой пароль.Это означает просто добавление некоторой случайности к паролю до его хеширования.Это поможет предотвратить атаку, известную как атака «радужной таблицы», в которой злоумышленник использует набор предварительно хэшированных значений и соответствующий простой текст для ускорения процесса грубой силы.

  3. Непостройте строки SQL-запросов путем контактирования строк, так как это делает ваше приложение уязвимым для атак с использованием SQL-инъекций.Если злонамеренный пользователь должен был отправить 1 'ИЛИ 1 = 1 - в качестве параметра id, то все пользователи будут удалены, этот метод также можно использовать для выгрузки всех данных из базы данных или даже для полного удаления базы данных.Вместо этого обратите внимание на использование параметризованных запросов.

К счастью, уже есть масса информации о том, как сделать это правильно.Я бы порекомендовал заглянуть на сайт OWASP, на котором есть множество примеров.

1 голос
/ 11 апреля 2019

Есть несколько вещей, которые очень ошибаются в этом дизайне. Вы должны исправить их.

  1. Не храните пароли в открытом виде в вашей базе данных. Хешируйте пароли, используя хэш-функцию пароля (например, PHP password_hash() или sodium_crypto_pwhash()) перед сохранением в базе данных. (SHA1 не является хэшем пароля и не должен использоваться для этой цели.)

  2. Не создавайте запросы SQL с интерполяцией или конкатенацией строк. Вы уже используете PDO, поэтому вы можете легко использовать заполнители параметров для предотвращения внедрения SQL.

  3. Не отображать хэши паролей в браузере в любой форме. Если вам необходимо подтвердить пароль, отправьте его на сервер как часть запроса на выполнение действия, защищенного паролем, чтобы пользователь не мог обойти проверку пароля, введя URL-адрес вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...