web-dev-qa-db-ja.com

SQLインジェクションに対する保護が優先されないのはなぜですか?

Stack Overflowでは、基本的な回避策が10年以上にわたって広く利用可能であるにもかかわらず、SQLインジェクション攻撃に対して非常に脆弱なMySQLクエリを含む多くのPHPコードがQ&Aに含まれています。

これらのタイプのコードスニペットが現在も使用されている理由はありますか?

それは主にa)無知b)怠惰によるものだと思います。初心者は通常、SQLインジェクションについてあまり知らないため、SQLインジェクションについて聞いても無視できるので、コーディングが非常に簡単で簡単です。

34
froadie

PHPは故意に、有用な動的Webページを作成することをほとんど知らない人々にとって、本当に、非常に簡単にします。つまり、PHPは、有用な何かを作成し、他の有用な見た目の例から学び、このクールで有用なことを行う方法を他の人に教えるために振り向く多くの初心者を引き付けます。結果は、多くの悪いコードであり、何もよく知らないプログラマーの供給です。

有能なプログラマの大部分がPHPとは何の関係も望んでいないことが、事態を悪化させるだけです。これは、他の人をよりよく教えることをいとわない経験豊富な人々の基盤を減らします。しかし、なぜPHPを避けているのでしょうか。まあ、要因の組み合わせについては。一部には、言語いぼに対処するのが嫌いです。そして、その理由の1つは、優れたコードを使用することを好むためであり、優れたPHP=がそこにはあまりありません。

Perlに影響を与えるために使用されたこの正確な一群の問題。輝かしい例として、1990年代に、便利で十分に文書化された、簡単にインストールできるCGIスクリプトを数多く提供することに熱心な10代のマットライトのケースを考えてみましょう。残念ながら、彼はセキュリティについて何も理解していませんでした。その結果、Matt Wright Script Archivesが誕生しました。これは、初期のCGIスクリプトのセキュリティ問題の無限の流れでした。 http://www.scriptarchive.com/nms.html のような取り組みにもかかわらず、共有ホスティングプロバイダーがPHPより便利になるまで、問題はPerlで改善されませんでしたそれがPerlからPHPへの移行の問題につながります。

26
btilly

残念ながらtonsよりも悪いPHPチュートリアルがそこにあり、いくつかの古いPHP本はまた、人々に適切なコードを記述します(register_globalsなどを使用しません)。

さらに、magic_quotes_gpc過去に有効にされていたため、「単純に機能する」ため、人々は脱出を気にしませんでした。

8
ThiefMaster

個人的には、PHP=は使いやすいので、当然、誤用しやすいと思います。

4
davidhaskins

人間であり、プログラマーでもあるため、間違いを犯したり、特定のことを見落としたりすることは非常に簡単です。

特定の言語のせいで、自分の利益のためにアクセスしすぎているのは簡単で、おそらくあまりにも魅力的です。しかし、それは、プログラミングに選択された言語に関係なく、人間の誤謬のより大きな問題を覆い隠すでしょう。

確かに、私たちはアセンブリ言語から長い道のりを歩んできました。私は、PHP、Python、Ruby、Javaなどのより現代的な言語での生産性がはるかに高くなると思います。

PHP(および他のスクリプト言語)は、実際には参入障壁を下げています。これは、プログラミングの初心者がPHPを最初に試すことを意味します。しかし、これは、すべてのPHPプログラマーが何らかの形で資格を失ったり、他の言語のプログラマーよりも間違いから学ぶ。

Rasmus Lerdorfは1994年に元の形式でPHPを作成しましたが、それ以来大幅に進化しました。最新の化身として、Symfonyなどの優れたフレームワークだけでなく、オブジェクト指向プログラミングもサポートしています。 PHP言語は元の制約から解放され、プログラマーが使用する方法に大きな柔軟性を提供するように成長しました。これを使用して、スパゲッティコードの9,000行のスクリプトを作成できますまたは、Symfonyなどの最新のMVCフレームワークのコンテキスト内で使用できます。

セキュリティの脆弱性は単一の言語に限定されていないのではないかと私は強く思います。すべてのPHPプログラマーが何らかの能力が低い、または安全でないコードを書く傾向があるため、それを書き留めるのは魅力的です。しかし、そのどれだけが言語バイアスであり、それがどれだけ事実であるのでしょうか。

2
Jay Sheth

問題の一部は、何をしているのかわからずに単純にコードをコピーする人々にあると思いますが、実際に私たちがポーガムニングを教える方法が壊れていることは、これが悪いコードがたくさんある理由の1つです。私たちは文脈にとらわれずに構文を教えますので、初心者は何かをいつ使うべきか、いつ使うべきか、どのような問題が構文の解決を意図していて、どのような問題が解決を意図していないのかわかりません。 SOレンチがより良いツールであった場合、彼らはハンマーを使用します。

たとえば、構文だけを教えるのではなく、次のようにコースを編成します(明らかに、より多くのステップがあります。これは、構文を教えるだけでなく、基本的な問題からより複雑な問題への構築の基本的な例にすぎません)。

  1. これは、基本的なWebページを設定する方法です
  2. これは、Webページにデータベースからデータをプルさせる方法です。
  3. これは、Webページからデータベースにデータを送信する方法です。
  4. これは、正しいデータが送信されることを確認する方法です。
  5. これは、悪意のあるデータ入力からデータベースを保護する方法です
2
HLGEM

PHP自体にこの悪い習慣があると非難することができます。レガシーバージョンのPHP(2006年頃まで))は、すべてのGETおよびPOST入力変数。これにより、データベースクエリのBY BY DEFAULTに適したものになります。参照 http://php.net/manual/en/security.magicquotes.php

1
Ben XO

同様に脆弱なMS SQL + ASP/ASP.NETの例も同様に見つかると思います。

問題の一部は、何かを教えようとしているとき、たとえばWHERE句を使用してデータをフィルタリングしているときに、クエリ文字列を適切にエスケープしたり、パラメータ化されたコマンドを使用したりして、例を混乱させたくないという事実に一部起因していると思います。

私は長年開発者をトレーニングしてきましたが、チュートリアルで恐ろしいコードを書く人々に共感を示すことができます。時にはそれが最も簡単に理解できます。ただし、余談ですが、私は常に脆弱なコードを指摘し、興味深いサイドトピックにしています。

1
Fung

PHPの元の作者、Rasmus Lerdorf、彼の悪名高いブログエントリ は「no-framework」 開発。 SQLクエリではPDOを使用するため、SQLインジェクションのリスクはありません。 ORMレイヤーを備えた最新のMVCフレームワークと比較すると、依然として見苦しく古くなっています。

1
vartec

チュートリアルの目的を簡単に説明することと、本番環境で行うべきことを混同しないでください。たとえば、私が書いたほとんどのチュートリアルコードには、エラー/例外チェックがほとんどまたはまったくありません。私は読者に、コードが特定のタスクを実行する方法を示すだけであり、考えられるすべての結果をカバーする方法ではないことを思い出させます。

0
SnoopDougieDoug