ド素人ですが、わけあって、プログラミング勉強してます。。。

独学でプログラミングを勉強中です。よろしくお願いします。

SESSION_COOKIE_SECUREについて

最近、なんだかコード内に設置したCSRF対策の動きがおかしい。。。
何度やってもエラーが出ちゃう。
これがテストコードです。

session_start();
error_reporting(E_ALL);
header("Content-Type:text/html;charset=utf-8");
function setToken(){
$token = sha1(uniqid(mt_rand(),true));
$_SESSION['token'] = $token;
}

function checkToken(){
if (empty($_SESSION['token']) || ($_POST['token'] !== $_SESSION['token']))
{
echo "不正なPOSTが行われました!";
exit;
}
}

function h($s){
return htmlspecialchars($s,ENT_QUOTES,"UTF-8");
}

$err = array();
//フォームからPOSTでリクエストが来ているかどうか判定
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
//POSTからのリクエストではなかった場合の処理
//CSRF対策
setToken();
}else{
//POSTからのリクエストだった場合の処理
checkToken();

if (isset($_POST['submit'])) {
$name = filter_input(INPUT_POST, 'name');
$company = filter_input(INPUT_POST, 'company');
if ($name == '' ||$name == null) {
$err['name'] = "名前を入力して!";
}elseif ($name != "のりこ") {
$err['name'] = "のりこって入力して!";
}
if ($company == '' ||$company == null) {
$err['company'] = "会社名を入力して!";
}elseif ($company != "トヨタ自動車") {
$err['company'] = "トヨタ自動車って入力して!";
}
if (empty($err)) {
echo $company."の".$name."さん、こんにちは!";
exit;
}
}
}
<html>
<form action="" method="POST"><br />
<p>名前:<input name="name" type="text" value="<?php if(isset($name)){echo h($name);}?>" /> <!--?php if(isset($err['name'])){echo h($err['name']);}?--></p>
<p>会社名:<input name="company" type="text" value="<?php if(isset($company)){echo h($company);}?>" /> <!--?php if(isset($err['company'])){echo h($err['company']);}?--></p>
<input name="token" type="hidden" value="<?php echo h($_SESSION['token']); ?>" />
<p><input name="submit" type="submit" value="登録" /></p>
</form>
</html>

このコードを実行すると、CSRF対策にひっかかる。

"不正なPOSTが行われました!"が画面に表示されてしまう。

何故だかわからず、試しに、

var_dump($_SESSION['token']);
var_dump($_POST['token']);

を行うと、$_SESSION['token']だけがNULLと出た。

$_POST['token']には、ちゃんと乱数が入ってる模様。

なんでだろう〜♪なんでだろう〜♪

と、テツ&トムばりに考えた。そして、あることを思い出した。

 

SESSION_COOKIE_SECURE

 

セキュリティについてどうすればいいのかいろんなサイトを眺めてて、

php.iniのSESSION_COOKIE_SECUREっていうのをTRUEにするのがよい。
という情報を鵜呑みにして、そういえば、最近、php.iniを書き換えた。

SESSION_COOKIE_SECUREがなんなのかもよく分からずに。。。

試しに、これをFALSEにしてみたら、

 

string(40) "783ed496779c57e3650b02ddbb57163ea4c1f8a4"

string(40) "80683dac88d8163cbdc162e4135bfd3c508ddb99"

 

上がセッション変数、下がポスト変数の中身。

値が違うのが気になるが、とにかく、ちゃんとセッション変数にも

乱数値が入った模様。

 

そもそも、SESSION_COOKIE_SECUREってなんぞや?

調べたのでメモ。

SESSION_COOKIE_SECURE
デフォルト値: False
セッションクッキーにセキュアなクッキーを使うかどうかを決めます。
この値を Trueに設定すると、クッキーは “セキュア” にマークされます。
クッキーがセ キュアにマークされると、ブラウザによっては HTTPS 接続でのみ
クッキーを転送す るようになります。

な〜る〜ほ〜ど〜
やっぱ、意味わからず使うのは危険やね。

 

今、再度実行したら、

$_SESSION['token']と$_POST['token']の値が同じになってた。。。

なんでだろう〜♪なんでだろう〜♪................

名前の正規表現関数を作ってみた。

イマイチ、functionの使い方がわからなかった。

きっと、自分で関数とか作っちゃったら便利なんだろーなーとは感づいてた。

でも、一年以上放置してた。

htmlspecialcharsとかも、毎度、いちいち書いてた。

今回、重い腰をあげて、今更ながらfunctionに取り組んでます。

作ってみました。

入力してもらった名前や会社名なんかをバリデーションしますよ。

function nameValidate($name,$s,$i,$p,$l){
$err = array();
if ($name === "" || $name === null){
$err = $s."を入力してください。<br />";
}elseif ((mb_strlen($name,"UTF-8")) > $i){
$err
= $s."は".$i."文字以内で入力してください。<br />";
}elseif (!preg_match($p,$name)) {
$err[] = $s."は".$l."で入力してください。<br />";
}
return $err;
}

名前と会社名を打ち込むための入力フォームを設置し、

そこから渡された値が、こちらの思惑通りじゃなければエラーを出しちゃいます。

①空じゃない?

②文字数超過してない?

③妙な記号とか打ち込んでない?

そんなところをチェックさせていただきます。

※コード内のhってのは、htmlspecialcharsの関数です。

$name = "";
$company = "";
$errs = array();

if (isset($_POST['submit'])) {

if (isset($_POST['name'])) {
$name = $_POST['name'];
$err = nameValidate($name,'氏名',10,"/\A[ぁ-んァ-ヶー一-龠]+\z/u","漢字、ひらがな、カタカナ、または、ローマ字");
if (!empty($err)) {
foreach ($err as $value) {
array_push($errs, $value);
}
}
}

if (isset($_POST['company'])) {
$company = $_POST['company'];
$err = nameValidate($company,'会社名',5,"/\A[ぁ-んァ-ヶー一-龠]+\z/u","漢字、ひらがな、カタカナ、または、ローマ字");
if (!empty($err)) {
foreach ($err as $value) {
array_push($errs, $value);
}
}
}

if (empty($errs)) {
header('Location:thanks.php');
exit;
}

}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>新規登録画面</title>
</head>
<body>
<h1>新規登録画面</h1>
<?php
if (!empty($errs)) {
foreach ($errs as $err) {
echo h($err)."<br />";
}
}
?>
<form action="" method="post">
<p>名前:<input type="text" name="name" value="<?php if(isset($name)){echo h($name);}?>" /></p>
<p>会社名:<input type="text" name="company" value="<?php if(isset($company)){echo h($company);}?>" /></p>
<p><input type="submit" name="submit" value="送信" /></p>
</form>
</body>
</html>

独学の素人が作ったコードです。ここがイケテナイとかあると思います。 イケテナイところはどんどんご指摘ください。 よろしくです。

バリデーションの話し

正規表現って言葉を最近初めて知りました。

PHPMySQLを本やサイトで勉強し始めて、はや2ヶ月。

正直、まだあんまり分かっていないです。

セッションとかクッキーとか、仕組みがよく理解できていない。

でも、こうして本とにらめっこしていても、理解は深まらないんじゃないかと。

それで、実際、ホームページを作り始めました。

もちろん、毎日、いや、毎時間ごとに躓いてます。いろんなところで。

今日は、バリデーションで躓いてます。

まず、この言葉聞いたのも初めてだし。日常生活でこういった概念に触れた

ことがなかった。

でも、言われてみれば、今までネットでどこかのサイトに登録するとき、

登録フォームに何か間違った文字を打ち込んでしまったら、ちゃんと

エラーが出てどこが間違っているか教えてくれてた。

「パスワードは5文字以上にしてね!」

とか、

「氏名のフリガナもちゃんと入力してよ!」

とか、

「規約に同意するにチェック入れないと登録受付けませんけどねっ!」

とか、

ちゃんと、わたしが過ちを犯すたびにひとつひとつ丁寧に指摘してくれてた。

 

今、こうしてウェブプログラミングってやつを勉強していると

そのいちいちに、プログラマーさんの愛を感じる…。

エラーが出るたび、誤入力した自分を棚に上げて舌打ちしてごめんなさい。

 

バリデーションっていうのは、そういう、私のようなドジ子ちゃんが、ひらがな

で入力して欲しいところを英数字で入力したり、

メールアドレスを入力して欲しいところにURLを入力したりといったミスが

ないように、間違いをふるいにかけて排除すること。かな?

それで、わたしが作りたい会社のホームページにも、もれなく登録画面みたい

なのが必要なのです。お申し込みフォームみたいなのが必要なのです。

だから、バリデーションしなくちゃなのです。

 

バリデーションについていろいろ調べてたら、

preg_matchという関数に出会いました。

この、マッチさん。バリデーション界には欠かせない存在の模様。

正規表現ってのが得意分野のようです。

PHPのマニュアルによると、、、

PHP: preg_match - Manual

ふむふむ、、、

むにゃむにゃ、、、

ねむねむ、、、

、、、、、

、、、Zzz

 

なして、こう、マニュアルって分かり難いの?

わたしがバカだからなの?

英語が読めないからなの?外人アレルギーだから???

そういえば、小学校の時にアメリカから転校してきたナタリーちゃんの

青い目が怖くて卒業するまで殆ど話ししなかったっけ。。。

その罰が、今頃?ナタリーちゃんごめ、、、さい、、、

 

話しは、マッチさんに戻ります。

マッチさんについて、もっといろいろと知りたい。

休日は何をして過ごすのか。とか〜、犬と猫だったらどっちが好きか、とか〜

ブリーフ派なのか、トランクス派なのか、それともノーパン派なのか、とか〜

気になって、気になってたまらないところに、

分かりやすいサイト発見!

サルにもわかる正規表現入門

こういうのを求めてたのよ!小難しい言葉で素人を挫折させるような悪意に

満ちたサイトじゃなくって、こういう、サル以下のっていったらサルも

比べないで!

って言われちゃいそうな理解力のわたしにも分かるような。

 

 

まだまだバリデーションの話し続きます。

MAMP設定備忘録〜PHPでの文字化けに対処〜

タイトルの通りです。

PHPで日本語を入力し、ブラウザに表示すると見事なまでの文字化けっぷり。

早速、設定を変更します。

 

参考サイト:MAMPのPHPでの文字化けを直す | memocarilog

 

MAMPエンコーディングUTF-8に変更します。

アプリケーション→MAMP→bin→php→php5.5.3(ご使用のバージョン)→conf→php.ini

このphp.iniを開きます。

 

①394行目 ;default_charset = "iso-8859-1"

f:id:koyomi2013:20140206101333p:plain

頭についてる を削除し、 "iso-8859-1"を"UTF-8"に書き換える。

f:id:koyomi2013:20140206101854p:plain

 

②1009行目 ;mbstring.language = Japanese

f:id:koyomi2013:20140206102034p:plain

頭についてる を削除。

f:id:koyomi2013:20140206102416p:plain

 

③1014行目 ;mbstring.internal_encoding = EUC-JP

f:id:koyomi2013:20140206102624p:plain

 

頭についてる を削除し、 EUC-JPをUTF-8に書き換える。

 

f:id:koyomi2013:20140206102637p:plain

 

 

④1017行目 ;mbstring.http_input = auto

f:id:koyomi2013:20140206102945p:plain

 

 

頭についてる を削除。

f:id:koyomi2013:20140206103022p:plain

 

⑤1032行目 ;mbstring.detect_order = auto

f:id:koyomi2013:20140206103215p:plain

 

頭についてる を削除し、 autoをSJIS,EUR-JP,JIS,UTF-8,ASCIIに書き換える。

f:id:koyomi2013:20140206103306p:plain

 

 

MAMPを再起動して完了!

PHPとMySQLの独学の助っ人本たち

PHPの勉強をし始めて、ひと月が経とうとしています。

わたしの独学の方法は、まず、学びたい言語を、ドットインストールでザッと見る。

分からなくても、取りあえず、動画と同じように手を動かしてみる。

その後、その言語についての本を買ってきて読み、そこに書いてあるスクリプトを書いてみる。分からないところは、ネットで調べながら。調べても分からないものは、Yahoo!知恵袋などで質問。それでも分からないことは、放っておいて、取りあえず次に進む。

そんな感じで勉強してます。

出来るだけ毎日。時間がなくても、1時間だけでも30分だけでもいいから、勉強する。

なぜかというと、間をおくと忘れてしまうから。

言語って不思議です。忘れるのがはやいはやい。だから、筋トレだと思って、少しだけでも毎日目を通すようにしています。

 

PHPMySQLに関する本について。

 最初に「読む」PHP

PHPbook

この本は、近くの書店に置いてあったので買って読みました。

感想としては、マンガが多く描かれているので易しそうに見えますが、

そうでもないかな。

終盤、PHPからメール送信をする項目で、メールが送信できず。。。

XAMPPのメール送信設定のやり方は書いてあるのですが、MAMPのことは書かれていないので、ネットでいろいろ調べたのですが解決せず。。。

なので、そのあたりで、本を閉じてしまいました。

 

 

 次にネットで評判がよかったので、買ったのが、この本。

MySQL以前

 

MySQL入門以前

 

 

この本は、絶版になってしまったそうなので、Amazonで中古で買いました。

今、読んでる最中ですが、評判がいいだけあります!

とっても分かりやすい!

まぁ、この本に出会うまでに、ドットインストールを見たり、先に紹介した『最初に「読む」PHP』を読んだりしていたから、内容がスッと入ってくるという面もあるのでしょうが、それにしても読みやすいです。

 

MAMP設定備忘録〜MySQLのパスワード変更〜

MySQLのデフォルトでは、ユーザー:root、パスワード:rootになっている。

この間、このパスワードを変更しました。そしたら、今日、MAMPを起動した時に、下記のようなエラーが発生しました。

f:id:koyomi2013:20140203203317p:plain

 

ググってみると、やはりこの間パスワードを変更したことが原因のようです。

解決方法を記しておきます。

 

参考サイト:MAMPパスワード変更について « Hello My World

 

①スタートページのパスワード変更

アプリケーション→MAMP→bin→mamp→index.php

);のすぐ直前にある’root’を、新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203204637p:plain

 

MAMP停止時のパスワード変更

アプリケーション→MAMP→bin→stopMysql.sh

-pの直後にあるrootを新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203205559p:plain

 

 

phpMyAdminのパスワード変更

アプリケーション→MAMP→bin→phpMyAdmin→config.inc.php

86行目あたりにある['password']'root'を、新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203210510p:plain

 

 

④mysqlcheckのパスワードを変更

1)アプリケーション→MAMP→bin→checkMysql.sh

-pの直後にあるrootを新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203211232p:plain

 

 

2)アプリケーション→MAMP→bin→repairMysql.sh

-pの直後にあるrootを新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203211654p:plain

 

3)アプリケーション→MAMP→bin→upgradeMysql.sh

-pの直後にあるrootを新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203212019p:plain

 

 

4)アプリケーション→MAMP→bin→quickCheckMysqlUpgrade.sh

-pの直後にあるrootを新しく設定したパスワードに変更する。

f:id:koyomi2013:20140203212258p:plain

 

 

MAMPを再起動して完了!

MAMP設定備忘録〜タイムゾーンの変更〜

MAMPの設定についてのサイトを読んでたら、タイムゾーンを変更しとこう!って記事をみつけた。なんでも、MAMPの初期設定では、ドイツのベルリンのタイムゾーンに設定してあるんですって!ドイツに住んでればこの設定を変える必要はないんだけど、黄金の国ジパング在住の私は、大人しく設定を変えることにします。

 

参考サイト:MAMPの初期設定 - MAMPの使い方 - PC設定のカルマ

 

お使いのPHPのバージョンのディレクトリに移動してください。

アプリケーション→MAMP→bin→php→php5.5.3→conf

php.iniをお使いのテキストエディタなどで開き、date.timezoneをAsia/Tokyoに変更してください。

f:id:koyomi2013:20140130160637p:plain

 

              ↓

f:id:koyomi2013:20140130160644p:plain

 

MAMPを再起動して完了です!