ホームページ  >  記事  >  バックエンド開発  >  phpはSQLインジェクションを防ぎます

phpはSQLインジェクションを防ぎます

WBOY
WBOYオリジナル
2016-06-23 14:31:22786ブラウズ

SQL インジェクション攻撃では、ユーザーはフォームまたは GET クエリ文字列を操作してデータベース クエリに情報を追加します。たとえば、単純なログイン データベースがあるとします。このデータベースの各レコードには、ユーザー名フィールドとパスワード フィールドがあります。ユーザーがログインできるようにするログイン フォームを作成します。简. 簡単なログインフォーム

& & lt;

& lt;/head & lt; & lt; b ODY & GT; フォーム アクション ="verify.php" メソッド "post">e388a4556c0f65e1904146cc1a846bee5796acc501e44225aa7ebfd95efa11edユーザー名8c1ecd4bb896b2264e0711597d40766c input type='text' name='user' id=' user'/>
94b3e26ee717c64999d7867364b1b4a3

e388a4556c0f65e1904146cc1a846bee6e0b6e054241b431a0bddcda3f7eb0ecパスワード8c1ecd4bb896b2264e0711597d40766c1766be03f31f1455e2ed7318587fe63494b3e26ee717c64999d7867364b1b4a3afc6dd10eaa3d9e6e3ae9eb5c445f5b0






このコードは問題ありませんね?世界中の数百 (数千ではないにしても) の PHP/MySQL サイトがこのコードを使用しています。どうしたの? 「ユーザー入力は信頼できない」ということを覚えておいてください。ここではユーザーからの情報はエスケープされないため、アプリケーションは脆弱なままになります。具体的には、あらゆる種類の SQL インジェクション攻撃が可能です。

たとえば、ユーザーがユーザー名として foo を入力し、パスワードとして ' または '1'='1 を入力すると、実際には次の文字列が PHP に渡され、クエリが MySQL に渡されます。



このクエリは常にカウント 1 を返すため、PHP はアクセスを許可します。ハッカーは、パスワード文字列の末尾に悪意のある SQL を挿入することで、正規のユーザーになりすますことができます。
この問題の解決策は、PHP の組み込み mysql_real_escape_string() 関数をユーザー入力のラッパーとして使用することです。この関数は文字列内の文字をエスケープするため、文字列内でアポストロフィなどの特殊文字を渡すことができなくなり、MySQL が特殊文字に基づいて動作できるようになります。リスト 7 はエスケープされたコードを示しています。
e388a4556c0f65e1904146cc1a846bee5c662c096ff1d2070c867bd0529fb3dc94b3e26ee717c64999d7867364b1b4a3
f5a47148e367a6035fd7a2faa965022e
36cc49f0c466276486e50c850b7e4956
081a934c7ac7a6b28b4ef3b648acdd09






このフォームは、ユーザーが入力したユーザー名とパスワードを受け入れ、ユーザー入力を verify.php という名前のファイルに送信します。このファイルでは、PHP はログイン フォームからのデータを次のように処理します。


リスト 6. 安全でない PHP フォーム処理コード



リスト 7. 安全な PHP フォーム処理コード

399acfe40f15fa7a3066638a0075a977






mysql_real_escape_string() をユーザー入力のラッパーとして使用すると、ユーザー入力での悪意のある SQL インジェクションを回避できます。ユーザーが SQL インジェクションを介して不正なパスワードを渡そうとすると、次のクエリがデータベースに渡されます:



$sql = "select count(*) as ctr  from users where   username='foo' and password='' or '1'='1' limit 1";






データベース内にはそのようなパスワードに一致するものはありません。たった 1 つの簡単な手順で、Web アプリケーションの大きな穴を塞ぐことができました。ここでの経験則は、SQL クエリのユーザー入力は常にエスケープする必要があるということです。


安全のため、信頼できるソースからの URL のみを開いてください 出典: http://hi.baidu.com/luzheng22/blog/item/af49aca48ea018f19052eeea.html

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPの常識次の記事:PHPの常識