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


39

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

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


37
ひどく書かれたオンラインチュートリアルのせいにしてください。多くの場合、人々はネット上で見つけたコードをコピーして貼り付けるだけです。JavaScriptもそのような慣習のもう1つの犠牲者です。
KJYe.Name

34
ブログを非難する。ああ、そしてW3Schools ...
ブライアンドリス

13
はい、絶対にW3Schoolsのは-を参照してw3fools.com
DisgruntledGoat

2
私は常にSQLインジェクションについて警告する人々を見ています-したがって、この質問の前提が有効であるとは思いません。これは、ある優先度の高いです。
グランドマスター

3
私が多くの答えで見ているのは、批判的に壊れていないPHPを教えるよりも、批判的に壊れているPHPを教える方が簡単だということです。あなたは、その引数を受け入れ、まだPHPは悪い言語ではないことを主張することはできません
user16764

回答:


34

私は主にa)無知b)怠toによるものだと思います。初心者は通常、SQLインジェクションについてあまり知識がなく、それを聞いたとしても、そのようにコーディングする方がはるかに簡単で簡単なので、それを無視します。


8
私は他の場所でそのようなことを修正しようとしましたが、それは目下の問題に関係がないと言われるだけです。そのため、多くの人が少し複雑な良いソリューションよりも単純なハックを好むため、悪い例は残されています。
l0b0

6
ほとんどの人は、実際にSQLインジェクションにぶつかるまで気にしません。それから突然彼らはテーブルがどこに行ったのか疑問に思っています。
ジョエルイーサートン

1
もう1つの理由は、SQLインジェクションが常に内部アプリの関連する懸念事項と見なされないことです。(彼らが正しいわけではありません。)
ジョンフィッシャー

1
Answersが質問に答えるためにあることを忘れないでください。多くの場合、質問に答えることを目的とするのは擬似コード(またはSQL)であり、必ずしも安全で安全なコピーアンドペーストソリューションを提供するわけではありません(実際の答えの使用方法にかかわらず)。
ダリンSeivewright

1
@ l0b0現在の本番コードに対するSQLインジェクション攻撃を実際に実演することで、SQLインジェクションの修正を真剣に受け止めた人を知っています。
user16764

26

PHPは、有用な動的Webページを作成することをほとんど知らない人々にとって、意図的に本当に簡単に作成します。これは、PHPが多くの初心者を惹きつけ、有用なものを作成し、他の有用な見た目の例から学び、このクールで有用な方法を他の人に教えることを意味することを意味します。その結果、多くの不正なコードが生成され、それ以上のことを知らないプログラマーが増えます。

有能なプログラマーの大部分がPHPとは関係ないことを望んでいるのは事態を悪化させるだけです。これにより、他の人をより良く教えようとする経験豊富な人々のベースが減少します。しかし、なぜ彼らはPHPを避けるのですか?要因の組み合わせに適しています。一部には、彼らは言語いぼを扱うのが好きではありません。そして、部分的には、彼らは良いコードで作業することを好むだろうし、そこには良いPHPがあまりないからです。

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


あなたが言ったように、問題はperlやPHPではありません。これらの言語は初心者に多くのことをさせてくれます。これは良いことですが、それを常に上手くやる方法を提供するわけではありません。
ザカリーK

2
@ZacharyK:それはデフォルトでは言語のせいではないですか?
レース、モニカと

6
@ tomalak-geretkal:何かを成し遂げることが悪いことであるかのように、「fault」という言葉を使用します。多くの悪いコードにつながる同じ特性は、解決される多くの実際の問題にもつながります。これが全体的に悪いことであることは明らかではありません。
btilly

再せい':HTML(またはむしろそれを解釈するブラウザは)XSLなど、フォールトトレラントとされていた場合には、ワールドワイドウェブ...があったことはなかっただろう
Benjol

8

残念ながら、そこにあるトン以上、より-悪いPHPのチュートリアルのは、そこに出て、いくつかの古いPHPの本も(などはregister_globalsを使用していない)適切なコードを書くために人々に伝えるに吸い込ま。

さらに、magic_quotes_gpc過去に有効化されたため、人々は「単純に機能した」ためにエスケープを気にしませんでした。



2

人間として、そしてプログラマーとして、私は間違いを犯すことは非常に簡単であり、特に時間に追われたとき、特定のものを見落とすことは非常に簡単です。

特定の言語を非難するのは簡単で、おそらく魅力的すぎるかもしれません。しかし、それは、プログラミングするために選択された言語に関係なく、人間の誤りやすさのより大きな問題を明らかにするでしょう。

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

PHP(およびその他のスクリプト言語)は、実際には参入障壁を下げています。これは、プログラミングの初心者が最初にPHPを試すことを意味する場合があります。しかし、それは確かに、すべてのPHPプログラマーが他の言語のプログラマーよりも何らかの形で適格性が低い、または彼らの間違いから学ぶ能力が低いことも意味しません。

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

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


「すべてのPHPプログラマー」については何も言いませんでした。
モニカとの明るさのレース

2

問題の一部は、自分がしていることをわざわざわざわざコードをコピーするだけの人だと思いますが、本当に私の考えでは、porgamnmingを教える方法が壊れており、それが悪いコードがたくさんある理由の1つです。私たちは構文を文脈から教えているので、初心者はいつ構文を使用するのか、いつ使用しないのか、どの構文の問題を解決するのか、どのような問題を解決しないのかを知りません。そのため、レンチが優れたツールであった場合、ハンマーを使用します。

したがって、たとえば、単に構文を教えるのではなく、コースを次のように整理します(明らかに、より多くのステップがあります。これは、単に構文を教えるのではなく、基本的な問題からより複雑な問題を構築する基本的な例です):

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

それは多かれ少なかれ私がphp +
1-レミ

1

同様に脆弱なMS SQL + ASP / ASP.NETのサンプルが同量見つかると思います。

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

私は長年開発者を訓練してきましたが、チュートリアルで恐ろしいコードを書いている人々に共感することができます。それが最も簡単に理解できる場合もあります。ただし、余談ですが、私は常に脆弱なコードを指摘し、興味深い副題にしています。


6
余談ではありません。それは基本的なレッスンの一部であるべきです。おそらく、物事の間違った方法についての大きくて太った警告を伴う。人々は最初に見たものをカットアンドペーストする傾向があり、あなたはそれを物事を行う正しい方法にしたいのです。
-btilly

確かに、.NETの世界では、パラメーター化は最近非常に簡単であり、実際には「ページ1」のものでなければなりません。
アランB

1

PHPの元の著者であるRasmus Lerdorfは、悪名高いブログエントリで「フレームワークなし」開発を提唱しています。SQLクエリにはPDOを使用していますが、SQLインジェクションのリスクはありません。ORM層を備えた最新のMVCフレームワークと比較すると、まだかなりくて時代遅れです。


5
必要のない複雑なフレームワークでサイトを過剰設計することは確かに可能です。ラスマスの提案は犯罪的に危険に近づいていると思いますが、間違いなく正気な妥協点があります。
レース、モニカと

最近では、ORMの使用は過剰なエンジニアリングではありません。それは標準です。MVCパターンを使用しています。
バルテック

3
@vartec:すべての羊がそれを使用しているという理由だけで、ほとんど「標準」ではありません(そして、それが価値があるのは、すべての羊それを使用しているわけではありません)。小さなスクリプトの場合は、簡単に過剰設計なる可能性があります。
モニカとの軽度レース

1
@Tomalak:それは標準です。なぜなら、それがクリーンで持続可能なプロジェクトを実装する方法だからです。「小さなスクリプト」は時間とともに成長し、維持できない怪物に変わる傾向があります。
バルテック

2
@vartec:「標準」の意味を誤解していると思います。
モニカと軽さレース

1

この貧しい習慣をPHP自体のせいにすることができます。従来のバージョンのPHP(2006年頃まで)は、すべてのGETおよびPOST入力変数をエスケープするため、デフォルトでのデータベースクエリ補間に適しています。http://php.net/manual/en/security.magicquotes.phpを参照してください


2
すべての変数を、MySQLに具体的にアクセスするかどうかに関係なく、すべての変数をエスケープする場合がありました。言語設計者への注意:実装しなければならないことに気付いたときstripslashes()、あなたはすでに間違っています。
ダン・レイ

0

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


3
申し訳ありませんが、mySQLクエリとPHPを混在させるコード例は絶対にありません。それは単に間違っているだけです。
レイノス

1
そして無責任に。
モニカとの明るさのレース

-1の場合most tutorial code I have written has little or no error/exception checking.
ヤニス

私はOPのポイントを見ることができます。無責任なのは、雇用主がSQLインジェクションなどに関する知識のない人を雇うときです。
ラファエル

「本番環境でこれを使用しないでください!」というコメントをコードに直接含めると、このアプローチは防御できると思います。そうすれば、コピー/ペーストには言い訳はありません。
ベンジョー

-1

私がPHPを学んでいたとき、私はこれらのPHP + MySQLの本をいくつか見ました。そしてそれはその悪い習慣に貢献していると感じています。しかし、私は同情を持っています、彼らは言語を教えているので、良いプログラミング慣行ではありません。それ以外の場合、どこで終了しますか?


2
しかし、あなたが言語を教えているとき、あなたはまだあなたの例で好ましいAPIを使用するべきです。SQLクエリのパラメトリック形式を常に使用するように、「補間を使用してSQLを構築することを考えないでください。少し簡単に思えますが、セキュリティの脆弱性が非常に発生しやすい」などの脚注を付けてください。
1月Hudec

うん、良い点。脚注は良い思い出になるでしょう、そしてそれはオンラインチュートリアルにも当てはまります。しかし、真剣に、すべての言語の本の著者がOWASPからのアドバイスを初心者のテキストに組み込むことができれば素晴らしいと思います。参考としても。OWASP Foundationは良い仕事をしています。
スティーブラスボーン

@indifferentDrum:人々に自分の足で運転するように教えることもできます-それが良いアイデアだという意味ではありません。
、モニカとの明るさのレース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.