プロが教える店舗&オフィスのセキュリティ対策術

PHP&MySQLの初心者です。
レンタルサーバーでPHP&MySQLを利用したいと思い、入門本を読みながらやっておりますが、PHPからMySQLのデータベースへ
入力しようとすると、
Warning: extract() expects first argument to be an array in /home/.sites/62/site118/web/ken4.php on line 12
のエラーがでます。
色々調べて行くとどうも「extract($_POST)」がPHPのバージョンによって使えないとの事までは解ったのですが、これを回避する方法がわかりません。
レンタルサーバーはPHP4(4.0.6)とMySQL(3.23)です。

是非ともご回答をお待ちしています。

ちなみに入門本のスクリプトは以下のものです。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title>県データ登録</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<?php

extract($_POST);

if($ken<>''){
mysql_connect('××××','×××','××××');
mysql_select_db('×××');
$sql = "insert into todofuken values('$ken', '$kec', $jin, $men,)";
mysql_query($sql);
$ken = '';
echo "データを登録しました<br />";
echo "登録を続けますか <a href=\"ken4.php\">続行</a>";
exit;
}
?>
<p>データを入力してください</p>
<form action="ken4.php" method="post" >
<p>県   名:<input type="text" name="ken" size="40"></p>
<p>県庁所在地:<input type="text" name="kec" size="40"></p>
<p>人   口:<input type="text" name="jin" size="40"></p>
<p>面   積:<input type="text" name="men" size="40"></p>
<input type="submit" value="登録">
<input type="reset" value="リセット">
</form>
</body>
</html>

A 回答 (3件)

シフトJISだとインジェクション対策がかなりいろいろ引っかかりそうですが


たとえばmysql_escape_stringをつかってこんな感じにします。
今回の場合ですと外部からうけとる変数を'ken','kec','jin','men'に
しぼっています。そうしないと、ユーザーが任意で設定した変数を
勝手におくられてきた場合、想定外の挙動をとる可能性があります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<title>県データ登録</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body>
<?PHP

foreach(Array('ken','kec','jin','men') as $val){
if($_POST["{$val}"]!="") $$val=mysql_escape_string($_POST["{$val}"]);
}

if(isset($ken)){
$link=mysql_connect('××××','×××','××××');
mysql_select_db('×××',$link);
$sql = "insert into todofuken values('{$ken}','{$kec}', '{$jin}', '{$men}')";
mysql_query($sql,$link);
//print $sql;
unset($ken);
echo <<<eof
データを登録しました<br />
登録を続けますか <a href="{$_SERVER['PHP_SELF']}">続行</a>
eof;
}else{
echo <<<eof
<p>データを入力してください</p>
<form action="{$_SERVER['PHP_SELF']}" method="post" >
<p>県   名:<input type="text" name="ken" size="40"></p>
<p>県庁所在地:<input type="text" name="kec" size="40"></p>
<p>人   口:<input type="text" name="jin" size="40"></p>
<p>面   積:<input type="text" name="men" size="40"></p>
<input type="submit" value="登録">
<input type="reset" value="リセット">
</form>
eof;
}
?>
</body>
</html>
    • good
    • 0
この回答へのお礼

ありがとうございます。教えて頂いた方法でうまく行きました。
今までVBAでの経験はかなりあったので、PHP&MySQLもと思ってやり始めましたが、入り口で躓き気持ちが萎えかけていましたが、
一つステップがUP出来たので、また頑張れそうです。
本当に有り難う御座いました。

お礼日時:2007/03/19 11:15

>>(実際には$valになんらかの処理をいれて危険要素を排除してください)


>の意味がイマイチ分かりません。

mysql_real_escape_string()や、文字コード問題やSQLインジェクションやクロスサイトスクリプティングについてしっかり調べましょう。
しっかり知識を得た上で対策をとらないと、公開サーバーにアップしたとたんに攻撃を受けてしまいます。
    • good
    • 0

extract()自体が危険性を含む関数のため$_POSTなど


外からデータを持ちこむ際のご利用にはオススメできません。
ただ、どうしてもそれが必要で、なんらかの理由でうまく動かないので
あれば同様の処理は以下のようにしてみてはいかがでしょうか?
(実際には$valになんらかの処理をいれて危険要素を排除してください)

if(is_array($_POST))
foreach($_POST as $key=>$val){
$$key=$val;
}
    • good
    • 0
この回答へのお礼

早速のご意見有り難うございます。
Warning: extract() expects first argument to be an array in /home/.sites/62/site118/web/ken4.php on line 12

のエラーは回避出来ましたが、データベースに入力は出来ませんでした。
全くの初心者で申し訳ないのですが、
>(実際には$valになんらかの処理をいれて危険要素を排除してください)
の意味がイマイチ分かりません。

お礼日時:2007/03/17 12:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!