Proszę wyjaśnić, dlaczego i listy, które języki mają (mis) funkcja realizowana O ile wiesz.
Opublikuj to, co uważasz za szkodliwe, a nie to, co lubisz.
a = 1/0
- podstawowe wyrażenie, szkodliwe. ;-)
Proszę wyjaśnić, dlaczego i listy, które języki mają (mis) funkcja realizowana O ile wiesz.
Opublikuj to, co uważasz za szkodliwe, a nie to, co lubisz.
a = 1/0
- podstawowe wyrażenie, szkodliwe. ;-)
Odpowiedzi:
Informacje: http://php.net/manual/en/security.globals.php
Jest to zdecydowanie najgorsza funkcja, jaką kiedykolwiek wdrożono ze względów czytelności i bezpieczeństwa. Zasadniczo wszystkie otrzymane parametry GET są przekształcane w zmienne.
Na przykład z tym adresem URL: /index.php?value=foobar
Możesz wykonać następujące czynności:
<?php
echo $value; // return foobar
?>
Kiedy czytasz kod, bardzo mylące jest wiedzieć, skąd pochodzi zmienna.
Również jeśli funkcja jest niewłaściwie używana, może prowadzić do luki bezpieczeństwa. Oto przykład kodu z php.net, który pokazuje, jak można go niewłaściwie wykorzystać:
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
Zezwalaj domyślnie na Null, błąd „bilion” * dolarów. Przepraszam Tony Hoare. Prawie każdy język dostępny na planecie.
* Dostosowałem wyrażenie wymyślone przez Tony'ego Hoare'a, aby odzwierciedlić rzeczywistą stratę w tych dniach :-)
MAKRO C i C ++. Jeśli kiedykolwiek będę musiał zobaczyć kolejny błąd kompilatora z powodu wybrania przez makro standardowej nazwy funkcji dla swojego makra, co psuje mój kod, krzyczę. Zobaczmy ostatni obrażający:
#define vector(int) new VARIANT[int];
Aaarg! Co zrobiłeś z moim wektorem STL !?
Domyślnie przeglądanie w instrukcjach przełączania C i C ++.
break
oświadczenia lub nie dodasz sprawy między dwiema skrzynkami (lub zmienisz ich kolejność), nie zauważając, że między nimi nastąpił błąd. Nie widzę żadnego sposobu, aby ten upadek był lepszy niż sposób C # wymagający albo przerwy, albo sprawy goto itp.
Konwersje typu niejawnego, gdy typy, które są konwertowane, nie mają oczywistej relacji. Na przykład, konwersja losowej, nienumerycznej string
na int
, jak w PHP.
explicit
, które zatrzymuje konwersje typu niejawnego, ale nadal występują problemy.
0
dla pewnej wartości.
goto : choć w rzadkich przypadkach jest ok, jest częściej niewłaściwie używany i prowadzi do trudnych do odczytania programów.
ŻADEN
To, że funkcja jest często niewłaściwie używana, nie czyni jej szkodliwym.
IMHO cały „uważany jest za szkodliwy” to Reductio ad Hitlerum dyskusji w języku programowania.
Większość, jeśli nie wszystkie, „szkodliwych” funkcji ma lub miało pierwotnie bardzo ważny przypadek użycia lub są po prostu metodami wygody. Programiści muszą zrozumieć zalety i wady oraz odpowiednio kodować.
Jeśli twoje pytania miały być czymś w rodzaju „jakie cechy językowe mają wspólne pułapki lub niefortunne skutki uboczne”, moja odpowiedź byłaby inna.
[edytuj] Żeby było jasne: nie mam na myśli ciągłego używania przestarzałych metod. Jeśli programiści tracą na wartości / usuwają funkcję, powinieneś skorzystać z jej zamiany. Mam na myśli koncepcję, że obecna część języka jest uważana za szkodliwą, ponieważ niektórym nie podoba się to, co zachęca, lub kompromis związany z jego używaniem, o którym mówi wiele osób.
Autovivification (lub inna funkcja bind-variable-on- (przypisanie | użycie)) to funkcja, która według mnie daje najwięcej błędów.
PLEASE
w INTERCAL. Nie używaj go wystarczająco, narzeka. Używaj go za dużo, narzeka.
Chociaż niektórzy ludzie nie zgadzają się z tym człowiekiem lub różnymi rzeczami, które mówi, wiele JavaScript Douglasa Crockforda : Dobre części to w zasadzie to pytanie dotyczyło JS. Wśród skarg Crockforda:
Domyślnie globalny zasięg dla wszystkiego (DC pokazuje, jak używać funkcji / obiektów jako przestrzeni nazw i ograniczników zakresu, aby się do tego zakłócać).
Stwierdzenia podobne do tego with
, których niepowodzeniem jest definiowanie rzeczy w globalnej przestrzeni nazw. (Gah! To jak motto JS, jeśli zawiedziesz, to zawiodłeś tak mocno, jak to możliwe !)
Nieoczekiwane zachowanie z ==
operatorem, które zasadniczo wymaga, aby zawsze używać ===
operatora.
Wprowadzanie średnika.
Naprawdę całą JS należy uważać za szkodliwą, może nawet cały język, ale dobre części są tak cholernie dobre, że w pewnym sensie to nadrabia (przynajmniej dla mnie).
Ok, tak naprawdę nie jest to cecha samego języka, ale wciąż dość blisko spokrewniona.
Nagle Twoja aplikacja Flash / Flex przestaje działać i nikt nie może dać ci najmniejszej wskazówki, co się stało. Bez komunikatu o błędzie, bez śledzenia stosu, bez niczego. Po prostu nagle przejście ekranu się nie dzieje (lub dzieje się w zupełnie niewłaściwy sposób), przyciski nie reagują już na kliknięcia lub kombinacje są puste zamiast zapełnione niektórymi wpisami.
Ta sama funkcja jest odpowiedzialna za kilka raportów ze wzruszeniem ramion i całą masę siwych włosów, które dostaję. -.- Chociaż wyskakiwanie tajemniczej wiadomości w twarz użytkownika również nie jest pożądane, może przynajmniej pomóc deweloperowi w rozwiązaniu problemu.
Ale Flash Player pozostawia cię w ciemności, polegając na opisie użytkownika (podczas gdy problem może pochodzić z zupełnie innej lokalizacji w kodzie, która nie ma nic wspólnego z tym, co robił użytkownik). Tylko jeśli korzystasz z odtwarzacza debugowania, faktycznie wyświetla się okno wyskakujące z komunikatem o błędzie i informacją o stosie.
Jednak interesujące może być oglądanie filmów flash osadzonych w niektórych serwisach informacyjnych i otrzymywanie powtarzających się wiadomości o referencjach Null z używanego wbudowanego odtwarzacza SWF. :RE
W C / C ++: te przypisania są również wyrażeniami POŁĄCZONYMI z bardzo podobnymi operatorami przypisania = i porównania ==. Nie jest to szkodliwa funkcja sama w sobie, ale jest to sposób na łatwe wprowadzenie (czasem subtelnych) błędów przez przypadkowe wpisanie operatora.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Dostęp do modyfikatorów w Javie z domyślnym pakietem języka prywatnego i konwencją programowania prywatnego.
Zastępowanie niezdefiniowanych zmiennych pustym ciągiem w powłoce bez ostrzeżeń: rm -rf $nosuchvar/*
.
${varname:-/dev/null}
może być obejściem ...
Możliwość obrotu w LOGO przeciwnie do ruchu wskazówek zegara. Wtf, pozwala po prostu obrócić 360 - x
stopnie w prawo .
W Javie i w innym języku można dowolnie zatrzymać wątek od innego, nie dając czasu, aby zatrzymany wątek zakończył się poprawnie. Ta umiejętność została uznana za przestarzałą, biorąc pod uwagę ogrom problemu, jaki może ona przynieść w prawie każdej sytuacji.
Zmienne Zmienne w PHP
Tylko dlatego, $can
że nie masz na myśli ciebie$$should
use strict
) i łatwy sposób, aby włączyć ją ponownie dokładnie tam, gdzie tego chcesz ( no strict 'refs'
).
With
Oświadczenie w Delphi przychodzi do głowy, chociaż istnieją przypadki, gdy jest to przydatne.
Tablice w AWK od indeksu 1 !
car
! : P
W Perlu kontekst skalarny vs. kontekst listowy może być trudny. Ma kilka dobrych punktów, które sprawiają, że pewne operacje są wygodne, ale czasami napotykasz coś strasznego, na przykład całkowicie zmieniając znaczenie operatora (potencjalnie z dużej odległości w kodzie).
sub foo { (1..5) }
my @list = foo(); # (1,2,3,4,5)
my $length = scalar @list; # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)
To po prostu nie w porządku.
(Wynika to z próby stworzenia czegoś, co działa podobnie do operatora normalnego zasięgu, więc można powiedzieć coś w pętli next if /start_regex/ .. /end_regex/
).
Względna składnia importu w Pythonie 2.x. Załóżmy, że mam pakiet, x.plugins
który dodaje obsługę różnych innych bibliotek x
. Załóżmy, że mam sqlalchemy
moduł, x.plugins
dzięki czemu mogę dodać obsługę sqlalchemy x
. Jak myślisz, co się stanie, jeśli dodam następujący wiersz do pliku sqlalchemy.py?
import sqlalchemy
Odpowiedź jest taka, że moduł spróbuje się zaimportować. Ta składnia zasadniczo uniemożliwia importowanie rzeczywistego globalnego pakietu sqlalchemy. Python 2.5 dodał sposób, aby określić, że jest to import względny:
from . import sqlalchemy
... ale dopiero w Pythonie 3 pozbyliśmy się pierwszej składni (chociaż można ją wyłączyć w Pythonie 2.6+ from __future__ import absolute_import
).
sun.misc.unsafe jest moim ulubionym od zawsze; zbiór „potrzebowaliśmy tego, aby zaimplementować różne rzeczy, ale naprawdę, naprawdę nie sądzę, że powinieneś go używać”.
Wspólne bloki FORTRAN. Jeśli popełnisz prosty błąd, jedna część aplikacji może zablokować globale innej części.
FORTRAN przypisał instrukcję goto / instrukcję zmiany COBOL. Kod samomodyfikujący. Niebezpieczeństwo, ostrzeżenie, latające potwory spaghetti !!
Orientacja obiektowa (ze wszystkich języków o typie statycznym). Założę się, że ta funkcja ma i będzie nadal kosztować znacznie więcej niż zerowe wskaźniki. Orientacja obiektowa jest dobra tylko w dynamicznym języku przekazującym wiadomości . Dlatego należy go usunąć z dynamicznych języków, takich jak Python (ponieważ nie używa przekazywania wiadomości, ale konwencjonalne wywoływanie podprogramów).
Niedoświadczeni programiści albo polegają na tym, że jest on włączony, a tym samym zakładają, że wszystkie dane wejściowe użytkownika są zabezpieczone przed użyciem w zapytaniu SQL, albo polegają na tym, że są wyłączone i dlatego zawsze unikają wprowadzania danych.
Zakładając, że jest włączony, a następnie uruchamia kod w systemie, w którym go nie ma, otwiera się szeroko luki w iniekcjach SQL.
Zakładając, że jest wyłączony, a nie jest, spowoduje to, że odwrotne ukośniki będą faktycznie przechowywane w DB, co spowoduje brzydkie / niepoprawne łańcuchy.
Nie ma również niezwykle prostego sposobu obsługi obu przypadków - musisz sprawdzić, czy jest włączony przy użyciu, get_magic_quotes_gpc()
a następnie zastosować stripslashes()
do wszystkich wartości w $_*
tablicach - ponieważ array_map
nie jest rekurencyjny, potrzebujesz do tego niestandardowej funkcji.
Funkcja języka, która umożliwia programistom pisanie kodu bez komentarza lub bez komentarza.
wychodząc trochę na kończynie - funkcje void. funkcja zawsze coś robi, dlatego powinna zwrócić wynik lub inną informację dotyczącą jego sukcesu lub niepowodzenia.
POKE w języku BASIC ...
Muszę powiedzieć, że wywóz śmieci. Nie eliminuje to potrzeby myślenia o zarządzaniu pamięcią, ale eliminuje postrzeganie potrzeby myślenia o zarządzaniu pamięcią, która zbyt często eliminuje rzeczywistą myśl, a następnie dostajesz ogromne zasoby zasobów i nie wiesz dlaczego. Zwłaszcza, gdy zachowanie współczesnych generacyjnych GC można opisać bez zbytniej hiperboli jako „jeden duży przeciek pamięci z założenia”.
C, a na pewno C ++: arytmetyka wskaźników. Umożliwienie ludziom konwersji liczb całkowitych na adresy pamięci wymaga kłopotów.
A może nawet surowy dostęp do wskaźników?
W C ++ masz odwołania, które sprawiają, że wskaźniki są prawie całkowicie niepotrzebne. W pozostałych przypadkach inteligentne wskaźniki należy uznać za obowiązkowe.
Java jest również dowodem, że możesz uczynić język programowania, który wykorzystuje wskaźniki, nie pozwalając ludziom dostęp do wartości wskaźnika samego.
Oprócz null
... ale to inna historia.
for(int i=0;i<SIZE;++i) ++arr[i]
jest wolniejszy niż for(int*i=arr;i<arr+SIZE;++i)*i++
. Wszystko, co udało się udowodnić, to, że potrzebujesz wskaźnika lub nigdy nie patrzyłeś sun.misc.Unsafe
? Jeśli nie potrzebujesz wskaźników, wyjaśnij, jak napisać ogólną funkcję wymiany za pomocą Java. (np. int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Nie wspominając już o wszystkich problemach w c / c ++, które miałbyś, gdybyś miał użyć referencji. Jak nazwałbyś funkcję wirtualną nieprzezroczystą strukturą bez wskaźników?