解決した場合は1000ポイント贈呈します。

http://ryu669.sakura.ne.jp/qes1
上記URLのhtmlファイルのソースにtest1.htmlとtest2.phpがあります。
このtest1.htmlとtest2.phpをサーバーにアップしデータベースにnameとcomment、日時の登録をしようとしますが、日時は入りますが、nemeとcommentが登録
されません。文字化けも考慮して入力は半角英数で行いました。
nameはvarchar(40) , commentはtext 日時はtimestampのデータ型です。
作成PHPのバージョンはPHP4、データベースはPostgresql8.1, PHP5.3です。
文字コードはPostgresqlはUTF-8、PHP、htmlファイルはUTF-8にしました。携帯電話でも入力可能にしたいです。
今回データ表示用のphpファイルは省いてあります。確認はデータベースを直接見て確認しています。原因わかる方お願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/06/05 10:37:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント500pt

質問者の元のコードは register_globals=On を前提としたコードですね。
register_globalsはセキュリティ上問題がある為、PHP5.3からデフォルトでOffになり、更にPHP5.4では設定項目自体が無くなって今後利用できなくなる機能です。
http://www.php.net/manual/ja/ini.core.php#ini.register-globals
対応方法は Cherenkov さんの回答にある通り、$_POSTや$_GETや$_REQUESTから取得することです。

あと、それ以外にもう1点。セキュリティ上の問題があります。外部からの入力をそのままSQLに使ってしまっている為、SQLインジェクションが出来てしまいます。
例えば comment=',now());delete from bbs_01;-- というリクエストが投げられると全てのデータが消されてしまいます。
正しい対応はプレースホルダを使うことです。以下がプレースホルダを使ったサンプルです。

<?php //前略
$rs = pg_query_params(
  $db_con,
  "insert into bbs_01 (name, comment, w_time) values ($1, $2, $3)",
  array($_REQUEST['name'], $_REQUEST['comment'], date("Y/m/d h:i:s"))
);

外部からの入力データ中をそのままSQLに使うのは論外ですが、データ中のシングルクオート等を自力でエスケープするようなことも正しく行うのも難しいのでやめてください、SQLにデータを渡すときは必ずプレースホルダを使うことを憶えて下さい。
pg_connectではなく今後PDO等を使うことがあるかもしれません。SQLを直接実行する仕組みには必ず、プレースホルダの利用法があるはずなので、調べて探してでも必ずプレースホルダを使うようにして下さい。これはPHPに限った話ではありません。

他1件のコメントを見る
id:lonly777

たいへん勉強になりました。ありがとうございます。

2012/06/02 19:37:51
id:lonly777

近いうちにこのBBSのツリーBBSについて質問するかもしれません。そのときはまたよろしくお願いいたします。

2012/06/03 19:06:12

その他の回答2件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント500pt
<html>
<head>
<title>insert</title>
</head>
<body bgcolor="#ffffff" text="#555555">
<?php
$db_con = pg_connect("dbname=bbs1 port=5432 host=localhost user=       password=        ");	
if ($db_con == false){
print("接続できませんでした。");       
exit;                      
}

	$name = pg_escape_string($_POST['name']); //追加
	$comment = pg_escape_string($_POST['comment']); //追加
	$sql = "insert into bbs_01 (name, comment, w_time) values ('$name', '$comment',  '".date("Y/m/d h:i:s")."')";
                                       //sql文を$sqlにセット
	$rs = pg_exec($db_con, $sql);  //$sqlの実行結果を$rsにセット

if ($rs == false){
print("実行に失敗しました。");      
exit;                        
}
print("<tt>書き込みを入力しました。</tt>");
pg_freeresult($rs);           
pg_close($db_con);            
?>
</body>
</html>
他4件のコメントを見る
id:lonly777

早々とご指導ありがとうございます。

2012/06/02 19:35:56
id:lonly777

近いうちにこのBBSのツリーBBSについて質問するかもしれません。そのときはまたよろしくお願いいたします。

2012/06/03 19:06:01
id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント500pt

質問者の元のコードは register_globals=On を前提としたコードですね。
register_globalsはセキュリティ上問題がある為、PHP5.3からデフォルトでOffになり、更にPHP5.4では設定項目自体が無くなって今後利用できなくなる機能です。
http://www.php.net/manual/ja/ini.core.php#ini.register-globals
対応方法は Cherenkov さんの回答にある通り、$_POSTや$_GETや$_REQUESTから取得することです。

あと、それ以外にもう1点。セキュリティ上の問題があります。外部からの入力をそのままSQLに使ってしまっている為、SQLインジェクションが出来てしまいます。
例えば comment=',now());delete from bbs_01;-- というリクエストが投げられると全てのデータが消されてしまいます。
正しい対応はプレースホルダを使うことです。以下がプレースホルダを使ったサンプルです。

<?php //前略
$rs = pg_query_params(
  $db_con,
  "insert into bbs_01 (name, comment, w_time) values ($1, $2, $3)",
  array($_REQUEST['name'], $_REQUEST['comment'], date("Y/m/d h:i:s"))
);

外部からの入力データ中をそのままSQLに使うのは論外ですが、データ中のシングルクオート等を自力でエスケープするようなことも正しく行うのも難しいのでやめてください、SQLにデータを渡すときは必ずプレースホルダを使うことを憶えて下さい。
pg_connectではなく今後PDO等を使うことがあるかもしれません。SQLを直接実行する仕組みには必ず、プレースホルダの利用法があるはずなので、調べて探してでも必ずプレースホルダを使うようにして下さい。これはPHPに限った話ではありません。

他1件のコメントを見る
id:lonly777

たいへん勉強になりました。ありがとうございます。

2012/06/02 19:37:51
id:lonly777

近いうちにこのBBSのツリーBBSについて質問するかもしれません。そのときはまたよろしくお願いいたします。

2012/06/03 19:06:12
id:tomoya61 No.3

回答回数21ベストアンサー獲得回数0

例えば comment=',now());delete from bbs_01;-- とリクエストが区ると全てのデータが消されてしまいます。
正しい対応はプレースホルダを使うことです。以下がプレースホルダを使ったサンプルでーす。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません