回答:
情報:http : //php.net/manual/en/security.globals.php
これは、読みやすさとセキュリティ上の理由から、これまでに実装された最悪の機能です。基本的に、受信したすべてのGETパラメーターは変数に変換されます。
たとえば、次のURLの場合:/index.php?value=foobar
次のことができます。
<?php
echo $value; // return foobar
?>
コードを読んでいるとき、変数がどこから来たのかを知ることは非常に混乱します。
また、機能が悪用された場合、セキュリティホールにつながる可能性があります。php.netのコード例を次に示します。これは、誤用の可能性を示しています。
<?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";
}
?>
デフォルトではNullを許可します。これは「兆」*ドルの間違いです。ごめんなさい、トニー・ホア。地球上で利用可能なほぼすべての言語。
*トニー・ホアによって造られた表現を調整して、最近の実際の損失を反映させました:-)
CおよびC ++マクロ。誰かがマクロの標準関数名を選択してコードを台無しにしてしまうために、別のコンパイラエラーを確認する必要がある場合は、悲鳴を上げます。最後の問題のあるものを見てみましょう:
#define vector(int) new VARIANT[int];
ああ!私のSTLベクターで何をしましたか!?
CおよびC ++ switchステートメントのデフォルトのフォールスルー。
break
ステートメントを忘れるか、誰かが2つのケースの間にケースを追加する(またはそれらを再注文する)までの間、フォールスルーがあったことに気付かずに役立ちます。私はフォールスルーが良いなどの休憩や後藤場合、どちらかが必要なのC#の方法よりであることをどのような方法が表示されない
変換される型に明確な関係がない場合の暗黙的な型変換。たとえば、PHPのように、ランダムな非数値string
をに変換int
します。
explicit
。これにより、暗黙的な型変換が停止しますが、まだ問題があります。
0
、値をランダムにするよりも良い場合があります。
goto:まれに問題ありませんが、誤用されることが多く、読みにくいプログラムになります。
なし
機能が頻繁に悪用されるからといって、それが有害になるわけではありません。
私見「全体が有害と考えられる」は、プログラミング言語の議論のReductio ad Hitlerumです。
すべてではないにしても、ほとんどの「有害な」機能は、非常に有効なユースケースを持っているか、元々持っていた、またはそもそも単に便利な方法です。長所と短所を理解し、それに応じてコードを作成するのは開発者次第です。
あなたの質問が「どの言語機能に一般的な落とし穴や不幸な副作用があるか」という方針に沿ったものである場合、私の答えは異なります。
[編集]明確にするために、私は非推奨のメソッドを継続して使用するつもりはありません。開発者が機能を減価償却/削除する場合は、代替品を使用する必要があります。言語の現在の部分は有害であると考えられるという概念に言及している。なぜなら、多くの人々が議論するように、それが奨励するものやその使用に伴うトレードオフを好まない人もいるからである。
Autovivification(または他のbind-variable-on-(assign | use)機能)は、最も多くのバグを発見した機能です。
PLEASE
INTERCALで。十分に使用しないでください、と文句を言います。使いすぎると文句を言う。
一部の人々はこの男や彼が言うさまざまなことに異議を唱えていますが、ダグラス・クロックフォードのJavaScript:The Good Partsの多くは、基本的にこの質問がJSに当てはまることです。クロックフォードの苦情の中で:
すべての既定のグローバルスコープ(DCは、関数/オブジェクトを名前空間およびスコープ区切り文字として使用して、これを圧縮する方法を示しています。)
のようなステートメントでwith
、その失敗動作はグローバル名前空間で物事を定義することです。(Gah!JSのモットーは、失敗した場合、可能な限り激しく失敗することです!)
==
演算子の予期しない動作。これは基本的に、常に===
演算子を使用する必要があります。
セミコロン挿入。
本当に多くのJSは、おそらく言語全体でさえ有害であると見なされるべきですが、良い部分は非常に良いので、少なくともそれを補います(少なくとも私にとっては)。
OK、実際には言語自体の機能ではありませんが、それでもかなり密接に関連しています。
突然、Flash / Flexアプリケーションの動作が停止し、f *が発生したことを少しでも知ることができなくなります。エラーメッセージもスタックトレースも何もありません。突然画面遷移が起こらない(またはまったく間違った方法で起こる)、ボタンがクリックに反応しなくなる、またはコンボボックスがいくつかのエントリで埋められるのではなく空になっているだけです。
その「機能」だけが、いくつかの肩をすくめるレポートと、私が得てきた白髪の束の原因となっています。-.-ユーザーの顔に不可解なメッセージを表示することも望ましくありませんが、少なくとも開発者が問題を解決するのに役立ちます。
ただし、Flash Playerでは、ユーザーの説明に依存して、暗闇の中で突き刺さったままになります(一方、問題は、実際には、ユーザーが行っていたこととは関係のないコード内のまったく異なる場所に起因する場合があります)。Debug Playerを使用する場合にのみ、実際にエラーメッセージとスタックトレースを含むポップアップウィンドウが表示されます。
ただし、特定のニュースサイトでFlash埋め込みムービーを視聴し、使用されている埋め込みプレーヤーSWFからNull参照に関するメッセージを繰り返し受け取ることは非常に興味深い場合があります。:D
C / C ++の場合:その割り当ても、非常によく似た割り当て=および比較==演算子と組み合わせた式です。それ自体は有害な機能ではありませんが、誤ってオペレーターをタイプミスすることにより、バグを簡単に導入する(時には微妙な)方法です。
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
ロゴで反時計回りに回転する機能。WTF、時計回りに回転させることができます360 - x
。
Javaおよび他の言語では、停止したスレッドが適切に終了する時間を与えることなく、他のスレッドから任意にスレッドを停止できます。この機能は、ほぼすべての状況で発生する可能性がある膨大な量の問題を考慮して廃止されました。
PHPの変数
あなた$can
があなたを意味しないという理由だけで$$should
use strict
)、あなたは(それをしたいと思います正確な場合には、再びオンにするための簡単な方法をno strict 'refs'
)。
Perlでは、スカラーコンテキストとリストコンテキストは注意が必要です。特定の操作を便利にするいくつかの良い点がありますが、時折、演算子の意味を完全に変えるようなひどい何かに出くわします可能性(コード内のかなりの距離から)。
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)
それは正しくありません。
(それは通常の範囲演算子のように振る舞う何かを作ろうとすることから生じるので、ループのように何かを言うことができますnext if /start_regex/ .. /end_regex/
)。
Python 2.xの相対的なインポート構文。のx.plugins
さまざまなライブラリのサポートを追加するパッケージがあるとしますx
。そして、私はsqlalchemyサポートをに追加できるようにsqlalchemy
モジュールを持っているとします。次の行をsqlalchemy.pyに追加するとどうなりますか?x.plugins
x
import sqlalchemy
答えは、モジュールが自分自身をインポートしようとすることです。この構文は、本質的に、実際のグローバルsqlalchemyパッケージのインポートを不可能にします。Python 2.5では、これが相対的なインポートであることを指定する方法が追加されました。
from . import sqlalchemy
...しかし、最初の構文が実際に削除されたのはPython 3になってからです(ただし、Python 2.6以降ではを使用して無効にできますfrom __future__ import absolute_import
)。
sun.misc.unsafeは私の一番のお気に入りです。「ものを実装するためにこれが必要でしたが、実際には、あなたはそれを使うべきだとは思わない」というコレクション。
FORTRAN共通ブロック。単純な間違いを犯した場合、アプリケーションのある部分が別の部分のグローバルを破壊する可能性があります。
FORTRANが割り当てたgotoステートメント/ COBOL alterステートメント。自己修正コード。危険、警告、スパゲッティモンスターの飛行!!
オブジェクトの向き(静的に型付けされたすべての言語から)。この機能には、nullポインターよりもはるかに高いコストがかかること、そして今後もかかることを期待します。オブジェクト指向は、動的なメッセージ受け渡し言語でのみ有効です。したがって、Pythonのような動的言語からもドロップする必要があります(メッセージパッシングを使用せず、従来のサブルーチン呼び出しを使用するため)。
未経験の開発者は、有効化されているため、SQLクエリで使用するためにすべてのユーザー入力がエスケープされると想定するか、無効化されているため、常に入力をエスケープします。
有効になっていると想定し、そうでないシステムでコードを実行すると、大きなSQLインジェクションホールが開きます。
無効であると仮定すると、バックスラッシュが実際にDBに保存され、い/正しくない文字列が発生します。
両方のケースを処理する非常に簡単な方法もありません-使用して有効になっているかどうかを確認し、配列内のすべての値にget_magic_quotes_gpc()
適用する必要があります- 再帰的ではないため、このためのカスタム関数が必要です。stripslashes()
$_*
array_map
ガベージコレクションを言わなければなりません。メモリ管理について考える必要性を排除するものではありませんが、メモリ管理について考える必要性の認識を排除します。これは、実際の思考を排除することが多すぎるため、リソースを大量に消費し、その理由がわからなくなります。特に、現代の世代別GCの動作は、とにかく「設計による1つの大きなメモリリーク」と誇張しすぎずに説明できる場合です。
C、そして間違いなくC ++:ポインター演算。人々が整数をメモリアドレスに変換できるようにすることは、問題を求めています。
そして、ポインタへの生のアクセスもありますか?
C ++には、ポインターがほぼ完全に不要になる参照があります。残りの場合、スマートポインターは必須と見なされる必要があります。
Javaは、ユーザーがポインター値自体にアクセスすることを許可せずに、ポインターを使用するプログラミング言語を作成できることも証明しています。
null
... とは別に、それは別の話です。
for(int i=0;i<SIZE;++i) ++arr[i]
はより遅いですfor(int*i=arr;i<arr+SIZE;++i)*i++
。証明できるすべてのjavaは、ポインターが必要なのか、それとも見たことがないのかということsun.misc.Unsafe
です。ポインターが必要ない場合は、Javaを使用して汎用スワップ関数を作成する方法を説明してください。(例:int a = 1、b = 2; swap(a、b); assert(a == 2 && b == 1);)。参照を使用する必要があった場合に発生するc / c ++のすべての問題は言うまでもありません。不透明な構造体のポインターなしの仮想関数をどのように呼び出しますか?