-
1. Data: 2017-03-27 19:02:03
Temat: popaprany JS
Od: Roman Tyczka <n...@b...no>
Próbuję przekonwertować kawałek kodu z JS na delphi, ale poziom zakręcenia
mnie przerósł, proszę o pomoc w wyjaśnieniu ludzkim językiem co tu się
dzieje:
function(e, s, i)
{
var n, a, o = "",
l = t.isArray(e),
r = 0;
for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
e.charAt(r++));
return o
}
Jako, że JS ma typowanie między pośladkami to typy wejściowe odgaduje z
szerszego kontekstu, którego tu nie umieszczam by nie mącić, jako:
e - chyba tablica, w każdym razie wynik funkcji z jQuery
this.ui.maskedInput.serializeArray()
s - to string z maską złożoną ze znaków + i *
// "mask": "+++*+*+***++++++++++++++++++++++"
i - to sól w łanćuchu tekstowym
// "salt": "rDUrqpBMmlNGJQgk87uKCUGMlK4dU51R",
Całość to kawałek formularza logowania, a konkretnie wyliczania hasha z
hasła.
Proszę szczególnie o rozwikłanie tej pętli, czyli konkretnie tego:
"+" === s.charAt(n) ? o += i.charAt(n) : "*" === s.charAt(n) && (o += l ?
e[r++].value : e.charAt(r++));
To koszmarek jakiś :-)
--
pozdrawiam
Roman Tyczka
-
2. Data: 2017-03-27 20:42:41
Temat: Re: popaprany JS
Od: bartekltg <b...@g...com>
On 27.03.2017 19:02, Roman Tyczka wrote:
>
> Próbuję przekonwertować kawałek kodu z JS na delphi, ale poziom zakręcenia
> mnie przerósł, proszę o pomoc w wyjaśnieniu ludzkim językiem co tu się
> dzieje:
>
>
> function(e, s, i)
> {
> var n, a, o = "",
> l = t.isArray(e),
> r = 0;
> for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
> i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
> e.charAt(r++));
> return o
> }
>
> Jako, że JS ma typowanie między pośladkami to typy wejściowe odgaduje z
> szerszego kontekstu, którego tu nie umieszczam by nie mącić, jako:
>
> e - chyba tablica, w każdym razie wynik funkcji z jQuery
> this.ui.maskedInput.serializeArray()
>
> s - to string z maską złożoną ze znaków + i *
> // "mask": "+++*+*+***++++++++++++++++++++++"
>
> i - to sól w łanćuchu tekstowym
> // "salt": "rDUrqpBMmlNGJQgk87uKCUGMlK4dU51R",
>
>
> Całość to kawałek formularza logowania, a konkretnie wyliczania hasha z
> hasła.
>
> Proszę szczególnie o rozwikłanie tej pętli, czyli konkretnie tego:
>
> "+" === s.charAt(n) ? o += i.charAt(n) : "*" === s.charAt(n) && (o += l ?
> e[r++].value : e.charAt(r++));
>
> To koszmarek jakiś :-)
Jeśli to dobrze rozumiem, to genialny przykład "chackerstwa" (tak, ch;))
"+" === s.charAt(n) ? o += i.charAt(n)
Na razie prosto. Operator trójargumentowy ?: jak w c++.
Czy n-ta (kto normalny iteruje po n, czyję się zgorszony!:)
literaka s to "+"
(porównujemy ===, bo == jest miękkie :)
https://dorey.github.io/JavaScript-Equality-Table/ )
Jeśli tak, to dodajemy literkę na koniec o,
o += i.charAt(n)
(nie wynika nic z tego, co jest po :)
jeśli nie, to (co innego, o tym poźniej).
Zawsze używałem ?: w formie
x = b?a:b;
a tu jety użyte po prostu jako if(b) a() : b();
Poza zmyleniem przeciwnika chyba nie ma nic w tym złego:)
Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
wykona się to:
"*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))
Nieco rozszerzając:
"*" === s.charAt(n)
&&
(o += l ? e[r++].value : e.charAt(r++))
Sztuczka polega na tym, że to wyrażenie wylicza
się do boola. Jeśli s[n] to '*', zadziała
leniwa ewaluacja i nawias się nie wykona.
Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
nawiasowanie):
o += ( l ? e[r++].value : e.charAt(r++))
l oznaczało "e jest tablicą" (od typu 't'?).
tutaj wołaczamy wiec do o to, co ejst pod 'e'
na r-tym miejscu, tylko w zalezności od tego
jakiego typu jest e, różnie się to tej literki
dobieramy. Ot, takie bieda templejty ;-)
Nawet w JS nalezałoby tu raczej zrobić tego ifa
na poczatku lub jakoś inaczej opokować to wyciąganie.
Ostatecznie strzelałbym, że to znaczy(to nie JS:)
if ("+"== s.charAt(n))
o += i.charAt(n);
else if ('*' ~= a.charAt(n) )
o+ = (l ? e[r++].value : e.charAt(r++) );
A, drobna uwaga, nie znam JS ;-)
pzdr
bartekltg
-
3. Data: 2017-03-27 22:39:07
Temat: Re: popaprany JS
Od: Andyy <n...@s...tego>
W dniu 27.03.2017 o 20:42, bartekltg pisze:
> if ("+"== s.charAt(n))
Ja preferuję styl
if (s.charAt(n) == "+")
podobnie "x jest większy od 5", "x równa się 5" a nie "5 mniejsze od x",
"5 równa się x"
-
4. Data: 2017-03-27 22:52:19
Temat: Re: popaprany JS
Od: bartekltg <b...@g...com>
On 27.03.2017 22:39, Andyy wrote:
> W dniu 27.03.2017 o 20:42, bartekltg pisze:
>> if ("+"== s.charAt(n))
>
> Ja preferuję styl
> if (s.charAt(n) == "+")
Ja też:)
> podobnie "x jest większy od 5", "x równa się 5" a nie "5 mniejsze od x",
> "5 równa się x"
Wertsja odwrotna jest mniej czytelna, ale automatycznie wyłapuje
zamianę == na =.
W C czy c++ ma to jakiś sens. Dlaczego użył tego w JS, gdzie
można by sie spodziewać pomyłki pomiędzy === a == ("słabsze"
porównanie), której to ta zamiana nie wychwyci, cięzko powiedzieć ;-)
pzdr
bartekltg
-
5. Data: 2017-03-28 01:33:53
Temat: Re: popaprany JS
Od: bartekltg <b...@g...com>
On 27.03.2017 20:42, bartekltg wrote:
> Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
> wykona się to:
>
> "*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))
>
> Nieco rozszerzając:
>
> "*" === s.charAt(n)
> &&
> (o += l ? e[r++].value : e.charAt(r++))
>
> Sztuczka polega na tym, że to wyrażenie wylicza
> się do boola. Jeśli s[n] to '*', zadziała
> leniwa ewaluacja i nawias się nie wykona.
Wyciagnę samą sztuczkę, bo piękna ;-)
r=0;
for (n = 0, a = s.length; n < a; n += 1)
"+" === s[n] ? o += i.[n] : "*" === s[n] && o += e[r++];
pzdr
bartekltg
-
6. Data: 2017-03-28 09:58:30
Temat: Re: popaprany JS
Od: Roman Tyczka <n...@b...no>
On Mon, 27 Mar 2017 20:42:41 +0200, bartekltg wrote:
>> function(e, s, i)
>> {
>> var n, a, o = "",
>> l = t.isArray(e),
>> r = 0;
>> for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
>> i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
>> e.charAt(r++));
>> return o
>> }
> Jeśli to dobrze rozumiem, to genialny przykład "chackerstwa" (tak, ch;))
Być może to wynik pracy jakiegoś obfuscatora, udany wynik jak widać.
> "+" === s.charAt(n) ? o += i.charAt(n)
>
> Na razie prosto. Operator trójargumentowy ?: jak w c++.
>
> Czy n-ta (kto normalny iteruje po n, czyję się zgorszony!:)
> literaka s to "+"
> (porównujemy ===, bo == jest miękkie :)
>
> Jeśli tak, to dodajemy literkę na koniec o,
> o += i.charAt(n)
> (nie wynika nic z tego, co jest po :)
> jeśli nie, to (co innego, o tym poźniej).
>
> Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
> wykona się to:
>
> "*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))
>
> Nieco rozszerzając:
>
> "*" === s.charAt(n)
> &&
> (o += l ? e[r++].value : e.charAt(r++))
>
> Sztuczka polega na tym, że to wyrażenie wylicza
> się do boola. Jeśli s[n] to '*', zadziała
> leniwa ewaluacja i nawias się nie wykona.
> Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
> nawiasowanie):
Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?
[...]
> Ostatecznie strzelałbym, że to znaczy(to nie JS:)
>
> if ("+"== s.charAt(n))
> o += i.charAt(n);
> else if ('*' ~= a.charAt(n) )
> o+ = (l ? e[r++].value : e.charAt(r++) );
~= oznacza różny?
Jeśli tak to warunek byłby dziwny:
jeśli n-ty znak jest + to zrób to,
w przeciwnym wypadku, jeśli n-ty znak jest różny od * (czyli znów równy +)
to zrób tamto.
I chyba literówka, nie a.charAt(n) tylko s.charAt(n).
> A, drobna uwaga, nie znam JS ;-)
Tak czy owak wielkie dzięki za pochylenie się nad tym ścierwem, dużo mi
pomogłeś :-)
--
pozdrawiam
Roman Tyczka
-
7. Data: 2017-03-28 12:04:08
Temat: Re: popaprany JS
Od: bartekltg <b...@g...com>
On 28.03.2017 09:58, Roman Tyczka wrote:
>> "*" === s.charAt(n)
>> &&
>> (o += l ? e[r++].value : e.charAt(r++))
>>
>> Sztuczka polega na tym, że to wyrażenie wylicza
>> się do boola. Jeśli s[n] to '*', zadziała
>> leniwa ewaluacja i nawias się nie wykona.
>> Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
>> nawiasowanie):
> Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?
Rzeczywisćei, odwrotnie.
Jak jest czym inym, to iloczyn musi być fałszywy
i nie odpala drugiego nawiasu.
> [...]
>
>> Ostatecznie strzelałbym, że to znaczy(to nie JS:)
>>
>> if ("+"== s.charAt(n))
>> o += i.charAt(n);
>> else if ('*' ~= a.charAt(n) )
>> o+ = (l ? e[r++].value : e.charAt(r++) );
> ~= oznacza różny?
!=
pzdr
bartekltg
-
8. Data: 2017-03-28 16:56:39
Temat: Re: popaprany JS
Od: Roman Tyczka <n...@b...no>
On Tue, 28 Mar 2017 12:04:08 +0200, bartekltg wrote:
>>> "*" === s.charAt(n)
>>> &&
>>> (o += l ? e[r++].value : e.charAt(r++))
>>>
>>> Sztuczka polega na tym, że to wyrażenie wylicza
>>> się do boola. Jeśli s[n] to '*', zadziała
>>> leniwa ewaluacja i nawias się nie wykona.
>>> Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
>>> nawiasowanie):
>> Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?
>
> Rzeczywisćei, odwrotnie.
> Jak jest czym inym, to iloczyn musi być fałszywy
> i nie odpala drugiego nawiasu.
No właśnie, a ma odpalać.
>> [...]
>>
>>> Ostatecznie strzelałbym, że to znaczy(to nie JS:)
>>>
>>> if ("+"== s.charAt(n))
>>> o += i.charAt(n);
>>> else if ('*' ~= a.charAt(n) )
>>> o+ = (l ? e[r++].value : e.charAt(r++) );
>> ~= oznacza różny?
>
> !=
I to jest błąd, powinno być = :-)
W każdym razie przebrnąłem i poszło, dzięki za wsparcie!
--
pozdrawiam
Roman Tyczka