Где и как хранить конфиденциальную информацию обо мне на моем веб-сайте? [Дубликат]

Каковы варианты клонирования или копирования списка в Python?

В Python 3 мелкая копия может быть выполнена с помощью:

a_copy = a_list.copy()

В Python 2 и 3 вы можете получить мелкую копию с полным фрагментом оригинала:

a_copy = a_list[:]

Объяснение

Существует два семантических способа копирования списка. Неглубокая копия создает новый список тех же объектов, глубокая копия создает новый список, содержащий новые эквивалентные объекты.

Короткая копия списка

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

Существуют разные способы сделать это в Python 2 и 3. Пути Python 2 также будут работать в Python 3.

Python 2

В Python 2 , идиоматический способ создания мелкой копии списка состоит из полного фрагмента оригинала:

a_copy = a_list[:]

Вы также можете выполнить одно и то же, передав список через конструктор списка,

a_copy = list(a_list)

, но использование конструктора менее эффективно:

>>> timeit
>>> l = range(20)
>>> min(timeit.repeat(lambda: l[:]))
0.30504298210144043
>>> min(timeit.repeat(lambda: list(l)))
0.40698814392089844

Python 3

В Python 3 списки получают метод list.copy:

a_copy = a_list.copy()

В Python 3.5:

>>> import timeit
>>> l = list(range(20))
>>> min(timeit.repeat(lambda: l[:]))
0.38448613602668047
>>> min(timeit.repeat(lambda: list(l)))
0.6309100328944623
>>> min(timeit.repeat(lambda: l.copy()))
0.38122922903858125

Создание другого указателя делает not сделать копию

Используя new_list = my_list, тогда изменяет new_list каждый раз, когда изменяется my_list. Почему это?

my_list - это просто имя, которое указывает на фактический список в памяти. Когда вы скажете new_list = my_list, что вы не делаете копию, вы просто добавляете другое имя, указывающее на этот исходный список в памяти. У нас могут быть подобные проблемы, когда мы делаем копии списков.

>>> l = [[], [], []]
>>> l_copy = l[:]
>>> l_copy
[[], [], []]
>>> l_copy[0].append('foo')
>>> l_copy
[['foo'], [], []]
>>> l
[['foo'], [], []]

Список - это всего лишь массив указателей на содержимое, поэтому мелкая копия просто копирует указатели, поэтому у вас есть два разных списка, но они имеют одинаковое содержимое. Чтобы сделать копии содержимого, вам нужна глубокая копия.

Глубокие копии

Чтобы сделать глубокую копию списка в Python 2 или 3, используйте deepcopy в модуле copy :

import copy
a_deep_copy = copy.deepcopy(a_list)

Чтобы продемонстрировать, как это позволяет нам создавать новые под-списки:

>>> import copy
>>> l
[['foo'], [], []]
>>> l_deep_copy = copy.deepcopy(l)
>>> l_deep_copy[0].pop()
'foo'
>>> l_deep_copy
[[], [], []]
>>> l
[['foo'], [], []]

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

Не использовать eval

Вы можете видеть, что это используется как способ to deepcopy, но не делайте этого:

problematic_deep_copy = eval(repr(a_list))
  1. Это опасно, особенно если вы оцениваете что-то из источника, которому вы не доверяете.
  2. Это не надежный, если подэлемент, который вы копируете, не имеет представления, которое может быть доказано для воспроизведения эквивалентного элемента.
  3. Он также менее эффективен.

В 64-битном Python 2.7:

>>> import timeit
>>> import copy
>>> l = range(10)
>>> min(timeit.repeat(lambda: copy.deepcopy(l)))
27.55826997756958
>>> min(timeit.repeat(lambda: eval(repr(l))))
29.04534101486206

на 64-битном Python 3.5:

>>> import timeit
>>> import copy
>>> l = list(range(10))
>>> min(timeit.repeat(lambda: copy.deepcopy(l)))
16.84255409205798
>>> min(timeit.repeat(lambda: eval(repr(l))))
34.813894678023644
3
задан halfer 16 July 2014 в 20:20
поделиться

2 ответа

Ваш веб-корень, который $_SERVER['DOCUMENT_ROOT'] в PHP, является папкой на вашей файловой системе, которую ваш веб-сервер (в данном случае, Apache) указывает на определенный хост.

Например, если вы поместите этот код в свой файл index.php и зайдите в свое доменное имя (или имя поддомена), он скажет вам ваш веб-корень.

    <?php
    header("Content-Type: text/plain;charset=UTF-8");
    die($_SERVER['DOCUMENT_ROOT']);
    ?>

Он должен сказать что-то вроде /home/some_user/public_html или /var/www. В этом случае вы хотите создать путь, который не находится внутри этого каталога.

Например: /home/some_user/config или /var/webconfig.

Вы выполняете NOT хотите сохранить его в /home/some_user/public_html/config (обратите внимание на public_html) или /var/www/webconfig (обратите внимание, что это подпапка из /var/www)

Идея хранения данных вне вашего веб-корня заключается в том, что злоумышленник не может перейти к http://yoursite.com/config/mysql.txt и получить ваши пароли. LFI и атаки на обход каталога не входят в сферу этой инициативы.

Вы также не должны проверять конфиденциальную информацию (учетные данные базы данных, ключи шифрования и т. Д.) В управлении версиями.

Как получить доступ к ним из PHP?

Это зависит от того, как кодируется ваша конфигурация.

<?php
$config = parse_ini_file('/home/some_user/config/mysql.ini');
// OR
$config = json_decode('/home/some_user/config/mysql.json');
// OR
require_once '/home/some_user/config/mysql_config.php';
?>
7
ответ дан Scott Arciszewski 21 August 2018 в 17:38
поделиться
  • 1
    В языке Apache httpd это ваш DocumentRoot. – tadman 16 July 2014 в 20:17
  • 2
    Я имею тенденцию перенастраивать Apache так, чтобы /var/www/default был стандартным ловушкой-catch-all, а затем все проекты на сервере следуют форме /var/www/project/web/. Таким образом, конфигурация, специфичная для проекта, может идти в /var/www/project/config/. – halfer 16 July 2014 в 20:19
  • 3
    Это именно то, что я делаю, только это /var/www/project/public, поэтому я могу легко напомнить себе, что все, что можно прочитать. Кроме того, он делает public/static/* шутки в файлах. – Scott Arciszewski 16 July 2014 в 20:23
  • 4
    Лучше сделайте доступ к серверу базы данных только с локального хоста. Тогда не имеет значения, пропущены ли учетные данные, поскольку они бесполезны вне сервера. – Gumbo 16 July 2014 в 22:27
  • 5
    Тогда я могу легко получить доступ к переменным в моем включенном файле, просто позвонив им? Ex. $ dbname? – shane 16 July 2014 в 22:59

Как правило, я использую папку вне моего веб-сайта для кода приложения (функции и т. д.), включая mysql connect php. Я создаю папку (/ home / user / application или подобное) и создаю там файл mysqlconnect.php с кодом для подключения к mysql или ошибкой. Затем убедитесь, что путь (/ home / user / application / находится в каталоге include и в верхней части index.php (index.html) включает:

<?php
include('/home/user/application/mysqlconnect.php');

?>

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

Надеюсь, что помогает

2
ответ дан user1955162 21 August 2018 в 17:38
поделиться
  • 1
    Также удобно называть эти .inc и отказоустойчивые функции *.inc в ваших правилах сервера. – tadman 16 July 2014 в 20:17
Другие вопросы по тегам:

Похожие вопросы: