ホームページ > バックエンド開発 > PHPチュートリアル > phpはSQLインジェクションを防ぎます

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-23 14:31:22
オリジナル
881 人が閲覧しました

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

& & lt;

& lt;/head & lt; & lt; b ODY & GT; フォーム アクション ="verify.php" メソッド "post">

input type='text' name='user' id=' user'/>

<入力タイプ='パスワード' 名前='pw' id='pw' />

$okay = 0;

<入力タイプ='送信' 値='ログイン'/>




< /html>






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


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



$username = $ _POST['user '];

$pw = $_POST['pw'];

$sql = "

username='".$username."' およびpassword=' $pw のユーザーから count(*) を CTR として選択します。 ."' 制限 1";


$result = mysql_query($sql);

while ($data = mysql_fetch_object($result)){if ($data->ctr == 1){
//彼らアプリケーションに入っても大丈夫です!
$okay = 1;
}
}

if ($okay){
$_SESSION['loginokay'] = true;
header("index.php") ;
}else {
header("login.php");
}
?>






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

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



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

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

$okay = 0;$username = $_POST['user'];$pw = $_POST['pw'] ; $sql = "username='".mysql_real_escape_string($username)."'

および mysql_real_escape_string($pw)."' 制限 1 のユーザーから ctr として選択します

;

$result = mysql_query($sql);

while ($data = mysql_fetch_object($result)){

if ($data->ctr == 1){

//アプリケーションに入っても大丈夫です!
$okay = 1;

}}
if ($okay){
$_SESSION['loginokay'] = true;
header("index.php");
}else{
header("login.php ");
}
?>






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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート