Куки http

Как прочитать\получить куку php?

То, что в браузере отображается кука, это хорошо, но мы ведь ее создаем, чтобы впоследствии использовать в наших скриптах. Так как же получить куку? Для этого существует глобальный массив кук $_COOKIE, в котором находятся вообще все созданные куки. Обратиться к ним легко — достаточно знать имя.

Попробуем прочитать содержимое нашей куки wpguru. Для этого напишем простенький скриптик:

1
2
3
4
5
6

if(isset($_COOKIE’wpguru’)){

echo’Кука wpguru существует, и в ней лежит значение: ‘.$_COOKIE’wpguru’;

}

else{

echo’Кука wpguru не задана’;

}

И глянем, что вывелось на экран:

Как видите, все прекрасно работает. Вот так можно с легкостью проверить, существует ли нужная кука, и если да, то взять ее значение.

Рекомендую всегда делать проверку на существования необходимых переменных, массивов, и тд. Так Вы избежите обидных ошибок в будущем.

Регистрация на сайте

Перед тем, как мы начнем добавлять аутентификацию на своем сайте, придётся добавить форму для регистрации нового аккаунта.Аккаунт — это учётная запись пользователя.
Чтобы завести аккаунт, требуется пройти регистрацию — это заполнение специальной формы, где пользователь указывает свою почту, пароль, и, возможно, дополнительную информацию.
После регистрации все данные из формы сохраняются в базе данных как есть

Но хранению паролей нужно уделить особое внимание

Хранение паролей

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

Что такое хеширование

Отпечаток (хэш) — это результат работы функции хэширования, которая вернёт для любого значения строку фиксированной длины.
Используя специальный математический алгоритм, такая функция умеет преобразовывать любую переданную информацию к строке фиксированной длины (например, 32 или 64 символа). Причём любому массиву информации, будь это все статьи из Википедии, или одно слово, всегда будет соответствовать уникальный отпечаток. Повторный вызов функции для одного и того же исходника всегда возвращает один и тот же хэш.
Обратная операция (получить из отпечатка оригинал) невозможна.

Возьмём простой пример. У нас есть информация, для которой мы хотим получить отпечаток. Пусть такой информацией будет следующая строка:

«Я знаю только то, что ничего не знаю, но другие не знают и этого»

Результат обработки этой строки хэширующей функцией SHA-1 будет таким:

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

Реализация регистрации пользователя

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

Вызов этой функции вернёт следующую строку:
Именно это значение и следует хранить в БД, вместо пароля.

Работа с cookie из PHP

Для сохранения cookie в браузере пользователя используется функция :

bool setcookie(
    string $name,
    string $value,
    int $expire, 
    string $path,
    string $domain,
    bool $secure,
    bool $httponly
);

Может принимать следующие параметры:

  • : имя cookie, которое будет использоваться для доступа к его значению.
  • : значение или содержимое cookie — любой алфавитно-цифровой текст не более 4 кБайт.
  • (необязательный параметр): срок действия, после которого cookie уничтожаются. Если данный параметр не установлен или равен 0, то уничтожение cookie происходит после закрытия браузера.
  • (необязательный параметр): путь к каталогу на сервере, для которого будут доступны cookie. Если задать «/», cookie будут доступны для всего сайта. Если задать, например, , cookie будут доступны из этого каталога и всех его подкаталогов (, ). По умолчанию значением является текущий каталог, в котором устанавливаются cookie.
  • (необязательный параметр): задает домен, для которого будут доступны cookie. Если это домен второго уровня, например, , то cookie доступны для всего сайта , в том числе и для его поддоменов типа . Если задан поддомен , то cookie доступны только внутри этого поддомена.
  • (необязательный параметр): указывает на то, что значение cookie должно передаваться по протоколу HTTPS. Если задано , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. По умолчанию параметр равен .
  • (необязательный параметр): если равно , cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны из JavaScript. По умолчанию параметр равен .

Чтобы получить cookie, можно использовать глобальный массив . Для удаления cookie достаточно в качестве срока действия указать какое-либо время в прошлом:

setcookie('lastvisit', '', time() - 3600);

Чтобы к идентификатору сессии не было доступа из JavaScript, нужно отредактировать файл :

; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

; Whether or not to add the httpOnly flag to the cookie, which makes
; it inaccessible to browser scripting languages such as JavaScript.
; http://php.net/session.cookie-httponly
session.cookie_httponly = 1

Можно также использовать функцию , чтобы установит флаг уже во время выполнения приложения:

ini_set('session.cookie_httponly', 1);
session_start();

Еще одни способ изменить флаг — вызов функции перед :

session_set_cookie_params(/*...*/);
session_start();

Установить флаг для из :

; http://php.net/session.cookie-secure
session.cookie_secure = 1

Установить флаг во время работы приложения:

ini_set('session.cookie_secure', 1);
session_start();
session_set_cookie_params(/*...*/);
session_start();

Поиск:
Cookie • HTTP • HTTPS • JavaScript • PHP • Web-разработка • expire • httponly • localStorage • php.ini • secure • sessionStorage • setcookie

Parameter Values

Parameter Description
name Required. Specifies the name of the cookie
value Optional. Specifies the value of the cookie
expire Optional. Specifies when the cookie expires. The value: time()+86400*30, will set the cookie to expire in 30 days. If this parameter is omitted or set to 0, the cookie will expire at the end of the session (when the browser closes). Default is 0
path Optional. Specifies the server path of the cookie.
If set to «/», the cookie will be available within the entire domain. If set to «/php/», the cookie will only be available within the php directory and all sub-directories of php. The default value is the current directory that the cookie is being set in
domain Optional. Specifies the domain name of the cookie. To make the cookie available on all subdomains of example.com, set domain to «example.com». Setting it to www.example.com will make the cookie only available in the www subdomain
secure Optional. Specifies whether or not the cookie should only be transmitted over a secure HTTPS connection. TRUE indicates that the cookie will only be set if a secure connection exists. Default is FALSE
httponly Optional. If set to TRUE the cookie will be accessible only through the HTTP protocol (the cookie will not be accessible by scripting languages). This setting can help to reduce identity theft through XSS attacks. Default is FALSE

Parameter Values

Parameter Description
name Required. Specifies the name of the cookie
value Optional. Specifies the value of the cookie
expire Optional. Specifies when the cookie expires. The value: time()+86400*30, will set the cookie to expire in 30 days. If this parameter is omitted or set to 0, the cookie will expire at the end of the session (when the browser closes). Default is 0
path Optional. Specifies the server path of the cookie.
If set to «/», the cookie will be available within the entire domain. If set to «/php/», the cookie will only be available within the php directory and all sub-directories of php. The default value is the current directory that the cookie is being set in
domain Optional. Specifies the domain name of the cookie. To make the cookie available on all subdomains of example.com, set domain to «example.com». Setting it to www.example.com will make the cookie only available in the www subdomain
secure Optional. Specifies whether or not the cookie should only be transmitted over a secure HTTPS connection. TRUE indicates that the cookie will only be set if a secure connection exists. Default is FALSE
httponly Optional. If set to TRUE the cookie will be accessible only through the HTTP protocol (the cookie will not be accessible by scripting languages). This setting can help to reduce identity theft through XSS attacks. Default is FALSE

Definition and Usage

The setcookie() function defines a cookie to be sent along with the rest of the HTTP headers.

A cookie is often used to identify a user. A cookie is a small file that the
server embeds on the user’s computer. Each time the same computer requests a
page with a browser, it will send the cookie too. With PHP, you can both create and retrieve cookie values.

The name of the cookie is automatically assigned to a variable of the same
name. For example, if a cookie was sent with the name «user», a variable is
automatically created called $user, containing the cookie value.

Note: The setcookie() function must appear BEFORE the <html> tag.

Note: The value of the cookie is automatically URLencoded when
sending the cookie, and automatically decoded when received (to prevent
URLencoding, use setrawcookie() instead).

Cookies

Cookies (в дальнейшем просто «куки») — небольшие фрагменты данных, которые веб-сервер отправляет браузеру.
Браузер сохраняет их у себя, а при следующем посещении веб-страницы отправляет обратно. Благодаря этому, веб-сервер сможет узнать своего «старого» посетитеиля, идентифицировать его.

С технической стороны, куки — это обычные HTTP заголовки.
Когда веб-сервер хочет записать куку в браузер пользователя, он отсылает специальный заголовок ответа с названием . В этом заголовке должна содержаться необходимая информация и дополнительные аттрибуты, о которых пойдёт речь далее.
В следующий раз, когда браузер пользователя запросит веб-страницу с того же сайта, в числе прочих заголовков он передаст заголовок запроса . Веб-сервер получит эту информацию, и она будет доступна также и для PHP.

Как установить куки: функция setcookie

Являясь серверным языком программирования, PHP может управлять заголовками, которые отправляет сервер, а значит может устанавливать и читать куки.
Чтобы добавить новую куку, необходимо вначале определиться со следующими критериями:

  • Название этой куки (может состоять только из символов латинского алфавита и цифр);
  • Значение, которое предполагается хранить;
  • Срок жизни куки — это обязательное условие.

За установку куки в PHP отвечает функция , ей нужно передать как минимум три параметра, описанных выше. Пример:

Обратите внимание, что срок жизни указывается в относительной величине. В этом примере кука будет существовать ровно 30 дней с момента установки

Как прочитать куки

В PHP максимально упрощён процесс чтения информации из кукисов. Все переданные сервером куки становятся автоматически доступны в специальном глобальном массиве
Так, чтобы получить содержимое куки с именем «visit_count», достаточно обратиться к одноимённому элементу массива , например вот так:

Обратите внимание: установив в сценарии куку через , прочитать её можно будет только при следующем посещении страницы

Собираем всё вместе

Теперь, научившись устанавливать и читать куки, напишем полноценный сценарий, который будет считать и выводить количество посещений страницы пользователем:

Что такое Cookie?

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

Куки создаются с помощью браузера по запросу сервера (в соответствии с логикой программы). После того, как печенье создается на стороне пользователя, его браузер отправляет эту информацию(из куки) обратно на сервер с помощью HTTP — заголовка.

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

Что такое сессия в PHP?

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

Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может сопоставить конкретного пользователя по несколькими запросами. Например, при доступе к веб-странице, сервер несёт ответственность за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя.

Следующая диаграмма вкратце изображает протокол HTTP.

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

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

Обработка входа с сессиями и файлами «куки» (cookie)

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

  1. Пользователь открывает страницу входа на веб-сайт.
  2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
  3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
  4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» (так называется по умолчанию).
  5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла . Если в браузере разрешены «куки», то он сохранит этот , в котором хранится идентификатор сеанса, переданный сервером.
  6. Для последующих запросов, «кука» передаётся обратно на сервер. Когда сервер получает «куку» , он пытается инициализировать сеанс с этим идентификатором сеанса.  Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива с данными, хранящимися в файле сеанса.

Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.

На следующей диаграмме показано, как протокол HTTP работает с сеансами.

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

Приложение: Функции для работы с куки

Вот небольшой набор функций для работы с куки, более удобных, чем ручная модификация .

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

Самый короткий способ получить доступ к куки – это использовать регулярные выражения.

Функция возвращает куки с указанным :

Здесь генерируется динамически, чтобы находить .

Обратите внимание, значение куки кодируется, поэтому использует встроенную функцию для декодирования. Устанавливает куки с именем и значением , с настройкой по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):

Устанавливает куки с именем и значением , с настройкой по умолчанию (можно изменить, чтобы добавить другие значения по умолчанию):

Чтобы удалить куки, мы можем установить отрицательную дату истечения срока действия:

Операции обновления или удаления куки должны использовать те же путь и домен

Обратите внимание: когда мы обновляем или удаляем куки, нам следует использовать только такие же настройки пути и домена, как при установке куки. Всё вместе: cookie.js

Всё вместе: cookie.js.

Appendix: Cookie functions

Here’s a small set of functions to work with cookies, more convenient than a manual modification of .

There exist many cookie libraries for that, so these are for demo purposes. Fully working though.

The shortest way to access cookie is to use a regular expression.

The function returns the cookie with the given :

Here is generated dynamically, to match .

Please note that a cookie value is encoded, so uses a built-in function to decode it.

Sets the cookie to the given with by default (can be modified to add other defaults):

To delete a cookie, we can call it with a negative expiration date:

Updating or deleting must use same path and domain

Please note: when we update or delete a cookie, we should use exactly the same path and domain options as when we set it.

Together: cookie.js.

Удаление Cookie с помощью PHP

Официально, чтобы удалить cookie, вы должны вызвать setcookie() только с аргументом name, но это не всегда хорошо работает, и на него нельзя положиться. Безопаснее всего установить cookie с истекшей датой —

<?php
   setcookie( "name", "", time()- 60, "/","", 0);
   setcookie( "age", "", time()- 60, "/","", 0);
?>
<html>
   <head>
      <title>Deleting Cookies with PHP</title>
   </head>
   <body>
      <?php echo "Deleted Cookies" ?>
   </body>
</html>

Новые статьи

  • Ошибки в PHP и обработка исключений — 12/04/2018 19:21
  • Регулярные выражения PHP -Кванторы, мета-символы и модификаторы — 12/04/2018 19:20
  • Сеансы PHP — Запуск, уничтожение, сессии без файлов cookie — 12/04/2018 19:20

Предыдущие статьи

  • Файлы PHP и ввод-вывод — открытие, чтение, запись и закрытие файла — 12/04/2018 19:18
  • Методы PHP GET и POST, переменная $_REQUEST — 12/04/2018 19:17
  • Загрузка файлов PHP — Создание формы и сценария загрузки — 12/04/2018 19:16
  • Объектно-ориентированное программирование в PHP — 12/04/2018 19:15
  • Включение файла в PHP — Функция include и require — 12/04/2018 19:14
  • Предопределенные переменные PHP — Суперглобальные массивы и переменные сервера — 12/04/2018 19:13
  • Функции с параметрами, динамические вызовы, создание функции в PHP — 12/04/2018 19:12
  • Типы операторов PHP — категории, присваивания, логические операторы — 12/04/2018 19:11
  • Типы циклов PHP for, foreach, continue, break, do-while — 12/04/2018 19:10
  • Принятие решений PHP — ElseIf Switch — 12/04/2018 19:09
  • Типы констант PHP — Различия между константами и переменными — 12/04/2018 19:08
  • Массивы PHP: Многомерные, ассоциативные и числовые массивы — 12/04/2018 19:07
  • Типы переменных, область и имена переменных в PHP — 12/04/2018 19:06
  • Строки в PHP, strpos, strlen, конкатенация строк — 12/04/2018 19:05
  • Дата и время, получение, преобразование времени в PHP — 12/04/2018 19:03
  • Обзор синтаксиса, канонические теги, комментирование PHP-кода — 12/04/2018 19:02
  • Введение в PHP. Общее использование, характеристики PHP — 12/04/2018 19:01

Как обновить куки php?

Предположим нам нужно обновить значение куки. Т.е. название будет то же, но значение или срок действия надо изменить. В таком случае нам опять же понадобится функция setcookie.

Операция ничем не отличается от операции создания куков. Точно так же пишем похожий код, но с измененными данными:

1
2
3
4
5
6
7
8
9

<?php

$name=’wpguru’;//имя куки

$value=’hello world, ver. 2′;//значение куки

$expire=time()+60*60*24*7;//сколько будет кука работать (неделя в секундах)

setcookie($name,$value,$expire);//установили куку с нашими параметрами

 
 
?>

Теперь посмотрим, что содержится в браузере:

Как видите, обновление куки произошло успешно!

Формат и синтаксис cookie

Описание формата и синтаксиса cookie является пересказом изначальной спецификации Netscape Communications «Persistent Client State HTTP Cookies». В настоящий момент идет разработка более строгой спецификации для cookie. Итак, cookie является частью HTTP заголовка. Полное описание поля Set-Cookie HTTP заголовка:

 Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure

Минимальное описание поля Set-Cookie HTTP заголовка:

 Set-Cookie: NAME=VALUE;

NAME=VALUE — строка символов, исключая перевод строки, запятые и пробелы. NAME-имя cookie, VALUE — значение. Не допускается использование двоеточия, запятой и пробела.
expires=DATE — время хранения cookie, т.е. вместо DATE должна стоять дата в формате «expires=Monday, DD-Mon-YYYY HH:MM:SS GMT», после которой истекает время хранения cookie. Если этот атрибут не указан, то cookie хранится в течение одного сеанса, до закрытия броузера.
domain=DOMAIN_NAME — домен, для которого значение cookie действительно. Например, «domain=cit-forum.com». В этом случае значение cookie будет действительно и для домена cit-forum.com, и для www.cit-forum.com. Но не радуйтесь, указания двух последних периодов доменных имен хватает только для доменов иерархии «COM», «EDU», «NET», «ORG», «GOV», «MIL» и «INT». Для обсуждаемых сейчас новых семи доменов первого уровня («FIRM», «SHOP», «WEB», «ARTS», «REC», «INFO», «NOM»), вероятно, это условие сохранится. Для доменов иерархии «RU», например, придется указывать три периода.
Если этот атрибут опущен, то по умолчанию используется доменное имя сервера, на котором было задано значение cookie.
path=PATH — этот атрибут устанавливает подмножество документов, для которых действительно значение cookie. Например, указание «path=/win» приведет к тому, что значение cookie будет действительно для множества документов в директории /win/, в директории /wings/ и файлов в текущей директории с именами типа wind.html и windows.shtml. Для того, чтобы cookie отсылались при каждом запросе к серверу, необходимо указать корневой каталог сервера, например, «path=/».
Если этот атрибут не указан, то значение cookie распространяется только на документы в той же директории, что и документ, в котором было установлено значение cookie.
secure — если стоит этот маркер, то информация cookie пересылается только через HTTPS (HTTP с использованием SSL — Secure Socket Level), в защищенном режиме. Если этот маркер не указан, то информация пересылается обычным способом.

Installation

NPM

The npm package has a field pointing to an ES module variant of the library, mainly to provide support for ES module aware bundlers, whereas its field points to an UMD module for full backward compatibility.

Direct download

Starting with version 3 releases are distributed with two variants of this library, an ES module as well as an UMD module.

Note the different extensions: denotes the ES module, whereas is the UMD one.

Example for how to load the ES module in a browser:

<script type="module" src="/path/to/js.cookie.mjs"></script>
<script type="module">
  import Cookies from '/path/to/js.cookie.mjs'

  Cookies.set('foo', 'bar')
</script>

Not all browsers support ES modules natively yet. For this reason the npm package/release provides both the ES and UMD module variant and you may want to include the ES module along with the UMD fallback to account for this:

<script type="module" src="/path/to/js.cookie.mjs"></script>
<script nomodule defer src="/path/to/js.cookie.js"></script>

Here we’re loading the nomodule script in a deferred fashion, because ES modules are deferred by default. This may not be strictly necessary depending on how you’re using the library.

CDN

UMD:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js"></script>

ES module:

<script
  type="module"
  src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.mjs"
></script>

httpOnly

This option has nothing to do with JavaScript, but we have to mention it for completeness.

The web-server uses header to set a cookie. And it may set the option.

This option forbids any JavaScript access to the cookie. We can’t see such cookie or manipulate it using .

That’s used as a precaution measure, to protect from certain attacks when a hacker injects his own JavaScript code into a page and waits for a user to visit that page. That shouldn’t be possible at all, a hacker should not be able to inject their code into our site, but there may be bugs that let hackers do it.

Normally, if such thing happens, and a user visits a web-page with hacker’s JavaScript code, then that code executes and gains access to with user cookies containing authentication information. That’s bad.

But if a cookie is , then doesn’t see it, so it is protected.

Как удалить куку php?

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

1 setcookie(‘wpguru’,»,time()-4444);

Теперь кука удалится!

Одно важное замечание, о котором никто не говорит. Когда я только начинал изучать программирование, я удалил куку этим способом

Зашел в браузер — кука осталась. Перерыл все форумы — такая проблема часто встречается, но все отвечают мол: «Хм, не знаю, у меня работает». А причина вот в чем — кука удаляется, но не из файлов пользователя. Там она остается. И открывая браузер, Вы ее видите, но если мы обратимся к ней посредством $_COOKIE, то в результате будет 0. Вот так можно легко проверить, удалена ли кука.

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

Так что ждите.

До скорых встреч!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector