Najlepsza praktyka dla wersji wp-config.php?

35

Czy istnieje najlepsza praktyka dołączania wp-config.phppliku do repozytorium kontroli wersji?

Zastanawiam się nad utworzeniem nowej witryny z tego rodzaju konfiguracją (podobną do Alexa Kinga i Marka Jaquitha ):

/index.php
/local-config.php
/wp-config.php
/wp/ (core)
/wp-content/ (plugins, themes, etc.)

Jak mogę to zrobić bez narażania mojego hasła na git, na wypadek gdyby to repozytorium kiedykolwiek stało się publiczne?

Zwłaszcza w poście Marka wygląda na to, że local-config.php może przechowywać szczegóły lokalnej bazy danych i hasła, ale produkcyjne pozostają w wp-config.php. Czy to zbyt duży problem i czy powinienem pozostawić wp-config.php niewersjonowane?

Jjeaton
źródło
Myślę, że sposób, w jaki robi Mark Jaquith, nie stanowi większego problemu i działa dobrze i jest nieco lepszy niż odpowiedź poniżej.
Wyck
IMO, wszystko powinno być poddane kontroli wersji, a system powinien być w stanie obsługiwać różne środowiska bez żadnych działań hakerskich, zapewniając jednocześnie bezpieczeństwo i łatwość obsługi. Właśnie napisałem, jak to robię, co obejmuje wszystkie Twoje obawy :) Daj mi znać, jeśli masz jakieś pytania dotyczące mojej konfiguracji.
Ashfame

Odpowiedzi:

45

Oto jak to robię i nie spotkałem nic lepszego niż to. Trzymam inną wersję pliku wp-config.php pod kontrolą wersji, a następnie trzymam plik o jednym katalogu powyżej, który przechowuje wszystkie poświadczenia bazy danych i sole / klucze. Również w ten sposób mogę rozróżnić rodzaj konfiguracji, którą prowadzę i na tej podstawie robię różne rzeczy.

Oto wp-config.phptrzymam pod git( https://gist.github.com/1923821 ):

<?php

/**
* Define type of server
*
* Depending on the type other stuff can be configured
* Note: Define them all, don't skip one if other is already defined
*/

define( 'DB_CREDENTIALS_PATH', dirname( ABSPATH ) ); // cache it for multiple use
define( 'WP_LOCAL_SERVER', file_exists( DB_CREDENTIALS_PATH . '/local-config.php' ) );
define( 'WP_DEV_SERVER', file_exists( DB_CREDENTIALS_PATH . '/dev-config.php' ) );
define( 'WP_STAGING_SERVER', file_exists( DB_CREDENTIALS_PATH . '/staging-config.php' ) );

/**
* Load DB credentials
*/

if ( WP_LOCAL_SERVER )
    require DB_CREDENTIALS_PATH . '/local-config.php';
elseif ( WP_DEV_SERVER )
    require DB_CREDENTIALS_PATH . '/dev-config.php';
elseif ( WP_STAGING_SERVER )
    require DB_CREDENTIALS_PATH . '/staging-config.php';
else
    require DB_CREDENTIALS_PATH . '/production-config.php';

/**
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*/

if ( ! defined( 'AUTH_KEY' ) )
    define('AUTH_KEY', '9*W=5&lt;Rw-)c].9}g?^[:!j]h+Efr&lt;y$&lt;YmV0XOo|lOIujEE}+[R}iAQZ :Sy3wN}');
if ( ! defined( 'SECURE_AUTH_KEY' ) )
    define('SECURE_AUTH_KEY', 'APge3~H;g+b0FyNF&amp;e`$=g?qj9@FQwqFe^Q4(@p#kDa=NR? $Z9|@v*a(tOj*B+.');
if ( ! defined( 'LOGGED_IN_KEY' ) )
    define('LOGGED_IN_KEY', '5l0+:WTpj8#[V|;&lt;Iw;%rkB(A}r++HwT|s[LW!.wt.=5J!b%Z{F1/[LxQ*d7J&gt;Cm');
if ( ! defined( 'NONCE_KEY' ) )
    define('NONCE_KEY', 'zO2cmQX`Kc~_XltJR&amp;T !Uc72=5Cc6`SxQ3;$f]#J)p&lt;/wwX&amp;7RTB2)K1Qn2Y*c0');
if ( ! defined( 'AUTH_SALT' ) )
    define('AUTH_SALT', 'je]#Yh=RN DCrP9/N=IX^,TWqvNsCZJ4f7@3,|@L]at .-,yc^-^+?0ZfcHjD,WV');
if ( ! defined( 'SECURE_AUTH_SALT' ) )
    define('SECURE_AUTH_SALT', '^`6z+F!|+$BmIp&gt;y}Kr7]0]Xb@&gt;2sGc&gt;Mk6,$5FycK;u.KU[Tw$345K9qoF}WV,-');
if ( ! defined( 'LOGGED_IN_SALT' ) )
    define('LOGGED_IN_SALT', 'a|+yZsR-k&lt;cSf@PQ~v82a_+{+hRCnL&amp;|aF|Z~yU&amp;V0IZ}Mrz@ND])YD22iUM[%Oc');
if ( ! defined( 'NONCE_SALT' ) )
    define('NONCE_SALT', '|1.e9Tx{fPv8D#IXO6[&lt;WY*,)+7+URp0~|:]uqiCOzu93b8,h4;iak+eIN7klkrW');

/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each a unique
* prefix. Only numbers, letters, and underscores please!
*/

$table_prefix = 'ft_';

/**
* WordPress Localized Language, defaults to English.
*
* Change this to localize WordPress. A corresponding MO file for the chosen
* language must be installed to wp-content/languages. For example, install
* de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
* language support.
*/

define( 'WPLANG', '' );

/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*/

if ( WP_LOCAL_SERVER || WP_DEV_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', true );

    define( 'SCRIPT_DEBUG', true );
    define( 'SAVEQUERIES', true );

} else if ( WP_STAGING_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', false );

} else {

    define( 'WP_DEBUG', false );
}


/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

A oto lokalny plik konfiguracyjny, który trzymam jeden katalog powyżej katalogu głównego WordPress, a to czyni go również poza katalogiem dostępnym w Internecie, więc w przypadku, gdy apache przestanie analizować pliki PHP i zacznie je wyrzucać, nasze poświadczenia bazy danych są nadal bezpieczne ( https: / /gist.github.com/1923848 ):

<?php

/**
 * WordPress config file to use one directory above WordPress root, when awesome version of wp-config.php is in use.
 *
 * Awesome wp-config.php file - https://gist.github.com/1923821
 */

/* WordPress Local Environment DB credentials */

define('DB_NAME', 'project_21');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

/* Keys & Salts */

define('AUTH_KEY',         '5H%)s-nQ,+fn0gwg/p1UjBTmCQ?l[8-!>Q{MW&?X3DM,OF;TaI<SOOTrl0+-@) *');
define('SECURE_AUTH_KEY',  '+%rr@,XIt-V+[.B9++uH1L,L+r)uq}5(:~=&4~Lk|.LV|y;R}fEo?G}+Sntf_JN}');
define('LOGGED_IN_KEY',    'Szv!gQm9#(L&TUD OnM`>sXGge:m1j`L2 5sO;hRNVhlN>IUED1/`%<[ly-GxVJ ');
define('NONCE_KEY',        'o-Jo;>G#-%~,[ki@REqXV%4^I.HDnc.3]P;e8];4pJt% $xe5K<aOb|a2*QKV4c-');
define('AUTH_SALT',        '8-tQb3d|W8,;Y_#mfuFB.1&b%U2fnlLD|F&yH).tLRX=ANEdNap{78o|9tqv6JPt');
define('SECURE_AUTH_SALT', 'RSa%^qd~T|@+!-;qgh,qK-GJ}zPpgxz#+@v6-I;BMwqT`TzGTtg_^n*ILxGOdbq4');
define('LOGGED_IN_SALT',   ']+XV)YK.Q-EU1vR [BT!Y$!d(J_[AO37OP[Fg[/esFx;6cI-L[^O|cvtw9F[;_*Q');
define('NONCE_SALT',       'iP{nTQBzy&f^hSbwBgyan.v9<+ErvAMi2ymLhz`Tl-fF?HXa(j<W`wA*8U3R#-|w');

W ten sposób, jeśli powyższy plik ma nazwę local-config.php, mój system zachowuje się jak instalacja lokalna. Jeśli jest nazwany staging-config.php, zachowuje się jak instalacja przejściowa i jeśli jest nazwany production-config.php. Pomaga mi to mieć różne wartości niektórych stałych, takich jak debugowanie, mieć różne wartości w różnych środowiskach i nadal mieć wszystko pod SCM (git). Możliwości są nieskończone i nie ma potrzeby hakowania dla różnych środowisk.

To gwarantuje, że nigdy nie ujawnisz żadnych poufnych informacji i używam ich tylko po to, aby rozpocząć każdy projekt, nad którym pracuję, domyślnie mam mocniejsze klucze i jak tylko dodam je do drugiego pliku konfiguracyjnego jeden katalog powyżej, są one używane zamiast tu zdefiniowanych. Błogość!

Popiół
źródło
Podoba mi się to podejście, prawdopodobnie skończę coś takiego.
jjeaton
Jak odwołujesz się do katalogu-local-config-file-in-the-parent-directory z głównego pliku konfiguracyjnego? Za pośrednictwem dowiązania symbolicznego lub gdzieś ../(tj. ../filename)? - Nie znalazłem nic ../w głównym wp-config.phppliku.
KajMagnus
1
@KajMagnus Stała to DB_CREDENTIALS_PATHrobi.
Ashfame
9

Jak mogę to zrobić bez narażania mojego hasła na git, na wypadek gdyby to repozytorium kiedykolwiek stało się publiczne?

Jeśli wp-config.phpplik jest pod kontrolą wersji, wszelkie zawarte w nim hasła będą również pod kontrolą wersji. Jedynym sposobem, aby tego uniknąć, jest nie umieszczanie pliku w kontroli wersji.

Czy to zbyt duży problem i czy powinienem pozostawić wp-config.php niewersjonowane?

Moim przeczuciem byłoby wp-config.phpcałkowicie nie wywracać uwagi. Ale jest na to kilka sposobów.

Wyodrębnij część, wp-config.phpktóra zawiera hasła i skróty do osobnego pliku i include()znajduje się w zwykłym wp-config.phppliku. Następnie wp-config.phpprzejdź pod kontrolę wersji, ale zachowaj include()osobny plik.

wp-config.php:

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information
 * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

include( 'conf.php' );    

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'wp_';

/**
 * WordPress Localized Language, defaults to English.
 *
 * Change this to localize WordPress. A corresponding MO file for the chosen
 * language must be installed to wp-content/languages. For example, install
 * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
 * language support.
 */
define('WPLANG', '');

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define('WP_DEBUG', false);

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Teraz widać, że hasła i skróty nie są w ogóle uwzględnione wp-config.php.

conf.php:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');


/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Ale szczerze mówiąc, w tym momencie dodajesz tutaj zbędny poziom abstrakcji. Cały powód wp-config.phpjest oddzielny przede wszystkim dlatego, że jest specyficzny dla środowiska. Nie powinieneś w ogóle kopiować go z lokalnego serwera do wersji produkcyjnej ... więc nie powinien on być w ogóle pod kontrolą wersji.

EAMann
źródło
Wydaje się, że to trochę dodatkowej pracy, ale widzę korzyści w zapewnieniu synchronizacji wszystkich ustawień wp-config między środowiskami.
jjeaton
Dzielenie wp-config.phpma dodatkową zaletę: możesz dołączyć conf.phpdo skryptu innego niż WP bez ładowania całego WordPressa.
Tamlyn
4

Przykład Marka zakłada, że ​​pracujesz z prywatnym repozytorium:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
  include( dirname( __FILE__ ) . '/local-config.php' );
  define( 'WP_LOCAL_DEV', true ); 
} else {
  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
}

Zamiast definiować poświadczenia, równie łatwo można utworzyć plik production-config.php i włączyć go do kontroli warunkowej:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
      include( dirname( __FILE__ ) . '/local-config.php' );
      define( 'WP_LOCAL_DEV', true ); 
    } else {
     include( dirname( __FILE__ ) . '/production-config.php' )
    }

Następnie w niewersjonowanym pliku config-config.php:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
Chris_O
źródło
Nawet jeśli jest to prywatne repozytorium, nie chciałbym, aby hasła były w nim przechowywane, i chciałbym mieć elastyczność, aby upublicznić repo, jeślibym tego chciał. Produkcja-config.php jest prawdopodobnie dobrym sposobem.
jjeaton
2

Możesz zatwierdzić wp-config.phpplik do repozytorium bez swoich tajnych ciągów, a następnie uruchomić:

git update-index --assume-unchanged wp-config.php

To powie gitowi założenie, że plik jest, cóż, niezmieniony.

getWeberForStackExchange
źródło
4
Dobrze wiedzieć, nie wiedziałem o assume-unchangedzmianie, ale oto moje dwa punkty: (1) Jeśli dodasz plik bezpośrednio, zostanie on dodany do indeksu. Istnieje ryzyko, że w pewnym momencie możesz go przypadkowo dodać. (2) Scalenie zatwierdzenia z tą flagą spowoduje, że scalenie zakończy się niepowodzeniem z wdziękiem, dzięki czemu będziesz mógł obsługiwać go ręcznie, co czyni to nie eleganckim rozwiązaniem. Można go użyć tylko do tymczasowego zignorowania zmian podczas sesji programistycznej. Tutaj czytaj więcej - gitready.com/intermediate/2009/02/18/…
Ashfame