Prośba o ocenę sposobu logowania

Prośba o ocenę sposobu logowania
JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0

Witam szanowne forum i zwracam się z pytaniem, co Państwo myślą o takim sposobie logowania?

https://infinityhost.ct8.pl/loin.html - login "a" , haslo "a"

Kopiuj

<body onLoad="fetch('https://infinityhost.ct8.pl/loin.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({login:prompt('Podajlogin:')})}).then(response=>response.text()).then(data=>{document.write(data);document.close();}).catch(error=>console.error('Wystapil blad:',error));">
Kopiuj
<?php
// Pobranie surowych danych JSON
$jsonInput = file_get_contents('php://input');

// Zamiana danych JSON na obiekt PHP
$data = json_decode($jsonInput);

// Sprawdzenie wyniku
if (json_last_error() === JSON_ERROR_NONE) {
   
  
  
  if(isset($data->login)){
  if($data->login=='a'){
    
    
        $ses = 12212; //zmienna do potencjalnego wykorzystania - obecnie unused
        
       
        $response = "<body onLoad=\"fetch('https://infinityhost.ct8.pl/loin.php', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ haslo: prompt('Podaj haslo:'), id: $ses })
        })
        .then(response => response.text())
        .then(data => { document.write(data); document.close(); })
        .catch(error => console.error('Wystąpił błąd:', error));\"></body>";
        
        echo $response;die();}else{echo "nima zabko takiego logina! :(";die();}}
  
  
  if(isset($data->haslo)){
  if($data->haslo=='a'){
    
    

        
       
        $response = $content = file_get_contents("loin.txt");
        
        echo $response;die();}else{echo "nima zabko takiego hasla! :(";die();}}
  
  
  
} else {
    echo "Błąd dekodowania JSON: " . json_last_error_msg();
}

?>

screenshot-20241120195002.png
screenshot-20241120195026.png

screenshot-20241120195102.png


edytowany 1x, ostatnio: johnny_Be_good
Manna5
Czemu taki długi kod wepchnięty w atrybut onload? Nie lepiej dać w skrypcie document.body.onload = function () { /*...*/ }; i tam cały ten kod, wraz z wcięciami?
JB
@Manna5: jak się stanę przewidywalny to będę skończony w tej branży
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
1

Ale co to niby jest? Po co to jest? Dlaczego tak głupio?

JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
piotrpo napisał(a):

Ale co to niby jest? Po co to jest? Dlaczego tak głupio?

Po co logowanie? Nie wiem. Umiem to robię.


Zobacz pozostałe 3 komentarze
RequiredNickname
@johnny_Be_good: no niestety nie do końca. Po profilu widzę, że masz 44 lata a to implikuje, że masz dosyć staromodne spojrzenie na to jak dziś wygląda profesjonalne programowanie, jakie są dobre praktyki a co w świetle lat uznano za dark patterns. Nie dziwi mnie to bo wiem, że ciężko móc poświęcić tyle czasu na research i książki branżowe co będąc młodym.
JB
@RequiredNickname: setki wycieków danych z serwerów mówią same za siebie. Mi akurat nic nie wyciekło. Taka różnica między mną a "dobrymi praktykami" 🤣🤣🤣 chyba codziennie sprzedajecie czyjeś dane, mylę się?
RA
Sprzedajemy się
RodionGork
  • Rejestracja:4 miesiące
  • Ostatnio:3 miesiące
  • Postów:47
0

Wygłąda dziwnie :) co konkretnie rozuzmiesz pod "sposobom logowania? Jawaskript i Prompty?

Możes wrocić 401 i masz dialog logowania zadarmo


JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
RodionGork napisał(a):

Wygłąda dziwnie :) co konkretnie rozuzmiesz pod "sposobom logowania? Jawaskript i Prompty?

Możes wrocić 401 i masz dialog logowania zadarmo

No właśnie ja pytam, co to jest? Jest coś w JS i coś pod maską. Hasła to staromodne rozwiązania ale tutaj sprawdzam czy nie można im nadać trochę sznytu


piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

jeżeli to nie podpucha, to informowanie atakującego o tym, czy konkretny login istnieje, czy nie jest niepotrzebne i szkodliwe w przypadku ataku. Drugie primo, to trzymasz hasła otwartym tekstem.

JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
piotrpo napisał(a):

jeżeli to nie podpucha, to informowanie atakującego o tym, czy konkretny login istnieje, czy nie jest niepotrzebne i szkodliwe w przypadku ataku. Drugie primo, to trzymasz hasła otwartym tekstem.

A tak ogólnie fetch() owanie danych i przepuszczanie ich po spełnieniu określonych warunków? To jest demontracja pewnego sposobu myślenia jedynie, gdzie nie wykorzystywany jest standardowy formularz.


RodionGork
  • Rejestracja:4 miesiące
  • Ostatnio:3 miesiące
  • Postów:47
0

Musisz sprawdzić hasło oraz imię jednoczęśnie, Twój waryant pozwala wysłanie tylko hasła...

Co do 401, sprobuj:

Kopiuj
<?php

header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="my realm"');
echo "Please provide username and password";

P.S. nijakiego JS w logowaniu dopóki nie wiesz co robisz!


JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
RodionGork napisał(a):

Musisz sprawdzić hasło oraz imię jednoczęśnie, Twój waryant pozwala wysłanie tylko hasła...

Co do 401, sprobuj:

Kopiuj
<?php

..
echo "Please provide username and password";

P.S. nijakiego JS w logowaniu dopóki nie wiesz co robisz!

Czemu jednocześnie?


piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

Dobra, a właściwie na czym się opiera ta twoja idea uwierzytelniania użytkownika? Zwyczajnie nie wiem o co pytasz i ocenę której części tego co rzuciłeś chcesz.

JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
piotrpo napisał(a):

Dobra, a właściwie na czym się opiera ta twoja idea uwierzytelniania użytkownika? Zwyczajnie nie wiem o co pytasz i ocenę której części tego co rzuciłeś chcesz.

O całokształt. Takich logowań często się chyba nie widzi. Ja nie widziałem nigdzie. Od strony technicznej w OS są keylogery. Potem skan ekranu komputera. Potem informacja idzie przez sieć (mamy http i https). Dochodzi do serwera. Wraca.

Fetch() może zwrócić ciało funkcji, mamy eval() , może zwrócić obiekt, mamy obiekt window, mamy techniki jak blob(). Można żonglować identyfikatorami. Jest cały ogrom narzędzi do wykorzystania. To co pokazałem to jest pierwszy krok.

To jest całkiem ciekawy temat.


KE
Ty to jesteś całkiem ciekawy człowiek.
JB
@kelog: miałem pisać o stosie przeglądarki ale odpuściłem (bo prompt gdzieś jest uruchamiany)
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

To jest całkiem ciekawy i złożony temat. Tylko co nowego do tego tematu wnosi twoje rozwiązanie? Tak jak pisałem wyżej, podstawowy problem z punktu widzenia bezpieczeństwa, to ujawnianie faktu istnienia, bądź nie użytkownika. Drugi problem, który potencjalnie widzę, to przechowywanie kawałka logowania w postaci sesji, co ma przynajmniej 2 skutki. Atakujący może pootwierać sobie ileś tych sesji, co potencjalnie jest jakąś drogą ułatwiającą atak DDOS. Drugi problem, to mocno utrudnione rozproszenie backendu na kilka instancji.
Kolejny problem, to nie przestrzeganie standardowych kodów http. Masz standardowe odpowiedzi 401 i 403, odpowiednio dla nie uwieżytelnionych i nie autoryzowanych requestów.

Kolejny problem to architektura (i wybacz mój brak znajomości PHP). Załóżmy, że użytkownik przeszedł ścieżkę authentication/authorization, otwiera mu się jakaś tam stronka, na stronce jest parę dodatkowych zakładek, linków itd. W jaki sposób chcesz przekazać w następnym żądaniu informację o tożsamości użytkownika? Co jeżeli to żądanie trafi do innej instancji serwisu?

JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
piotrpo napisał(a):

To jest całkiem ciekawy i złożony temat. Tylko co nowego do tego tematu wnosi twoje rozwiązanie? Tak jak pisałem wyżej, podstawowy problem z punktu widzenia bezpieczeństwa, to ujawnianie faktu istnienia, bądź nie użytkownika. Drugi problem, który potencjalnie widzę, to przechowywanie kawałka logowania w postaci sesji, co ma przynajmniej 2 skutki. Atakujący może pootwierać sobie ileś tych sesji, co potencjalnie jest jakąś drogą ułatwiającą atak DDOS. Drugi problem, to mocno utrudnione rozproszenie backendu na kilka instancji.
Kolejny problem, to nie przestrzeganie standardowych kodów http. Masz standardowe odpowiedzi 401 i 403, odpowiednio dla nie uwieżytelnionych i nie autoryzowanych requestów.

Kolejny problem to architektura (i wybacz mój brak znajomości PHP). Załóżmy, że użytkownik przeszedł ścieżkę authentication/authorization, otwiera mu się jakaś tam stronka, na stronce jest parę dodatkowych zakładek, linków itd. W jaki sposób chcesz przekazać w następnym żądaniu informację o tożsamości użytkownika? Co jeżeli to żądanie trafi do innej instancji serwisu?

  1. Osoba nie zalogowana nie zobaczy prawie nic - 0 informacji, znaczy że nie będzie miała jakiegokolwiek punktu zaczepienia, prawie nic się nie dowie o twórcy.
  2. "fakt istnienia, bądź nie użytkownika" - to jest banał , czy ja napisałem, że kod może nie przepuścić błędnego logowania?
  3. "W jaki sposób chcesz przekazać w następnym żądaniu informację o tożsamości użytkownika"- zwracany jest kolejny fetch() z np. danymi sesji - to można zrobić na milion sposobów
  4. "Atakujący może pootwierać sobie ileś tych sesji" - a normalnie nie może? Tylko przy takim sposobie masz 2 x więcej ruchów niż poprzednio (gdzie miałeś 1)
  5. "Tylko co nowego do tego tematu wnosi twoje rozwiązanie" - to , że np Ty pokazałeś jak mało masz wyobraźni. I jesteś ten najodważniejszy. To co myśleć o reszcie?

Poza tym użycie js wymaga zwykle przeglądarki.

Ale może się mylę.


RequiredNickname
Js bynajmniej nie wymaga przeglądarki sam w sobie więc się mylisz ;)
JB
@RequiredNickname: są narzędzia wiem. Ale mówimy o odsianiu 70% osób.
JB
@RequiredNickname: z drugiej strony, jeśli serwer zażąda odpowiedzi wygenerowanej przez ECMAScript 2024 to też te narzędzia dadzą radę?
JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0


RequiredNickname
Lol serio trzymasz „projekty” na chomikuj? XD
opiszon
Projektu na chomikuj powinny być podane w chomiku...
GO
  • Rejestracja:11 miesięcy
  • Ostatnio:4 miesiące
  • Postów:358
0

Ale twój kod nie wymaga podawania loginu sprawdzasz tylko hasło.
W ogóle ten kod działa tak, że robisz GET wchodząc na stronę pobierasz podstawowy index.html, tam masz javascript code, którym robisz fetch do serwera i podajesz json login:a, w php jest sprawdzane czy jest login, a potem czy jest równy 'a' i zwracasz nowy kod html, który zwrócony z fetch zapisujesz na stronie.

Teraz drugi fetch robi do tej samej podstrony serwera, ale tym razem json ma zawartość hasło i hasło 'a', i teraz zwraca loin.txt.

Teraz tak w php masz napisane tak, że sprawdzasz czy jest json login jeśli nie to sprawdzasz czy jest json haslo, to oznacza, że nie potrzeba w ogóle podawać loginu można od razu podać same hasło i tylko hasło jest potrzebne do otrzymania wyniku: curl -i -X POST https://infinityhost.ct8.pl/loin.php -H "Content-Type: application/json" -d "{\"haslo\":\"a\"}"

Teraz z innej strony, nie zabezpieczyłeś od strony apache httpd servera, żeby nie było dostępu i plik https://infinityhost.ct8.pl/loin.txt
Jest dostępny dla każdego bez podania hasła.

Trzecia sprawa, to nie ma sesji żadnych, czyli nie wiesz czy ta osoba co weszła to ona jest zalogowana i każde jej zapytanie jest uznawane jako niezalogowana osoba, nie ma żadnej sesji użykownika.
Teraz jak ktoś kliknie coś na tej wyświetlonej twojej stronie to będzie zaraz komunikat, że jest niezalogowany.

To, że wystarczy hasło i że nie ma sesji to parę osób wyżej napisało także, ja też to zauważyłem, ale spróbowałem prościej wytłumaczyć o co chodzi.

Ostatni trick.
Wchodzisz na swoją stronę, teraz w developer console F12 wpisujesz fetch("https://infinityhost.ct8.pl/loin.txt").then(response=>response.text()).then(data=>document.write(data)) i wyświetlasz zawartość strony, która podobno jest zabezpieczona hasłem i loginem, ale tak na niby.

edytowany 2x, ostatnio: .GodOfCode.
JB
Ale uruchamiając prompt masz związane ręce.
JB
Twierdzisz, że to nie ma sensu?
JB
jeśli nie potrzeba loginu, to czemu jak się go nie poda nie przepuszcza? :|
JB
sesji znaczy meta-danych tak?
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
3
johnny_Be_good napisał(a):
Kopiuj
$ses = 12212; //zmienna do potencjalnego wykorzystania - obecnie unused
        

Mam taką sprawę, pracuję teraz nad pewnym projektem i przydałaby mi się taka zmienna, a u Ciebie widzę, że stoi sobie nieużywana?
Mógłbyś mi ją przekazać, ew pożyczyć?


jeden i pół terabajta powinno wystarczyć każdemu
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

@jarekr000000 Ta zmienna nie jest unused, ona jak najbardziej jest used. To id sesji jest.

Zobacz pozostały 1 komentarz
GO
Przypomina mi się php lata temu, gdzie na jednym serwerze było wiele serwerów i jak w jednym zmieniłeś to zmieniało się na innych, eh teraz nie wiem czy to dalej istnieje, ale używałem tego namiętnie po tym jak mi ktoś to wytłumaczył jak to działa za młodu. Gdzie trzeba było założyć konto na tym samym serwerze co orginalny i podmienić sesje dać admina, potem na danej stronie sobie skopiować sesje, albo odwrotnie. Pewnie to jakoś załatali.
KE
Widzisz @jarekr000000, nie tylko w Springu należy czytać kod w stringach xD
GO
@kelog skąd weźmiesz stringi, żeby móc czytać taki kod?
KE
Nie wiem, ale muszą być ultra ciasne, żeby ból w kroczu zagłuszył ból czytania tego kodu.
overcq
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 3 godziny
  • Postów:370
0

Ten sposób logowania to jest tylko element innego podejścia do przeglądania sieci. Mianowicie podejścia terminalowego w przeglądarce ‘www’. Masz jakieś dane wprowadzane przez zdalnego użytkownika (tymi danymi może być nie tylko klawiatura, ale i wskaźnik myszy) i wypisujesz mu zawartość okna. To jest kosztowne ze względu na przesył danych, brak możliwości przechowywania statycznych danych, które się powtarzają. A ciekawe, że tym ‚terminalem’ jest w pełni graficzna zawartość okna przeglądarki.


Nie znam się, ale się wypowiem.
Wizytówka
joh­nny_Be_go­od jest mistrzem ‘eskejpowania’ i osadzania.
JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0

Ogólnie doszedłem do wniosku, że to jest właśnie ten poprawny standardowy sposób wprowadzania hasła w przeglądarkach. Że tak to zostało przemyślane i wszystkie inne są błędne.
tylko if'y należy dodać , żeby w localstorage przechowywało dane a po zalogowaniu usuwało. Coś w tym stylu. Plus operowanie na czasie i parę innych zmiennych środowiskowych. To jest chyba dobra droga.


overcq
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 3 godziny
  • Postów:370
0
johnny_Be_good napisał(a):

Ogólnie doszedłem do wniosku, że to jest właśnie ten poprawny standardowy sposób wprowadzania hasła w przeglądarkach. Że tak to zostało przemyślane i wszystkie inne są błędne.

Dlaczego jedyny poprawny?
Wprowadzasz tutaj dane przez prompt(), który jest oknem wyskakującym takim jak alert(), który to ostatni bywa przez przeglądarki blokowany. Równie dobrze mógłbyś utworzyć na stronie formularz logowania. Ale przecież nie o to chodzi, czego się użyje, ale o sposób komunikacji: kod ‘html’ jest nieznany i krok po kroku jest przesyłany.

tylko if'y należy dodać , żeby w localstorage przechowywało dane a po zalogowaniu usuwało. Coś w tym stylu. Plus operowanie na czasie i parę innych zmiennych środowiskowych. To jest chyba dobra droga.

Skoro zawartość strony jest przesyłana w odpowiedzi na interakcję użytkownika, to możesz wykorzystać wszystkie możliwości programowania aplikacji ‘www’.


Nie znam się, ale się wypowiem.
Wizytówka
joh­nny_Be_go­od jest mistrzem ‘eskejpowania’ i osadzania.
JB
Da się zablokować prompt? A faktycznie chyba widziałem. Ale jeśli kod jest pobierany z eval(data z fetch( prompt("",data.kod))) ?
overcq
Przeglądarka może blokować jakąkolwiek procedurę bez względu na źródło jej wywołania. Na razie wiem tylko tyle, że prompt() i inne są blokowane przez Chrome w iframe typu ‘cross‐origin’.
JB
znaczy obsługuję if'y.
JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0

Ile ISP od GSM zarobi na takim logowaniu?


piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:3277
0

To nie jest ten poprawny standardowy sposób z przeglądarki. Standardowo, najczęściej nie musisz nic pisać, żeby to uwierzytelanianie mieć.
Chyba każda przeglądarka i każdy serwer http obsługują ten flow:
screenshot-20241121193650.png

JB
Od czego odwracasz uwagę?
JB
  • Rejestracja:około 2 lata
  • Ostatnio:5 dni
  • Lokalizacja:Holandia
  • Postów:843
0
.GodOfCode. napisał(a):

Ale twój kod nie wymaga podawania loginu sprawdzasz tylko hasło.
W ogóle ten kod działa tak, że robisz GET wchodząc na stronę pobierasz podstawowy index.html, tam masz javascript code, którym robisz fetch do serwera i podajesz json login:a, w php jest sprawdzane czy jest login, a potem czy jest równy 'a' i zwracasz nowy kod html, który zwrócony z fetch zapisujesz na stronie.

...

Wchodzisz na swoją stronę, teraz w developer console F12 wpisujesz fetch("https://infinityhost.ct8.pl/loin.txt").then(response=>response.text()).then(data=>document.write(data)) i wyświetlasz zawartość strony, która podobno jest zabezpieczona hasłem i loginem, ale tak na niby.

Ok, zrobię drugi taki, tylko bez podanego kodu a Ty go rozszarpiesz i powiesz mi jak to zrobiłeś?


Zobacz pozostałe 3 komentarze
JB
Tak Cię nauczyli?
GO
Nikt mnie nie uczył nie było wtedy chatGPT sam podsumowywałem wiedzę, sesje i jwt token to takie podstawowe rzeczy do tworzenia systemów, które po zalogowaniu wiedzą, że jesteś zalogowany, bo jak nie dasz sesji to nie wiesz czy ktoś był zalogowany musisz te dane umieścić u clienta, http cookie, albo token i w javascript ten token gdzieś przechowujesz w local storage. Żeby przy następnym requeście do serwera powiedzieć tu mój token, ja już się logowałem, serwer patrzy na podpisz danych i mówi tak jesteś zalogowany i nie musisz hasła podawać.
JB
@.GodOfCode.: "PHP działa głównie na najwyższych warstwach modelu OSI: aplikacji (7), prezentacji (6), i sesji (5), z niewielkim dostępem do warstw transportowej (4) i sieciowej (3). Nie ma dostępu do warstw łącza danych (2) i fizycznej (1). Wszystko poniżej warstwy aplikacji jest zazwyczaj zarządzane przez serwer i system operacyjny, na którym działa PHP."
GO
ChatGPT ci to napisał? wiesz, że jestem jedną z osób, która serio zna całe OSI i implementowała na wszystkich warstwach. No tak php działa wysoko, to tylko engine template, czyli możesz kod c++ napisać dać php znaczniki puścić to przez php i ci wygeneruje kod. Ja to wiem wszystko :>
GO
php to nawet nie serwer, apache uruchamia php, ten renderuje plik i apache go zwraca użytkownikowi. To taki template engine, chodź może inna nazwa była by adekwatniejsza bo może generować dowolny kod.
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 10 godzin
  • Postów:3457
0

Jeśli chodzi o ocenę to jest jakieś 2-.
Nie pała.
Johnny, weź sobie kod opensource dostępny dla Laravel czy Symfony. Popatrz jak to wygląda, przeanalizuj i wtedy spróbuj napisać sam.

GO
  • Rejestracja:11 miesięcy
  • Ostatnio:4 miesiące
  • Postów:358
0
jurek1980 napisał(a):

Jeśli chodzi o ocenę to jest jakieś 2-.
Nie pała.

1 by było za samo logowanie, ale z efektami graficznymi jest wyższa ocena :>

Przeanalizowałem sobie działanie na stronie, która się potem wyświetla i fajne efekty.
Animacje przesuwania obiektu diagonalnie od lewej do prawej strony ekranu.
Animacja przejścia gradientu od jednego do drugiego koloru i powrót.

Potem generowanie losowych pozycji i ustawianiu elementu tam, nadawanie im tej animacji przejścia i handlera eventu, po zakończeniu animacji do usunięcia.

Też fade in, czyli przejścia opacitiy tekstu od przezroczystego do widzialnego.

Ładny efekt, ręcznie pewnie 20min roboty, chodź z innymi narzędziami wykorzystywanymi pewnie krócej.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)