Kod, który zostanie wykonany tylko raz

223

Cel

Celem tego wyzwania jest napisanie kodu, który wykona się tylko raz. Oznacza to w zasadzie, że w jakiś sposób uszkadza program, skrypt lub środowisko. Ponowne uruchomienie systemu pozwala na ponowne uruchomienie kodu, co jest dozwolone.

Punktacja

Liczba głosów Wszystkie założenia muszą być wyraźnie wymienione. Wszelkie odpowiedzi inicjujące ponowne uruchomienie lub zatrzymanie zostaną zdyskwalifikowane.

Dodatkowe zasady, ponieważ Greg Hewgill jest półbogiem

Nie można uzyskać dostępu do katalogu głównego.

Data końcowa

Konkurs zakończy się 31 maja 2014 r.

Edytować

Ten konkurs został zmieniony na konkurs popularności.

ojblass
źródło
7
@PeterTaylor możliwym rozwiązaniem byłoby samodzielne usunięcie, ale wyniki pokazują, że nie jest to jedyne.
Lukei
101
Dla wielu osób dzwoniących viw jednym środowisku terminalowym ma taki efekt, nie ma przed nim ucieczki, chyba że uruchomisz się ponownie :) Żart tutaj.
orion
6
Witryna jest bezpłatna, aby zaproponować takie pytanie.
ojblass
16
echo "If you try to execute me again, it means you are an idiot.";<- Nikt nie wykona więcej niż raz: P
user3459110
25
Czy oprogramowanie związane z pociskami kwalifikuje się? ;)
rsegal

Odpowiedzi:

518

Czuwanie

Nareszcie przypadek użycia Czuwania!

def main():
  raise Exception()

Fragment „specyfikacji języka”:

Jest rzeczą oczywistą, że każda funkcja, która zgłasza wyjątek, który nie został złapany, jest błędna i musi zostać ukarana.

...

W przypadku złamania przysięgi funkcja naruszająca [...] zostanie należycie ukarana.

W jaki sposób?

Prosty: zostanie usunięty z twojego kodu źródłowego.

Jedyny sposób, aby upewnić się, że Twój program spełnia jego wymagania, aby absolutnie zabronić kodu, który tego nie robi. Z Vigil zrobi to za Ciebie automatycznie.

Istnieją inne sposoby, aby to zrobić, ponieważ Vigil zapewnia słowa kluczowe implorei swearktóre są w zasadzie przysięgi na przestrzeganie pewnych przed i po warunków:

def main():
  swear 0 > 1
Martin Ender
źródło
116
Bez wątpienia to zasługuje na zwycięstwo.
Matteo Italia
77
Wreszcie wystarczająco czujny język dla współczesnego wieku! Zacznę używać go w produkcji. Wszystkie błędy muszą zostać usunięte.
Claudiu
13
Wydaje mi się, że to niekoniecznie wina funkcji rzuca nieprzechwycony wyjątek, może też być tak, że funkcje na stosie wywołań są zaniedbywane, ponieważ nie można go złapać. Może to nawet sugerować, że architektura całej aplikacji jest wadliwa (ponieważ być może nie ma sposobu, aby poprawnie obsłużyć ten wyjątek bez zmiany kodu?) Krótko mówiąc, cały program powinien zostać usunięty.
Jonathan Pullano
10
@JonathanPullano nie jesteś pierwszym, który to zauważył ;)
Martin Ender
32
Dodatkowe punkty za przeklinanie. Program składający fałszywe oświadczenia bez wątpienia musi zostać wyeliminowany.
orion
293

Prawie każda dystrybucja Linuksa, 9 znaków

Ten jest klasykiem!

#!/bin/rm

Umieść to w pliku i uruchom:

> ed
a
#!/bin/rm
.
wq foo
> ls
Mail mbox foo
> chmod 777 foo
> ./foo
> ls
Mail mbox

Aa i już go nie ma!

Jeśli chodzi o to, co się dzieje: tak naprawdę po prostu biegam rm! #!nazywa się shebang . A jeśli umieścisz jedną z nich, a następnie ścieżkę do jakiegoś pliku wykonywalnego jako pierwszą linię w skrypcie, moduł ładujący program wykona plik skryptu z tym, co tam napisałeś - domyślnie jest to ( #!/bin/bashlub #!/bin/shpowłoka Bourne-ponownie shell / Bourne) . Pierwszym argumentem przekazanym do tego skryptu będzie sama nazwa pliku (dlatego widzisz tutaj tak wiele rozwiązań, w tym %0lub $0i podobnych); więc tworząc mój plik #!/bin/rmi uruchamiając go, wszystko, co robię, to przekazanie do niego nazwy pliku rm.

Flonk
źródło
9
Myślę, że nigdy nie korzystałem z Linuksa, ponieważ usuwa on plik skryptu.
tragiczny
56
@NateKerkhofs #!sekwencja rozpoczyna shebang, który identyfikuje interpretera, którego będziesz używać dla skryptu - normalnie /bin/bash. W tym przypadku Flonk był używany /bin/rmjako „tłumacz”. rmto program, który usuwa pliki. ponieważ Linux uważa, że ​​chcemy rmbyć tłumaczem, przekazuje nazwę pliku jako argument. dlatego plik sam się usuwa
19
To jest histeryczne
ojblass
25
@ user80551 Nie potrzebuję do tego dostępu do konta roota.
Flonk
9
hmm ..../foo mbox
Izkata
241

binarny x86, 4 bajty

F0 0F C7 C8

Założenie: Musi być uruchomiony na procesorze Pentium P5.

Powyższa instrukcja jest powszechnie znana jako błąd F00F . Próbuje wykonać niepoprawną instrukcję poprzedzoną blokadą .

Powoduje to całkowite zawieszenie procesora (ani zatrzymanie, ani ponowne uruchomienie) i nie wymaga nawet dostępu do roota.

Dennis
źródło
4
Wow ... to naprawdę interesujące.
ojblass
31
@JackM: Będzie, ale jest to wyraźnie dozwolone w pytaniu.
Dennis
34
@JackM, wydaje się to świetnym sposobem na zatrzymanie działania „skryptu”.
Paul Draper
5
Pamiętam, kiedy ten błąd robił obchód. Obejście jądra zostało prawie natychmiast znalezione - nie spowoduje awarii komputera, chyba że używasz systemu operacyjnego bez poprawki.
zwolnienie
3
@RosLuP 209 różnych użytkowników, najwyraźniej. Jeśli się nie zgadzasz, oddaj głos i przejdź dalej.
Dennis
150

Bash, 5

>"$0"

Obcina się do zerowej długości.

Jeśli nazwa pliku nie zawiera spacji, >$0działa dla 3 znaków !


źródło
2
W rzeczywistości cytaty nigdy nie są potrzebne dla zmiennej używanej w takiej nazwie pliku przekierowania, nawet jeśli program lub ścieżka do programu zawiera spacje, ze względu na specjalny przypadek w regułach parsowania powłoki. Więc zawsze możesz to zrobić w 3 znakach!
apenwarr
3
@apenwarr mówi „$ 0: niejednoznaczne przekierowanie”, gdy bez cudzysłowów, a nazwa pliku zawiera spacje
1
@apenwarr, jest potrzebne, jeśli powłoka interpretująca ten skrypt jest oparta na ksh88 lub bash nie jest w trybie posix. Nie chodzi o spację, chodzi o dowolny znak $IFSdla bash i symbole wieloznaczne dla bash i ksh88. Skrypt bez szarpania będzie zwykle interpretowany przez sh systemu, ale niektóre powłoki, w tym bash i ksh88, zinterpretują je w sobie.
sch
144

gzip

#!/bin/gzip

Zbyt irytujące osoby przyzwyczajone do nieniszczących narzędzi linii poleceń, gzip domyślnie rujnuje oryginalny plik, zastępując go wersją spakowaną gzip (dodanie sufiksu).

Jest to odmiana #!/bin/rmopcji, z wyjątkiem tego, że można ją odzyskać przez ręczną interwencję człowieka (połączeniegunzip ). Jako specjalny bonus wynikowy plik jest znacznie dłuższy niż oryginał (różnica zależy od długości nazwy pliku).

Ostrzeżenie: lokalizacja gzipmoże się różnić.

EDYCJA: jak wskazał WChargin, jest to bardziej przenośne:

#!/usr/bin/env gzip

Reszta pliku może mieć dowolną treść. Zasadniczo jest to plik, który po wywołaniu ukrywa się w pudełku i odmawia wyjścia, dopóki siłą go nie rozpakujesz.

orion
źródło
7
Nigdy o tym nie myślałem, ale masz całkowitą rację.
ojblass
bardzo interesujące
Grijesh Chauhan
11
„Uwaga: lokalizacja gzipmoże się różnić” - to nie jest golf golfowy , więc możesz użyć#!/usr/bin/env gzip
wchargin
37
+1 tylko dla It's essentially a file that, when called, hides itself in a box and refuses to come out until you forcibly unpack it.Ciebie stworzyło mój dzień, i jest 1 w nocy.
klaskać
Zasadniczo jest to plik, który po wywołaniu ukrywa się w pudełku i odmawia wyjścia, dopóki siłą go nie rozpakujesz. rozśmieszyło mnie. : D
Mischa,
121

Bash, 13 12

Nie najkrótszy, ale tak naprawdę nie usuwa pliku ani nie czyni systemu bezużytecznym.

chmod 0 "$0"

Jeśli nazwa pliku nie zawiera spacji, możesz usunąć cudzysłowy, aby zapisać 2 znaki.

Wyjaśnienie

Usuwa wszystkie uprawnienia ( rwx) z siebie. Gdy spróbujesz go uruchomić, a nawet wyświetlić jego kod, po raz drugi, bez ręcznego przywracania uprawnień, powie coś w rodzaju

bash: <FILENAME>: Permission denied

Przywróć uprawnienia za pomocą

chmod +rwx <FILENAME>

Stara wersja

Usuwa tylko uprawnienia do wykonywania, ale o jeden znak dłużej (było to pytanie do zanim zmieniło się w ):

chmod -x "$0"

Podstępna wersja autorstwa Łukasza Niemiera

#!/bin/chmod 0

źródło
4
chmod 0też działa
gnibbler
@gnibbler thnx, dodano
Myślę, że możesz wywołać program ai zapisać jeszcze 3 znaki:chmod 0 a
yo '
@tohecz to w zasadzie oszustwo
5
Jeszcze ładniej#!/bin/chmod 0
Hauleth
112

Kod maszynowy 6800 - 1 bajt

0xDD

Jest to znane jako HCF lub Halt and Catch Fire

gnibbler
źródło
78
Cóż, zasady mówią: „Wszelkie odpowiedzi inicjujące ponowne uruchomienie lub zatrzymanie zostaną zdyskwalifikowane”, ale to nie tylko inicjuje zatrzymanie, ponieważ również zapala się. Tak więc +1!
Trejkaz
94

Shell + sed, 16 bajtów

Nie tak destrukcyjne jak niektóre inne odpowiedzi ;-)

Ten skrypt wstawia komentarz #na początku każdej linii:

sed -i s/^/#/ $0
Cyfrowa trauma
źródło
3
Jak o sed -i g $0?
seshoumara
91

Commodore 64 BASIC

Ten nie usuwa programu.

1 POKE 2048,1

Self-destruct

Zgodnie z mapą pamięci Commodore 64 adres 2048jest nieużywany, ale musi zawierać wartość, 0aby program BASIC mógł być uruchomiony.

Danko Durbić
źródło
1
Czy Poke po prostu przenosi zmienną do lokalizacji?
ojblass
12
@ojblass tak, skutecznie. poke a, bodpowiada kodowi C *((unsigned char *)a) = b;.
Jules
4
Chciałbym wizualizować moje zaczepy FaceBook w ten sposób!
Sunny R Gupta
3
Och wow ... Pamiętam PEEK i POKE z C64 BASIC!
Pisałem
uwaga dodatkowa: 0bajt służy do oznaczenia końca linii kodu; więc adres 0x800 prawdopodobnie potrzebuje jednego, aby zaznaczyć początek pierwszej linii kodu.
Tytus
89

Założenie: działający system Solaris, zalogowany jako root

killall
Greg Hewgill
źródło
3
czy Solaris naprawdę mają coś takiego?
ojblass
21
Tak, robi dokładnie to, co mówi na puszce i zabija wszystkie uruchomione procesy.
Greg Hewgill
jeden głos za ciebie!
ojblass
9
1, w pytaniu wspomniano, że dostęp do katalogu głównego nie jest dozwolony.
user80551
119
@ user80551 jest przyczyną tej reguły.
Seiyria
68

Python, 18 lat

open(__file__,'w')

Obcina plik, otwierając go w trybie tylko do zapisu.

segfaultd
źródło
14
Na wszelki wypadek poważnie otwiera się ( __file__odnosi się do własnej nazwy pliku). Otwarcie w wtrybie obcina plik, w zasadzie go usuwa.
Bob
7
Myślę, że obcinanie odbywa się na otwartym, ale niezależnie od środowiska wykonawczego Python powinno wyczyścić wszystkie otwarte pliki na końcu programu, a Python lub system operacyjny zamkną je po zakończeniu procesu. „Oczywiście, ogólnie dobrą praktyką jest jawne zamykanie otwartych uchwytów, gdy z nimi skończysz.
Bob
5
„Właściwy” sposób obsługi plików w Pythonie to ... er, z. with open("myfile.txt","r") as thefile:a następnie kod obsługi pliku automatycznie zamknie plik po zakończeniu.
Schilcote
1
Można to skrócić do czegoś w rodzaju open("f.py","w").
Ethan Bierlein,
1
Nie przestaje działać, gdy pozostaje .pyc pozostaje
minmaxavg
66

Partia: 5 bajtów

%0|%0

Zasadniczo jest to widebomb dla systemu Windows.

Aplikacja rozpoczyna swój pierwszy argument dwa razy. Nie uruchamiaj go w produktywnym środowisku;)

Knerd
źródło
83
Czy istnieje produktywne środowisko Windows? (Żartuję oczywiście).
orion
17
wygląda tak niewinnie!
ojblass
15
Ok, zdecydowanie nie próbuj tego. Nie poszło dobrze.
rmobis
75
Nie miej do powiedzenia przedstawiciela, ale narusza to „tylko raz” w najostrzejszy możliwy sposób.
Xan
14
Wierzę, że człowiek wykonuje go tylko raz i że się kwalifikuje.
ojblass
54

JavaScript

localStorage.x = eval(localStorage.x + localStorage.x)

Przy pierwszym uruchomieniu będzie działał dobrze:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
NaN

Jeśli spróbujesz uruchomić go więcej (nawet po odświeżeniu), pojawi się błąd:

>>> localStorage.x = eval(localStorage.x + localStorage.x)
ReferenceError: NaNNaN is not defined
Casey Chu
źródło
5
Więc jeśli uruchomisz go wiele razy, otrzymasz motyw Batmana. +1 za to.
Hankrecords
2
@Hankrecords Niestety, nie do końca, ponieważ nie zostanie to wykonane później ...
RedClover
@Sakuaku Bummer ...
Hankrecords,
@Hankrecords, chyba że je usuniesz eval, ale nie spełni tego wyzwania
RedClover
46

System operacyjny CMS firmy IBM, który jest systemem operacyjnym dla jednego użytkownika działającym jako gość w ramach VM Hypervisor IBM, ma ciekawą strukturę plików.

Pliki składają się z trzech elementów: nazwy pliku, typu pliku i trybu pliku. Tryb pliku składa się z dwóch elementów, jednego alfabetu, które dla ułatwienia wyjaśnienia można traktować podobnie do litery dysku dla systemu Windows / MS-DOS i jednej cyfry.

Pojedyncza cyfra ma znaczenie, http://publib.boulder.ibm.com/infocenter/zvm/v5r4/index.jsp?topic=/com.ibm.zvm.v54.dmsa3/hcsd0b10127.htm i dla tego zadania interesująca jest liczba 3:

Tryb pliku numer 3
Tryb pliku numer 3 oznacza, że ​​pliki są usuwane po ich odczytaniu. Możesz użyć trybu pliku numer 3, jeśli nie chcesz przechowywać kopii na swoich minidiskach lub w katalogach SFS.

Poświęć godziny na pisanie skryptu i zapisanie go jako „LOST FOREVER A3”. Uruchom to, działa po raz pierwszy. Wyrusz do domu z dobrze wykonaną pracą.

Uwaga: nie jest wyświetlany żaden komunikat wskazujący na usunięcie. W końcu wszyscy wiedzą, co to 3znaczy, prawda?

Jest to oczywiście bardzo przydatne. Po zakończeniu testowania można użyć 3plików tymczasowych i nie trzeba ich później czyścić, ponieważ są to pliki jednorazowe.

Bill Woodger
źródło
44

Commodore 64 BASIC

0 NEW

NEW usuwa program.

Danko Durbić
źródło
1
Co to robi
Darth Egregious
3
@ user973810, jeśli pamiętam podstawowy, nowy służy do czyszczenia pamięci, więc usunie program
user902383
3
Miły. Nie dotyczy Commodore 64, prawdopodobnie działa tak, jak działa na prawie każdej 8-bitowej maszynie BASIC z lat 80-tych ...
ysap
Możesz też cofnąć OLD lub O. Uznałem, że 12 miesięcy 12-latków jest genialnym programistą do gier; raz działam przypadkowo. Następnie przypadkowo zapisany zamiast przestarzałego. O. już nie działał :( Nauczyłem się, jak edytory szesnastkowe działały dość ostro :)
Matt Warren
3
@ysap: Byłoby bardziej przenośne, gdyby używał 1 jako numeru linii; nie wszystkie implementacje BASIC obsługiwane numer linii 0.
celtschk
41

Bash, 12

Uwaga: jest to destrukcyjne.

:(){ :|:&};:

To popularna bomba typu widelec. Wykładniczo zjada całą pamięć i PID blokuje system. Twardy restart pozwoli na ponowne uruchomienie kodu, ale dlaczego miałbyś to zrobić?


Bash, 10

:(){ :&};:

W przypadku dwóch mniej znaków, to zjada pamięć liniowo.


Bash, 7

w;PATH=

w jest wybierany jako najkrótszy plik wykonywalny, jaki mogłem wymyślić.

To po prostu usuwa zmienną ścieżki, aby powłoka nie mogła znaleźć /usr/bin/wnastępnym razem. Ponowne uruchomienie powłoki naprawia to, ponieważ ścieżka jest zwykle przechowywana~/.profile

użytkownik80551
źródło
Cholera: DI właśnie wpadł na ten sam pomysł: P
Knerd
1
:(){ :&};:nie powinienem jeść swojej pamięci. Zatrzymuje się, gdy tylko rozwinie się, więc jest zawsze O(1)aktywny. Zrobiłeś to while(fork());, co zjadłoby twoją pamięć liniowo, jest odpowiednikiem fork(); while(1);.
marinus
26
Łał! to niektóre śmiertelne emocje! Lepiej nie nazywam mojego komputera obraźliwym frownyface :(){ ....
Level River St
1
O ile dobrze pamiętam ... bomba widelca okresowo pozostawia jeden PID otwarty. Skrypt można uruchomić ponownie w tym przedziale czasowym ... a jeśli to się nie liczy, możliwe jest zabicie wszystkich widelców z pewnym wysiłkiem. Ponowne uruchomienie jest po prostu najłatwiejszym rozwiązaniem.
Brilliand
11
Nie sądzę, że to się kwalifikuje. Nie uniemożliwia to ponownego uruchomienia skryptu, ale gwarantuje, że uruchomi się ponownie (wiele razy).
Ben Voigt
20

DO#

Najkrótszy kod do usuwania siebie

Process.Start(new ProcessStartInfo("cmd.exe", "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location + "\""));

Kod powodujący, że staje się niezauważalny w interfejsie użytkownika

Process.Start( new ProcessStartInfo()
{
    Arguments = "/C choice /C Y /N /D Y /T 3 & Del \"" + Assembly.GetExecutingAssembly().Location+"\"",
    WindowStyle = ProcessWindowStyle.Hidden, CreateNoWindow = true, FileName = "cmd.exe"
});
BenVlodgi
źródło
7
Nareszcie odpowiedź w języku C #!
Pharap
Dlaczego wymagany jest wybór?
wizzwizz4
19

C ++ 71

Plik wykonywalny „golf” nie ma pozwolenia na uruchomienie następnym razem.

#include <stdlib.h>
int main()
{
system("chmod a-x golf");
return 0;
}

JavaScript / HTML 137, 145 z testem konsoli

<script id="s"> 
function h(){
console.log(1);
var s=document.getElementById("s");
h=s.innerHTML;
h=h.replace("h","g");
s.innerHTML=h;
}
Bacchusbeale
źródło
11
@Templar w kontekście JavaScript, myślę, że odświeżenie strony liczy się jako
2
Nawet jeśli skrypt nie był usuwany ze strony, nadal byłby wykonywany tylko raz. To nie ma sensu.
nderscore
2
@nderscore Wygląda na to, że funkcja h zostanie wykonana tylko raz. Musisz go wywołać skądinąd (jak sądzę, analogicznie do uruchamiania programu). Powiedzieć <button onclick="h();">.
Bob
4
Biorąc pod uwagę, że ponowne ładowanie strony jest dozwolone, a Twoim celem jest tylko zapobieganie wykonywaniu h przez więcej niż jeden raz, gdy jest już załadowany, co jest nie tak function h(){h=0}?
Keen
1
Dzięki temu #include <sys/stat.h>możesz uzyskać chmodbezpośredni dostęp do funkcji, oszczędzając sporo bajtów ( <stdlib.h>nie jest już potrzebne i nie jest system). Również nie returnjest potrzebne.
Ben Voigt
19

Nazywam się Shell ... PowerShell

Klasyczny komunikat autodestrukcyjny:

@'
##################################
Project X is a go

Meet Eagle 1 at WP Alpha

Further comms is hereby prohibited
##################################
This message will self destruct in 
5 seconds
'@
5..1| %{$_;Sleep 1;}
"Goodbye"
rm $(.{$MyInvocation.ScriptName})
SomeShinyObject
źródło
Wyjaśnienie, proszę?
noɥʇʎԀʎzɐɹƆ
@ noɥʇʎԀʎzɐɹƆ Linie do 13 to tylko nonsens. Następnie, podobnie jak każda inna powłoka, PowerShell ładuje uruchomiony skrypt do pamięci, a zatem nie potrzebuje już oryginalnego pliku skryptu ... więc sam się usuwa.
SomeShinyObject,
18

Bash (5)

rm $0

Zakładając, że nie masz spacji w nazwie pliku.

marinus
źródło
40
To dlatego Unix jest lepszy niż Windows: rm zamiast del zapisał ci bajt.
MadTux,
1
@MadTux Wolę * nix od Uniksa.
wizzwizz4
14

sh

#!/bin/sh
curl http://runonce.herokuapp.com/

Uruchomi się tylko raz (i wyświetli „Witaj, świecie!”, Jeśli działa), nawet jeśli ponownie zainstalujesz system i ponownie umieścisz skrypt.


EDYCJA: Pomyślałem, że wydam również skrypt za runonce. Nic specjalnego, ponieważ nie miało być wydane w żaden sposób, ale cokolwiek.

<?php
$db = pg_connect("[connection information]");
$ip = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];

pg_query("DELETE FROM users WHERE time < now() - interval '1 day'");

$result = pg_query_params($db, "SELECT * FROM users WHERE ip = $1 LIMIT 1", array($ip));

if (!pg_fetch_row($result)) {
    echo "Hello, world!\n";
    pg_query_params($db, "INSERT INTO users (ip) VALUES ($1)", array($ip));
}

Jak również schemat bazy danych

CREATE TABLE users (
    ip inet PRIMARY KEY,
    time timestamp with time zone NOT NULL DEFAULT now()
);
CREATE INDEX ON users (time);

Dane są przechowywane w bazie danych Heroku, możesz je sprawdzić , jeśli chcesz. Nie sprawdzam danych przechowywanych w bazie danych, są one przechowywane wyłącznie w celu umożliwienia wykonania kodu raz.

Konrad Borowski
źródło
4
Twierdziłbym, że będzie działał wiele razy, po prostu nie generuje żadnych wyników po pierwszym.
Brilliand
5
To nawet nie pokazało mi „Hello World”.
Paŭlo Ebermann
1
@ StéphaneGourichon: Tak, pamięta adresy IP i nie ma możliwości usunięcia adresu IP przed automatycznym usunięciem. Postanowiłem umieścić kod źródłowy, abyś mógł sprawdzić, co robi.
Konrad Borowski
1
@ StéphaneGourichon: pg_query_paramsprawie chroni przed wstrzyknięciem SQL. Nie zostanie on jednak zapisany, ponieważ '; DROP TABLE users;--nie jest prawidłowym adresem IP ( inetakceptuje tylko adresy IP), a zatem jeśli masz fałszywy X-Forwarded-Fornagłówek, twoja wizyta nie zostanie zapisana. Nie uważam tego za problem.
Konrad Borowski
2
Uważam, że jest to naruszenie standardowej luki: outsourcing prawdziwej odpowiedzi .
juniorRubyist
12

PHP, 22 20 znaków

<?=unlink(__FILE__);

EDYCJA: Usunięto dwa znaki na końcu na komentarze.

sójka
źródło
2
Można to dodatkowo uprościć, ponieważ: <?unlink(__FILE__);trailing ?>nie jest wymagany
leepowers
Musisz zacząć od, <?=lub tag początkowy nie został rozpoznany.
Michael Mior
2
PHP sam się niszczy ... ha! E_NOTICE linia 3048
metadany
<?+ spacja jest również w porządku. Po krótkim tagu nie można użyć litery.
Tytus
11

Ruby, 14 lat

Przepisuje kod źródłowy jako nazwę programu.

IO.write $0,$0
Mhm
źródło
3
A co, jeśli program ma nazwę „IO.write $ 0, $ 0”? „Założenie: nazwij program czymś, co nie jest poprawnym kodem w żadnym języku.”
Brilli i
@Brilland program ruby ​​powinien zawsze kończyć się na, .rba nawet jeśli jego nazwa to „IO.write $ 0, $ 0 # .rb”, to nie zadziała, ponieważ podczas pisania będzie zawierać pełną ścieżkę.
Mhmd
3
@Mhmd program rubinowy może kończyć się wszystkim. Na przykład gemi irbsą programami Ruby bez rozszerzenia.
bfontaine
@bfontaine Które mają shebangs. To nie
wizzwizz4
@ wizzwizz4 Shebangs nie mają nic wspólnego z rozszerzeniem. ruby fooi ruby foo.rbbędzie działać tak samo z shebang lub bez. ./foooraz ./foo.rb(zakładając, że są one wykonywalne) zarówno zakończy się niepowodzeniem bez shebang, jak i odniesie sukces (przy założeniu poprawnego kodu itp.).
bfontaine
10

Partia (6 znaków)

Zakłada się, że mamy pozwolenie na usunięcie pliku, i oczywiście można to zrobić w systemie Windows (może także MS-DOS).

del %0
Justin Krejcha
źródło
10

Bash 9 8 znaków

nc -l 1&

Uruchomi się tylko raz, ponieważ port jest zablokowany na zawsze.

Falco
źródło
1
Myślę, że to nie działa, ponieważ 0jest to specjalny port (jest zarezerwowany). Po uruchomieniu tego na komputerze mogę otworzyć go wiele razy. Jest to również port < 1024, co oznacza, że ​​wymaga dostępu do konta root, aby można go było słuchać.
heinrich5991
nc -l 1&rozwiąże problem 0i będzie o jeden bajt krótszy, ponieważ ostatnie miejsce nie jest potrzebne.
kasperd
@kasperd Dzięki za wkład :-)
Falco
@ heinrich5991 ok - niż potrzebowałbym 11 znaków bez dostępu do katalogu głównego, aby użyć portu takiego jak 9654
Falco
Chcesz wyjaśnić, dlaczego przegłosowałeś?
Falco
9

NodeJS - 33 bajty

require('fs').unlink(__filename);
cPu1
źródło
Czy mógłbyś opisać, co to robi dla tych, którzy nie znają języka?
Kyle Kanos
1
@KyleKanos Pobiera moduł systemu plików fsi bieżącą nazwę pliku __filenameoraz usuwa tę nazwę pliku z systemu plików.
Gorliwy
7
Możesz pominąć średnik, ponieważ są one opcjonalne w JavaScript.
dokładnie
8

Partia, 7 znaków

Zapisz niezapisaną pracę przed wypróbowaniem tego.

Przyjmuje system 64-bitowy lub 32-bitowy z pamięcią RAM <2 GB. Należy go zapisać w pliku .bat lub .cmd przed uruchomieniem, samo wpisanie go w cmd.exe nie będzie działać.

^ nul<^

Zużywa pełny rdzeń procesora i wypełnia pamięć RAM z szybkością kilkuset megabajtów na sekundę. Jeśli nie zatrzymasz go na czas (Menedżer zadań), zajmie on każdy bajt pamięci RAM na twoim komputerze, cały system zamrozi się i nie będziesz mógł nic zrobić, zanim wymusisz zamknięcie i ponowne uruchomienie komputera przez cięcie zasilanie lub przytrzymanie przycisku zasilania.

Wszystkie kredyty trafiają do txtechhelp na StackOverflow. Zobacz więcej informacji tutaj: https://stackoverflow.com/q/23284131/1955334

bilde2910
źródło
Jak to by było możliwe? Co ze stronicowaniem? Priorytet procesu ?
Nicolas Barbulesco
Uruchomiłem ten skrypt, nic się nie stało.
Pavel
@Pavel Domyślam się, że zostało to naprawione w systemie Windows 10. Nie mogę go odtworzyć w systemie Windows 10, ale działa on w systemie Windows 8.1.
bilde2910,
1
„Zużywa pełny rdzeń procesora i wypełnia pamięć RAM z szybkością kilkuset megabajtów na sekundę. Jeśli nie zatrzymasz go na czas (Menedżer zadań), zużyje każdy bajt pamięci RAM na twoim komputerze, cały system zawiesi się i nie będziesz mógł nic zrobić, zanim nie wymusisz zamknięcia komputera i ponownego uruchomienia komputera przez odcięcie zasilania lub przytrzymanie przycisku zasilania. " Brzmi jak horror na komputery ...
noɥʇʎԀʎzɐɹƆ
7

Oto kilka. W przeciwieństwie do wielu, nie są one destrukcyjne, tylko kreatywne i niekonwencjonalne.

Grzmotnąć

#!/usr/bin/env bash
read <<< ''
printf "$REPLY" > "$0"

Ten jest dość prosty. Zmienna $REPLYjest tworzona niejawnie przez read, ale wypełniona pustym ciągiem znaków. Ten pusty ciąg jest następnie printfzapisywany w bieżącym skrypcie. Jest to raczej zaciemniony odpowiednik:

#!/usr/bin/env bash
cat <<< '' > "$0" # probably a lot more portable

Pakiet Windows

copy con %0 < nul

Drugi w zasadzie kopiuje dane wejściowe konsoli, odczytane z nul , do bieżącego pliku.

Isiah Meadows
źródło
Opublikowane po tym stało się konkursem popularności
Isiah Meadows
1
Pierwszy nie będzie działał bez uprawnień roota. Dlaczego próbujesz wymienić urządzenie zerowe? Po uruchomieniu jako root spowoduje to, że system zachowa się nieprawidłowo. Nadpisujesz również wartość zerową podczas pisania w niej :) Dlaczego nie przenieść jej gdzie indziej? Takich jak mv „$ 0” „$ {0} x” czy coś? To powinno wystarczyć.
orion
Czy plik nadal istnieje później?
Isiah Meadows
Teraz całkowicie zmieniłem przykład Bash.
Isiah Meadows
W jaki sposób nie są one destrukcyjne?
ysap
7

Sinclair BASIC

10 POKE 23635,255

Przenosi adres programu BASIC w pamięci poza miejsce, w którym powinien być (203), aby tłumacz znalazł nieprawidłowe dane.

kitcar2000
źródło