プロが教えるわが家の防犯対策術!

チェックボックス(趣味のリスト)のチェック有無を配列で受けていますが、"パソコン"の文字が"パソ\コン"に文字化けしてしまいます。対処方法をお教えください。

<?php
mb_language('Japanese');
$hobby=@implode(" ",$_POST[hobby]);
echo $hobby;

?>
<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR>
<INPUT type="checkbox" name="hobby[]" value="温泉" >温泉<BR>
<INPUT type="checkbox" name="hobby[]" value="ゴルフ" >ゴルフ<BR>
<INPUT type="checkbox" name="hobby[]" value="パソコン" >パソコン<BR>
<INPUT type="checkbox" name="hobby[]" value="ドライブ" >ドライブ<BR>
<INPUT type="checkbox" name="hobby[]" value="写真" >写真<BR>
<INPUT type="submit" name="submit" value="送信"><BR>
<INPUT type="reset" name="reset" value="RESET">
</FORM>

A 回答 (9件)

・・・。



明らかにmagic quoteだけの問題の気もしますが。
何も考えずUTF-8に変更したら別の不具合に衝突するかと思われます。
// そもそも文字コードを変えれば解決するという類の問題ではない

http://jp2.php.net/magic_quotes
ここの項目は読みましたでしょうか。

>always_populate_raw_post_data = On
php://input使いましょう。
    • good
    • 0
この回答へのお礼

Wp、さんAdvice有難うございます。
早速、以下のURLを読み、php.iniオリジナル(default)に以下の修正を加えTESTしてみました。結果はNGで”パソコン”が”パソ\コン”に文字化けしてしまいます。ケッコウ厄介な問題ですね!
色々情報収集しTESTして見たいと思います。
耳寄りな情報がありましたらお寄せください。
【php.iniの修正点】
(1)magic_quotes_gpc = Off (default On)
(2)magic_quotes_runtime = Off (default off)
(3)magic_quotes_sybase = On (default off)

【条件】
QNo.3678348のソースに・・・・・
(1)METAをいれSJIS出力とした。
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
(2)phpソースはSJISで保存
(3)PHP Version 5.2.5

http://jp2.php.net/magic_quotes

お礼日時:2008/01/15 16:50

パスを鑑みるにxamppだと思いますけども


インストールした際に指定したpathがそのようになっているのでしょう。

phpinfo()で「Configuration File (php.ini) Path」の項目がそうなっているのではないかと思います。
実害が出るようであればhttp.confなどの設定を見直すと良いです。
    • good
    • 0
この回答へのお礼

Wpさん
本当に有難うございました。
小生の確認が不十分なため、お手数をおかけしました。
ご指摘の通りphpinfo()で確認しましたら以下の設定になっていました。
これならphp直下のphp.iniを修正しても文字化けは解消しないはずですね。
アドバイス&サポート感謝します。ありがとうございました。

Loaded Configuration File C:\xampp\apache\bin\php.ini

お礼日時:2008/01/17 13:46

読み返して頓珍漢なことを言っていたので自己訂正



>どれも正常の場合はちょっと原因が分かりません
何かしらのエイリアスを使用して設定実体が別のところにある、といったパターンの可能性もありますね。
本当にそのphp.iniが読まれているかキチッと精査する必要があるかもしれません。

>print_r($_POST)
ではないですねorz
addslash()の戻し値を検査しなくては意味がありません。

先のコードもstrなのかarrなのか判んない変数命名だし
今日はダメだな俺
    • good
    • 0
この回答へのお礼

Wpさん Adviceありがとうございます。
先にXampp\php\php.iniをmagic_quotes_gpc = Offに設定後、実験し文字化けは解消しませんでしたと報告いたしましたが、とんでもない勘違いをしていたようです。

【php.iniの在りかと読んでいるFILEは?】
(1)php.iniファイルは以下の4箇所にありました。
c:\xampp\apache\bin\php.ini
c:\xampp\php\php.ini
c:\xampp\php4\php.ini
c:\xampp\perl\php.ini

(2)c:\xampp\apache\bin\php.iniをmagic_quotes_gpc = Offに設定したところ、"5C"に起因する文字化けは解消し、パソ\コン→パソコンに正常表示するようになりました。

(3)php実行時に読んでいるFILEは?
4つのphp.iniのmagic_quotes_gpc = On/Offを切り替えたり、又1つずつ削除したりしてphp実行時に読んでいるFILEを特定したところc:\xampp\apache\bin\php.iniでphp直下のc:\xampp\php\php.iniではありませんでした。

(4)従い、c:\xampp\php\php.iniをmagic_quotes_gpc = Offに設定しても"5C"起因の文字化けは解消しなかった訳です。

【何故、php直下のphp.iniが読まれないか?】
ここを突き止めたいと思います。現在進行形ですが調べる良い方法がありましたらAdviceください。

【実験に使用したphpソース】
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<?php
if (ini_get('magic_quotes_gpc') == "1")
{echo "magic:ON";}
else{echo "magic:OFF";}

mb_language('Japanese');
$hobby=@implode(" ",$_POST[hobby]);
echo $hobby;

?>
<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR>
<INPUT type="checkbox" name="hobby[]" value="温泉" >温泉<BR>
<INPUT type="checkbox" name="hobby[]" value="ゴルフ" >ゴルフ<BR>
<INPUT type="checkbox" name="hobby[]" value="パソコン" >パソコン<BR>
<INPUT type="checkbox" name="hobby[]" value="ドライブ" >ドライブ<BR>
<INPUT type="checkbox" name="hobby[]" value="写真" >写真<BR>
<INPUT type="submit" name="submit" value="送信"><BR>
<INPUT type="reset" name="reset" value="RESET">
</FORM>

お礼日時:2008/01/17 10:03

設定は正しそうですね。



>(2)(snip)実際には幾つかのtextarea等も設け(snip)
ほかのパラメタで「パソコン」を入力した際も「パソ\コン」になるのでしょうか。

もしそうであればmagic_quoteの設定が正しくないorどこかで設定が上書きされている可能性が高いです。
get_magic_quote_gpc()が1を返すか0を返すか確認すると良いです。
有効になっている場合はphp.ini、http.conf、.ataccessを疑いましょう。
どれも正常の場合はちょっと原因が分かりませんね。^^;

get_magic_quote_gpc()が0なのにゴミが入るorほかのパラメタは正常である場合はそのチェックボックスだけaddslash()を噛ましているかもしれません。
ソースをgrepし、addslash()を使用しているところをリストアップしてみましょう。
その上でprint_r($_POST)を処理の合間に挟み、どこで汚染されているか検査すると良いです。
PEARやsmartyのフィルタで汚染されることもままありますのでその辺を留意しつつ検査すると見つかりやすいかもしれません。
    • good
    • 0

>早速、以下のURLを読み、php.iniオリジナル(default)に以下の修正を加えTESTしてみました。


httpdの再起動を忘れたというオチだけは勘弁してくださいね^^;

>magic_quotes_sybase = On (default off)
sybaseだけonなのは呪いですか^^;
通常はsybaseなんて使わないでしょうから影響ないでしょうけど。

最終手段としてはコードの中にstripslashes()を組み込むしかないです。
レンタルサーバなどの場合は.htaccessで設定するか、以下のExample#2の方法しかありません。
http://jp2.php.net/manual/ja/security.magicquote …



関係ないところでの突っ込みですが、
<FORM action="<?=$_SERVER[PHP_SELF]; ?>" method="post" >
<INPUT type="checkbox" name="hobby[]" value="旅行" >旅行<BR>
(snip)

上記フォームは安全ですか?
仮にparameterが改ざんされ、hobby[]に適当な値が入ってきても大丈夫でしょうか。
松井秀樹は喜んでアダルトビデオ鑑賞とか入れるかもしれません。
最悪の場合ですとhtmlを入れ込まれ、悪意あるサイトへの誘導もありえます。
DBやCSVを使っている場合は諸々のインジェクション対策も必要になります。

通常の設計では「checkboxの値は明示的である」の理念により、
予めキーをセットし実体はiniファイルなりDBでもったりするのが常です。
たとえば以下の感じ。

[check.ini]
[hobby]
1="旅行"
2="温泉"

[top.php]
<?php
$ini = parse_ini_file('check.ini',true);
echo '<form action="get.php">\n';
foreach($ini as $section => $values) {
 foreach($values as $key => $value) {
  echo "<input type='check' name='".$section."[]' value='".$key."' />".$value."<br />\n";
 }
}
echo "<input type='submit' /></form>";
?>

[get.php]
<?php
$ini = parse_ini_file('check.ini',true);
$iniHobby = $ini['hobby'];
$input = $_POST['hobby'];

$checkedStr = array();
foreach($input as $param) {
 $checkedStr[] = $iniHobby[$param];
}
echo 'あなたは'.implode(',',$checkedStr).'を選びました';
?>

やっつけで書いたのでsyntax errorとかあるかもしれませんが。
    • good
    • 0
この回答へのお礼

Wp、さん
お力添え有難うございます。
(1)php.iniの”magic_quotes_gpc = Off”設定で、文字化けは解消する事を期待していましたが期待に反してNGでした。PCを再起動して数回Tryしましたので、ご指摘の様な問題はない様に思います。
”off”設定で"5C”が付加される事はないように思いますので、小生の設定に問題有りの様に思います。ちなみに開発環境Xampp+php5.25でXampp\php\php.iniを修正しました。php.iniのコピペを以下に示します。何かとんでもない勘違いをしているかも知れません。お気づきの点がありましたらご指摘ください。
*****************************************
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.

magic_quotes_gpc = Off

; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
*********************************
(2)最終的にはstripslashes()を組み込むしかないと考えていますが余りこの関数は使用せず解決したく考えています。今回問題提起したphpのソースはあくまでも問題提起用で実際には幾つかのtextarea等も設け掲示板的にしたいと考えています。この$_POST[xxxx]全てについてstripslashes()を入れるのも手間ですし、是非stripslashes()関数を使用せずに解決したいと考えています。(・・・・・できれば、そうしたい)

(3)FORMの安全性ですが、実際の開発ではcheckbox値は明示するつもりです。ご指摘のDB、iniファイル迄は考えていませんでしたのでコードは参考になりました。ありがとうございました。
以上

お礼日時:2008/01/15 19:46

>別の不具合に衝突するか



他のプログラムがShift_JISを前提にしている場合があるから,ですね。

>そもそも文字コードを変えれば解決するという類の問題ではない

調べてないけどUTF-8でもどこかのバイトストリームに5Cや22や27が存在する可能性があり,
ここが治っても別の場所で結局発症する可能性があるから,ですね。

>http://jp2.php.net/magic_quotes
>ここの項目は読みましたでしょうか。
まだです。

#ちょっと回答が軽率過ぎたかな?

>>always_populate_raw_post_data = On
>php://input使いましょう。

こんなのあるのね。勉強になりました。
#zipファイル拾ってきて設定ファイルを眺めているときに
#何でデフォルトでOffなんだろうと疑問だった。
    • good
    • 0

>mbstring.http_input = UTF-8


>mbstring.http_output = UTF-8
多分不要。あるいは以下か。

mbstring.http_input = pass
mbstring.http_output = pass

mb_output_handler must be registered as output buffer to function
って設定しなくても正しく動いているから。
(mb_output_handlerを指定するとそこで自動変換されるかどうか悩みそうなので指定するのを止めた。)

一応Offにしておく(こちらの想定外のタイミングのレスポンスがブラウザに送られる可能性を排除)
output_buffering = Off
    • good
    • 0

>そこでPHPにはこうした危険性を排除しよう



すまん,ここ俺間違っている。(各リンク先は正しい)
PHP側がこの設定で排除しようとしているのはこういった文字コード云々の文字化けではなく,SQL文を作るときのインジェクションを防ぐためでした。その影響を受けている。それ以外の記述は多分正しい。

>初心者なモノでphp.iniの設定等が正しいのか?
俺もPHPは最近はじめたばかりで自信がないんだ、実は。
手元にあるのはPHP 6で,PHP 5を持ってくるのが面倒なので確認していない。

多分二つの設定はあっていると思うけれど,俺自身は
「極力自動推測機能はOFFにする,あるいは明示的に指定する」
方針が好きで,手元では
[mbstring]
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8
;(6)と(12)は同じ設定だね
mbstring.encoding_translation = Off
mbstring.detect_order = NULL
mbstring.func_overload = 7
;output_handlerは設定内容がよくわからんので
コメントアウトしてある(笑)

;毎回,always_populate_raw_post_data = Onして
;(RAW_POST_DATA自体はASCII文字だけで構成されているはずだから
;こうした異常は起こらないと思う)
;でデコードしている(笑)

;良く解らないが
;設定だけしているもの

[iconv]
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8
iconv.output_encoding = UTF-8

;多分PHP6~
;;;;;;;;;;;;;;;;;;;;
; Unicode settings ;
;;;;;;;;;;;;;;;;;;;;

unicode.semantics = on
unicode.runtime_encoding = UTF-8
unicode.script_encoding = UTF-8
unicode.output_encoding = UTF-8
unicode.from_error_mode = U_INVALID_STOP
unicode.from_error_subst_char = 3f

としている
    • good
    • 0

質問内容とカテゴリ見る限り,ある程度技術的なことがわかりそうなので原理の説明。



PHPでは色々なメタキャラクタのエスケープに\を用いていることはご存知かと思います。

$str = "\"";

この\のバイトストリームを16進数で表現すると5Cになります

さて,
「ソ」の文字をShift_JISで表現したとき,
これは83 5Cというバイトストリームになります。
http://homepage3.nifty.com/jgrammar/ja/tools/cod …

$str = "ソ";

とか書くと後ろのダブルクオートがエスケープされ,文字列が終わってないと見なされてエラーが出ることがあるわけです。

http://goungoun.dip.jp/app/fswiki/wiki.cgi/devno …
今回の場合はエラーが出ますが,
場合によっては危ないかもしれません。

そこでPHPにはこうした危険性を排除しよう
http://d.hatena.ne.jp/lami/20061215/1166169234
という仕組みがあり,それが逆に影響して今回の現象が発生しています。

対策としては

●Shift_JISを止めてUTF-8に乗り換える。
●magic_quotes_gpc = false

あたりでしょうか?
特に後者はPHP 6で消えるようです。
http://d.hatena.ne.jp/gallu/20080107/p1

====================
パーセントエンコード
form要素のenctype属性,accept-charset属性
HTML 4.01 Strictではform要素の子要素はブロックレベル要素のみ

であるということもついでに調べておくことを薦めます
    • good
    • 0
この回答へのお礼

Advice有難うございます。
参考URL等を確認し"5C"のいたずらとの事、納得しました。
早速、himajin100000さんのAdvice+以下のURLを参考にphp.ini等の設定を変更し、結果的に"ソ"が正常に表示するようになりました。・・・・・が初心者なモノでphp.iniの設定等が正しいのか?
検証できません。設定した内容を以下に記載します。是非commentをお願いします。

【phpソース】
(1)ソースに<META>を追加
<META http-equiv="Content-Type" content="text/html: charset=UTF-8">
(2)ソースコードをsjis→UTF-8に変更し保存

【php.ini変更点】
(1)magic_quotes_gpc = Off
(2)mbstring.internal_encoding = UTF-8
(3)mbstring.http_output = UTF-8
(4)mbstring.language = Japanese
(5)default_charset = UTF-8
(6)mbstring.http_input = auto
(7)mbstring.encoding_translation = On
(8)mbstring.detect_order = auto
(9)mbstring.substitute_character = none
(10)output_handler =mb_output_handler
(11)output_buffering = On
(12)mbstring.http_input = auto

http://www.bnote.net/windows/windows/code.shtml
以上

お礼日時:2008/01/15 06:49

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