30代半ばの事務職員がITエンジニアになった話

おおよそタイトルのとおり、30代半ばにしてITエンジニアのタマゴになってしまった会社員の話

【Webサーバー】レンタルサーバーでphpをバージョンアップしたら文字化けした

相変わらず脆弱性の対応に追われている


ところどころでセキュリティの観点で
ものを見れるようになったことや
そもそも覚えることが多いので
役に立っているのはいいが


そのうち君セキュリティ担当な!
とか言われたらイヤだなぁ…


Webサーバーに文字化け発生


サーバーで使っているphpのバージョンが
古すぎる (5シリーズ) ということで
セキュリティにひっかかり、
バージョンを7シリーズまであげる
羽目になった


たしかに今になるとバージョン低いことが
リスクだと感じるようになったので
バージョンをあげるにこしたことはない


しかし、このバージョンアップにより
サーバー上の一部のhtmlに文字化けが発生


php5.5までならデフォルト文字コード
設定は"デフォルト値"が"なし"でもよく


f:id:ykk333:20191120224237p:plain
phpinfoを確認するとdefault_charsetがnot valueになっている

要するにどんな文字コードでも受け入れて
くれる設定だったということらしい


ところがphp5.6より新しいバージョンでは
デフォルト文字コードが"なし"は
許されず何かしら設定しないといけない


これもセキュリティの一環らしい
デフォルトでは"UTF-8"が設定されている


f:id:ykk333:20191119233725p:plain
phpinfoを確認するとdefault_charsetにUTF-8が指定されている


.htaccessまたはhost.conf?あたりに
以下の記述がされていると
(Apacheの場合)
拡張子が.phpのものと.htmlのものは
phpの設定が適用される


つまりUTF-8が適用される

AddHandler application/x-httpd-php .php .html


この状態で例えばhtmlファイルの
文字コードが"EUC-JP"なんかだと
文字化けが発生するというわけ


文字化けへの対策


文字化けしているhtmlのコードを見てみる

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
	<title></title>
</head>


思った通り、
meta情報がEUC-JPになっている


これをUTF-8に変えれば
楽勝だろうと思いきや


変わらない…


サクラエディタあたりの
エディタソフトで開くと


f:id:ykk333:20191120231707p:plain
文字コードEUC-JP


htmlファイルの文字コード自体が
EUC-JPで保存されていることが
確認できる


なのでこれをUTF-8に変更して
上書き保存してやると


f:id:ykk333:20191120231827p:plain
文字コードUTF-8


文字化けがなおった!


ちなみにmeta情報は変更しても
しなくても変わらず
phpinfoのdefault_charsetと
htmlファイル自体の文字コード
一致することのほうが優先されるの
だと思う


php.iniにて

default_charset = "UTF-8"

の記述があるのでこれを

default_charset = "EUC-JP"

に変えてやれば
もちろん文字コード
変更される


けど、
php5.5以下の環境で
文字コードが混在したphpファイルや
htmlファイルが存在していた場合は
どちらかに統一するしかない


ちなみに前述のとおり
デフォルトが"なし"は許されないので

;default_charset = "UTF-8"

デフォルト文字コードを指定しなかった
場合はUTF-8が設定される



php やら DB をさわっていると文字コード
ってなにかとネックになる気がする
英語圏ならこんな悩みはないのか。。


と、ちょっとだけ欧米人がうらやましい