Frage

Bitte, erkläre warum und listen Sie auf, in welchen Sprachen die (MIS) -Funktionen implementiert sind, die Sie wissen.

Posten Sie, was Sie als schädliche Funktion betrachten, nicht das, was Sie nicht mögen.

War es hilfreich?

Lösung 2

Null zulassen standardmäßig, der "Billion"* Dollar -Fehler. Entschuldigung, Tony Hoare. Fast jede auf Planet verfügbare Sprache.

Tony Hoare erklärt

*Ich habe den von Tony Hoare geprägten Ausdruck angepasst, um den tatsächlichen Verlust an diesen Tagen widerzuspiegeln :-)

Andere Tipps

Registrieren Sie Globale in PHP

Information : http://php.net/manual/en/security.globals.php

Dies ist bei weitem das schlechteste Merkmal, das jemals aus Lesbarkeitsgründen und Sicherheitsgründen implementiert werden muss. Grundsätzlich werden alle empfangenen Parameter in Variablen umgewandelt.

Zum Beispiel mit dieser url: /index.php?value=foobar

Sie können Folgendes machen:

<?php
echo $value; // return foobar
?>

Wenn Sie Code lesen, ist es sehr verwirrend zu wissen, woher die Variable stammt.

Auch wenn das Feature missbraucht wird, kann dies zu Sicherheitsloch führen. Hier ist ein Codebeispiel von php.net, das zeigt, wie es missbraucht werden kann:

<?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";
}
?>

C und C ++ Makros. Wenn ich jemals einen anderen Compiler -Fehler sehen muss, weil jemand einen Standardfunktionsnamen für sein Makro auswählt, das meinen Code vermasselt, werde ich schreien. Lassen Sie uns den letzten beleidigenden sehen:

#define vector(int) new VARIANT[int];

Aaarg! Was hast du mit meinem STL -Vektor gemacht?

Standardeinstufung in C- und C ++ - Switch -Anweisungen.

Implizite Typkonvertierungen, wenn die zwischen den Typen konvertierten Typen keine offensichtliche Beziehung haben. Zum Beispiel eine zufällige, nicht numerische Konvertierung string In ein int, wie in PHP.

gehe zu: Obwohl es in seltenen Fällen in Ordnung ist, wird es häufiger missbraucht und führt zu schweren Lesungsprogrammen.

KEINER

Nur weil eine Funktion häufig missbraucht wird, macht es nicht schädlich.

Imho der gesamte "schädlich" ist das ist das Reduktion ad hitlerum Diskussionen der Programmiersprache.

Die meisten, wenn nicht alle der "schädlichen" Funktionen haben oder hatten ursprünglich einen sehr gültigen Anwendungsfall oder sind in erster Linie einfach Komfortmethoden. Es liegt an den Entwicklern, die Vor- und Nachteile zu verstehen und entsprechend zu codieren.

Wenn Ihre Fragen etwas entsprechen würden, in dem "welche Sprachmerkmale gemeinsame Fallstricke oder unglückliche Nebenwirkungen haben", wäre meine Antwort unterschiedlich.

Bearbeiten] Um klar zu sein: Ich meine nicht die fortgesetzte Verwendung von veralteten Methoden. Wenn die Entwickler eine Funktion abbauen/entfernen, sollten Sie den Austausch verwenden. Ich beziehe mich auf das Konzept, dass ein aktueller Teil der Sprache als schädlich angesehen wird, weil einige nicht mögen, was er fördert oder welcher Kompromiss, den viele Menschen diskutieren, beteiligt.

AutoVivifikation (oder andere Funktionen von Bind-Variable-on- (| | use)) ist die Funktion, die ich mir die meisten Fehler verleiht.

PLEASE in Intercal. Verwenden Sie es nicht genug, es beschwert sich. Verwenden Sie es zu sehr, es beschwert sich.

Obwohl einige Leute nicht mit dem Mann oder verschiedenen Dingen einverstanden sind, die er sagt, viele Douglas Crockfords JavaScript: die guten Teile Ist diese Frage im Grunde auf JS angewendet. Unter Crockfords Beschwerden:

  • Globaler Umfang standardmäßig für alles (DC zeigt, wie Funktion/Objekte als Namespaces und Geltungsbereichsgrenzen verwendet werden, um dies zu streiten.)

  • Aussagen wie with, dessen Fehlerverhalten darin besteht, Dinge im globalen Namespace zu definieren. (Gah! Es ist wie das JS -Motto, wenn Sie versagen, dann Scheitern Sie so hart wie möglich!)

  • Unerwartetes Verhalten mit dem == Bediener, bei dem Sie im Grunde das immer die verwenden müssen === Operator.

  • Semikoloninsertion.

Wirklich viele JS sollten als schädlich angesehen werden, vielleicht sogar die ganze Sprache, aber die guten Teile sind einfach so verdammt gut, dass es sich irgendwie ausmacht (zumindest für mich).

"Schweigen" im Flash -Player als Standardverhalten

Ok, nicht wirklich ein Merkmal der Sprache selbst, aber immer noch ziemlich eng verwandt.

Plötzlich funktioniert Ihre Blitz-/Flex -Anwendung nicht mehr und niemand kann Ihnen den geringsten Hinweis geben, was der F* passiert ist. Keine Fehlermeldung, keine Stacktrace, kein nichts. Es ist nur so, dass plötzlich der Bildschirmübergang nicht auftritt (oder völlig falsch), oder Schaltflächen reagieren nicht länger auf Klicks, oder Comboboxes sind leer, anstatt mit einigen Einträgen bevölkert zu werden.

Diese "Funktion" allein ist für mehrere verantwortlich Achselzucken berichtet Und ein ganzes Haufen grauer Haare, die ich bekommen habe. -.- Während eine kryptische Nachricht im Gesicht des Benutzers nicht wünschenswert ist, kann es dem Entwickler zumindest helfen, das Problem zu beheben.

Aber Flash Player lässt Sie im Dunkeln herumstechen und stützt sich auf die Beschreibung des Benutzers (während das Problem tatsächlich von einem völlig anderen Ort in dem Code stammt, der nichts mit dem zu tun hat, was der Benutzer tat). Nur wenn Sie den Debug -Player verwenden, erhalten Sie das Popup -Fenster mit einer Fehlermeldung und einer Stacktrace.

Es kann jedoch sehr interessant sein, auf bestimmten Nachrichtenseiten Flash -Embedded -Filme zu sehen und wiederholte Nachrichten über Nullreferenzen von dem gebrauchten eingebetteten Player SWF zu erhalten. :D

In C/C ++: Zuweisungen sind auch Ausdrücke in Kombination mit der sehr ähnlichen Zuordnung = und Vergleichs == Operatoren. Kein schädliches Feature an sich, aber es ist ein Weg, um (manchmal subtile) Fehler einzuführen, indem der Bediener versehentlich verwickelt wird.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

Zugriff auf Modifikatoren in Java mit Paket Private Language Standard und Private Programming Convention Standard.

Ersetzen von undefinierten Variablen durch eine leere Zeichenfolge in Shell ohne Warnungen: rm -rf $nosuchvar/*.

Die Fähigkeit, im Logo gegen den Uhrzeigersinn zu drehen. WTF, lass uns einfach im Uhrzeigersinn drehen 360 - x Grad.

Stoppen Sie Faden von einem anderen Faden

In Java und in einer anderen Sprache können Sie einen Thread von einem anderen willkürlich anhalten, ohne die Zeit für den Faden zu geben, den Sie angehalten haben, um ordnungsgemäß zu beenden. Diese Fähigkeit war gewesen veraltet In Anbetracht des großen Problems könnte es fast alle Situationen einbringen.

Variable Variablen in PHP

Nur weil du $can Das heißt du nicht $$should

Das With Die Aussage in Delphi fällt mir in den Sinn, obwohl es Fälle gibt, in denen es nützlich ist.

Arrays in awk beginnend im Index 1!

In Perl, Skalarkontext vs. Listenkontext kann schwierig sein. Es gibt einige gute Punkte, die bestimmte Operationen bequem machen, aber gelegentlich triffst du auf etwas Schreckliches wie Die Bedeutung eines Bedieners vollständig ändern (möglicherweise aus einer erheblichen Entfernung im Code).

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)

Das ist einfach nicht richtig.

(Es entsteht aus dem Versuch, etwas zu machen, das wie den regulären Bereichsbetreiber verhält, sodass Sie etwas in einer Schleife sagen können wie wie next if /start_regex/ .. /end_regex/).

Python 2.x 'relative Importsyntax. Angenommen, ich habe ein Paket x.plugins Das fügt Unterstützung für verschiedene andere Bibliotheken für die Unterstützung x. Und nehme an, ich habe eine sqlalchemy Modul in x.plugins So kann ich Sqlalchemy -Unterstützung hinzufügen x. Was wird Ihrer Meinung nach passieren, wenn ich SQLalchemy.py die folgende Zeile hinzufüge?

import sqlalchemy

Die Antwort ist, dass das Modul versucht, sich selbst zu importieren. Diese Syntax macht es im Wesentlichen unmöglich, das tatsächliche globale SQLalchemy -Paket zu importieren. Python 2.5 fügte einen Weg hinzu, um festzustellen, dass dies ein relativer Import ist:

from . import sqlalchemy

... aber erst bis Python 3 wurde die erste Syntax tatsächlich beseitigt (obwohl sie in Python 2.6+ deaktiviert werden kann from __future__ import absolute_import).

sun.misc.unsafe ist mein Favorit aller Zeiten; Die Sammlung von "Wir brauchten dies, um Dinge zu implementieren, aber wirklich nicht glauben, dass Sie es verwenden sollten."

FORTRAN GROSSE BLOCKS. Wenn Sie einen einfachen Fehler gemacht haben, könnte ein Teil einer Bewerbung die Globale eines anderen Teils erregen.

Forran hat die Anweisung von GOTO -Anweisung / COBOL Alter zugewiesen. Selbstmodifizierender Code. Gefahr, Warnung, fliegende Spaghetti -Monster !!

Objektorientierung (aus allen statisch typisierten Sprachen). Ich werde diese Funktion einsetzen und werde weiterhin kosten, um sie zu kosten erheblich Mehr als Nullzeiger. Die Objektorientierung ist nur in einer Dynamik gut Nachrichtenübergang Sprache. Es sollte also auch aus dynamischen Sprachen wie Python fallen gelassen werden (da es keine Nachrichtenübergabe verwendet, sondern konventionelle Unterroutine -Anrufe).

magic_quotes in PHP.

Unerfahrende Entwickler verlassen sich entweder darauf, dass es aktiviert wird, und gehen daher davon aus, dass alle Benutzereingaben für die Verwendung in einer SQL -Abfrage entkommen werden oder darauf angewiesen sind, dass sie deaktiviert wird und so immer ihrer Eingabe entkommen.

Bei der Annahme, dass es aktiviert ist und dann den Code auf einem System ausführt, in dem er nicht klaffende SQL -Injektionslöcher öffnet.

Bei der Annahme, dass es deaktiviert ist und nicht, führt dies dazu, dass die Rückstände tatsächlich in der DB gespeichert werden, was zu hässlichen/falschen Saiten führt.

Es gibt auch keine extrem einfache Möglichkeit, beide Fälle zu behandeln. Sie müssen überprüfen, ob es aktiviert ist get_magic_quotes_gpc() und dann bewerben Sie sich stripslashes() bei allen Werten in der $_* Arrays - seit array_map Ist nicht rekursiv, Sie benötigen dafür eine benutzerdefinierte Funktion.

Die Sprachfunktion, mit der Programmierer unkontrollierter oder bedeutungsloser Code schreiben können.

Ein bisschen auf einem Glied hier ausgehen - void -Funktionen. Eine Funktion macht immer etwas, daher sollte sie entweder das Ergebnis oder ein anderes Teil von Informationen zu ihrem Erfolg oder Misserfolg zurückgeben.

Poke in Basic ...

Ich müsste Müllsammlung sagen. Es beseitigt nicht die Notwendigkeit, über die Speicherverwaltung nachzudenken, sondern beseitigt die Wahrnehmung von der Notwendigkeit, über das Gedächtnismanagement nachzudenken, was allzu oft den tatsächlichen Gedanken beseitigt, und dann erhalten Sie enorme Ressourcenschweine und wissen nicht warum. Besonders wenn Das Verhalten moderner Generationen -GCs könnte ohne zu viel Übertreibung als "ein großes Speicherleck für Design" beschrieben werden.

C und definitiv C ++: Zeigerarithmetik. Die Ermöglichung von Menschen, Ganzzahlen in Speicheradressen umzuwandeln, bittet um Probleme.

Und vielleicht sogar einen rohen Zugang zu Zeigern insgesamt?

In C ++ haben Sie Referenzen, die Zeiger fast völlig unnötig machen. Für die verbleibenden Fälle sollten intelligente Zeiger als obligatorisch angesehen werden.

Java wird auch beweist, dass Sie kann Erstellen Sie eine Programmiersprache, die Zeiger verwendet, ohne dass Menschen den Zugang zum Zeigerwert selbst ermöglichen.

Außer, abgesondert, ausgenommen null ... aber das ist eine andere Geschichte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
scroll top