サイトを検索したら配列関数の事が飛んでたので最初に軽く触れます。
休んだ日のやつやが・・・・
implode
配列要素を文字列により連結する。
第一引数:連結する文字列。デフォルトは空文字列。
第二引数:連結したい文字列の配列。
このユーザー投稿が例として分かりやすいです。
4年前の投稿ですけども。すばら。
explode
文字列を文字列により分割する。
第一引数:区切り文字列。文字列にここで指定した文字列があればそこで区切られる。
第二引数:入力文字列
分割した文字列は配列で返される。
dieとexitの違い
こういう話がちらっと出たので。
マニュアルを見る限りでは無いですね。
dieの項目の説明では
「この言語構造は、exit() と同等です。」だけ。
混乱しそうなのでexit()で統一します。僕は。
ggっても一緒くたで語られるし、同じです、と答えているサイトばかりです。
正規表現を使った入力値のチェック
正規表現を用いてこちらが意図したパターン以外の文字列が入力された場合にエラーを出すようなフォームを作る。
正規表現とは
パターンマッチを行う機能。
いくつかの文字列を表現するための表現法。
記法は下記参考サイトで。気が向いたらまとめます。
preg_match
正規表現によるマッチングを行う。
第一引数:検索するパターンを表す文字列。この文字列を正規表現で表す。
第二引数:入力文字列。ここの文字列が第一引数のパターンにマッチするか調べる。
第三引数:検索結果が代入される。
郵便番号だと000-0000のように数字3つ+ハイフン+数字4つとなるので、
正規表現では/^[0-9]{3}-[0-9]{4}$/といった表現となる。
^:行の先頭。ちなみにこの記号のはキャレットという。
[]:指定した文字のどれか。今回は0から9の数字。a-zで小文字アルファベット全てという指定も出来る。
{n}:何回一致させるか。今回は3回と4回で3桁&4桁を表している。
$:行の末尾
その他
\w:大小英数字、アンダースコアと一致
X*:Xと0回以上マッチ
X+:Xと1回以上マッチ
.:なんでもいいので1文字一致。\.だとエスケープ処理されて文字(ピリオド)と認識される
():グループ化。一文字として認識させる。
パターン修飾子(デリミタ(今回はスラッシュ)の後に書くことで、演算子の振る舞いを変化させる。
i:パターン中の文字が大文字でも小文字でも一致するようになる。
D:パターン内のドルメタ文字が検索対象文字列の最後のみに一致するようになる。末尾改行(\n)が一致するリスクを避けたい場合につける
講義で紹介されたチェッカーサイト
PHP:preg_match()正規表現チェッカー ver2.0
Perl・PHP・JavaScriptそれぞれにおける正規表現マッチの動作に違いがあるので他の言語で使うときは要注意
正規表現とデリミタとエスケープ
フォームをメール送信する
まずはメールの送信元を用意する。
方法は3つ
そもそも何も用意しない(ぇ
ホントに何も用意しないです。
送れます。でもどこにも届かないです。
ただ送った内容がxampp/mailoutput内にテキスト形式で保存されます。
開発中ならこれで充分だと思います。
GmailのSMTPを使ってメール送信テストする
phpとsendmailの設定ファイルを書き換えます。
どちらの設定ファイルも変更前にバックアップを取っておきましょう。
xampp/php/php.iniの書き換え
2箇所直します。
;sendmail_path = “\”C:\xampp\sendmail\sendmail.exe\” -t”
ここのコメントアウト(先頭のセミコロン)を外して、
sendmail_path=”C:\xampp\mailtodisk\mailtodisk.exe”
ここをコメントアウト(先頭にセミコロンをつける)します。
この設定にするとxampp/mailoutput内にテキストファイルが保存されなくなりますが、実際の運用では使わないので最終テストおよび運用の際にはこの設定になると思います。
xampp/sendmail/sendmail.iniの書き換え
メールを送る際に送信元となるSMTPサーバを設定します。
今回はGmailのサーバを使いますが、運用サーバの設定と置き換えればそのまま使えると思います。
変更箇所
SMTPホスト
smtp_server=mail.mydomain.com
↓
smtp_server=smtp.gmail.com
ポート番号(GmailはSSL認証のため587)
smtp_port=25
↓
smtp_port=587
認証情報
auth_username=
auth_password=
↓
auth_username=ここにGmailアカウント(ドメインは無し)
auth_password=ここにパスワード
送信元
force_sender=
↓
force_sender=ここにメールアドレス
全て書き換えたらApacheの再起動をすれば送信可能になります。
ローカルでメール送信テスト環境を作る
xamppに同梱されているMercuryを使って環境構築します。
ggって何時間も格闘したがダメだった・・・・
とりあえず記事を書き終えたいので今日は諦めて出来次第記事にします・・・
教えてエロい人・・・・
っていうかちゃんとメール送信の原理と向き合わないとダメだよね・・・ぐふ
コード
送信完了画面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php require_once '../php_include/Encode.php'; session_start(); // 中略 $ini = parse_ini_file('mail.ini', FALSE); $headers = <<<HEAD From: {$_SESSION['email']} Return-Path: {$_SESSION['email']} Content-Type: text/plain;charset=ISO-2022-JP HEAD; $body = " ".SUBJECT." \n"; foreach ($_SESSION as $key => $value) { if (is_array($value)) { $value = implode(',', $value); } $body .= "[{$key}] {$value}\n"; } mb_send_mail($ini['mailto'], $ini['subject'], $body, $headers); // 動作確認用コード //if (mb_send_mail($ini['mailto'], $ini['subject'], $body, $headers)) //{ // echo '送信完了'; //} else { // echo '送信失敗'; //} ?> |
メール設定ファイル
[sendmail] subject = 'メールの件名' mailto = '送信先のメールアドレス'
parse_ini_file
設定ファイルをパース(構文解析)する。
第一引数:パースしたいiniファイル名
第二引数:セクション名を含めるかどうかデフォルトはFALSE
セクション名を含めるとセクション名を含む多次元配列を得られる。
マニュアルの例を元に説明すると、
$ini = parse_ini_file(‘sample.ini’, TRUE);の場合
$ini[‘second_section’][‘URL’]はhttp://www.example.com/~usernameを返します。
例2が分かりやすく書かれてます。
mb_send_mail
エンコード変換を行ってメール送信する。
第一引数:送信先のメールアドレス。
第二引数:メールの件名
第三引数:メールの本文
第四引数:メールヘッダの最後に挿入する文字列。ヘッダ情報を追加する際に指定する。省略可。
即時チェックしたい場合は、動作確認用に用意したコードを使ってみましょう。
最終確認は実際にメールが届いたか見ないといけませんが。
受信したメール(というかテキストファイル)
To: example@gmail.com Subject: =?ISO-2022-JP?B?GyRCJTUlJCVIMn5BMSUiJXMbKEI=?= =?ISO-2022-JP?B?GyRCJTEhPCVIGyhC?= From: sample@aa.aa Return-Path: sample@aa.aa Content-Type: text/plain;charset=ISO-2022-JP MIME-Version: 1.0 Content-Transfer-Encoding: 7bit SUBJECT(メールベースだとiniに設定した件名) [qnum] 2 [correct_count] 5 [num] 7 [token] 6974d30cf2681a1e5b16e64e12014863 [name] ああああああ [email] sample@aa.aa [sex] 女 [zip] 111-1111 [age] 10 [os] win,mac [message] test [quest_num] XXX00001
フォームにセキュリティ対策をする
IPAの安全なウェブサイトの作り方(PDF)を読むと色んな脆弱性について触れられているので一通り目を通すとよいかもしれません。
メールヘッダ・インジェクション対策
メールヘッダ・インジェクションとはメールヘッダに不正な値を挿入し、メール内容を改ざん悪用されてしまう脆弱性のこと。
改行文字(\n)を挿入して本来セットしていなかったBccをセットして迷惑メールを送ったりなどされる場合がある。
メールヘッダを固定値にする対策を採りたいが、
今回はメールヘッダの中にユーザーが入力したメールアドレスを挿入する為、
正規表現を使って可能な限り想定した値以外入力できないようにする。
1 2 3 |
if (!preg_match('/^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/iD', $_SESSION['email'])) { $errors[] = 'メールアドレスが不正です。'; } |
@は一個のみ、@以降のドメインの記述には必ず英数字1文字以上+ピリオドを一回は打つ+英数字1文字以上、などメールアドレスに必ず含まれるパターンを表現している。
CSRF(クロスサイトリクエストフォージェリ)対策をする
クロスサイトリクエストフォージェリとはWebサイトにスクリプトやリダイレクトを仕込んで閲覧者に別サイトで何らかの操作を行わせる。
古くは「ぼくはまちちゃん」やら最近だと神奈川のポリスが嵌められた(のか?)送信元のIPアドレスを信じちゃって誤認逮捕した遠隔操作事件なんかがありますね。
ではコード。
入力フォーム
1 2 3 4 5 6 7 8 9 10 11 |
<?php // 中略 $token = md5(uniqid(mt_rand(), TRUE)); $_SESSION['token'] = $token; ?> <!DOCTYPE html> <html> <!-- 中略 --> <input type="hidden" name="token" value="<?php print($token); ?>"> <!-- 中略 --> </html> |
完了画面でポストのtokenとセッションのtokenが一致しているかチェックして不一致の場合はエラーメッセージを出す。
md5
文字列のmd5ハッシュ値を計算する。
ハッシュ値とは、固定長の擬似乱数。
今回はuniqidとmt_rand(後述)を用いて一意な乱数を生成してトークンとして実装している。トークンってなんぞや?という方はこちらをどうぞ。
uniqid
一意(ユニーク)なIDを生成する。
第一引数:プレフィックス(接頭辞)。mt_rand(後述)を用いてマイクロ秒でIDがバッティングする可能性を出来る限り防ぐ。
第二引数:エントロピーの追加。TRUEにすると13文字から23文字へと文字列が増加する為、よりユニークなIDになる可能性を高める。とりあえずは情報量の増加、と覚えておけば差し支えない。てゆーか使うっしょ。さすがに。
mt_rand
よりよい乱数値を生成する。
よりよい・・・・?乱数生成器がrandよりいいらしいです。なんかちゃんと調べた方がいい気がするけど今回は忘れよう・・・
今回は引数を取らないため、uniqidの最大の長さまで生成する。
32進数より大きいと偶数寄りになるらしいです。
何でもかんでもこれでいいって訳じゃないようですね。
今回は16進数なのでOK。
しんどい・・・・
って今何時だよ・・・・アホか・・・・
明日(てかもう今日ですお)は今日のひとことが復活できるように頑張ろう。訓練仲間が楽しみにしてたらしいので。
あれは自分自身の集中のバロメータにもなってるから復活するべきですわ。実際。
コメント
No Trackbacks.