1. 4cres

    No comment

    4cres
Changes in body
Source | HTML | Preview
@@ -1,135 +1,122 @@
**2017年1月27日追記**
Googleのアクセス解析を見たら、僕が書いた記事の中で、意外にもこの記事が一番アクセス数が多いです。
全然「いいね」や「ストック」もされてませんが、この記事だけで月間2,000ページビュー以上あります。
おそらく、Qiitaユーザーでもない通りすがりの方が見てくれているのかと思います。
+**今まで覚書のように要点のみ書いていましたが、アクセスする方も多いので、より詳説に書き直しました。**
**この記事を読んでもわからないことがあれば、コメントください。**
-**それにあわせて、記事をアップデートします。**
-#はじめに
+#**はじめに**
-これは駄文である
+そもそも、POSTやGETについて理解していない方は、下記が参考になると思います
-こんな記事を見るのに時間を使うなら mpyw 氏の「
-[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」を見た方が有意義ですよ。
++ [【PHP超入門】HTTP(GET・POST)について](http://qiita.com/7968/items/4bf4d6f28284146c288f)
-とりあえず、初学者が初学者に向けて説明してみる。
+#**チェックボックスを配列にするには?**
-#チェックボックスの値はどのように取得するの?
+HTML側で name を記述するときに `[]` を最後に付けると配列になります。
+下記のように `food[]` のようにします。
-チェックボックスの値は、配列でくるよ。
+```html:html
+<h2>好きな食べものは?</h2>
+<form method="post" action="">
+ <input type="checkbox" name="food[]" value="寿司"> 寿司 
+ <input type="checkbox" name="food[]" value="天ぷら"> 天ぷら 
+ <input type="checkbox" name="food[]" value="芸者"> 芸者 
+</form>
+```
-このようなチェックボックスがあると仮定。
+#**チェックボックスの値はどのように取得するの?**
-```
+`[]` を付けることで、PHP側で配列として受け取れます。
+先ほどと同じように下記の HTML があったとします。
+
+```html:html
<h2>好きな食べものは?</h2>
<form method="post" action="">
<input type="checkbox" name="food[]" value="寿司"> 寿司 
<input type="checkbox" name="food[]" value="天ぷら"> 天ぷら 
<input type="checkbox" name="food[]" value="芸者"> 芸者 
</form>
```
-`$_POST['food']`にチェックボックスの値が配列として格納されているから、変数に代入すればいいだけ
+`method` に `post` と記述しておりますので、postメソッドで送られてきます。
+postメソッドについて理解していない方は、先ほどの [【PHP超入門】HTTP(GET・POST)について](http://qiita.com/7968/items/4bf4d6f28284146c288f) をご覧ください。
+`$_POST['food']` にチェックボックスの値が配列として格納されています。
+それを下記のように変数に代入するだけでチェックボックスの値を受け取れます
-```
+```php:php
<?php
$food = $_POST['food'];
```
-既に配列になっているので、for文とか使う必要ないよ。
-
-試しに`$food``var_dump($food)`してみると下記のように配列になってるよ
+既に配列になっているので、変数に代入するときにfor文とか使う必要はありません。
+試しに先ほどの変数 `$food``var_dump($food)` してみると下記のように配列になっているのが確認できます
-```
+```php:php
array(3) {
[0]=>
string(6) "寿司"
[1]=>
string(9) "天ぷら"
[2]=>
string(6) "芸者"
}
```
-ここではわかりやすくするために、`$_POST['food']`の値をそのまま`$food`という変数にぶち込んでますが、これは絶対ダメ。
-
-私の駄文を見に来る方は、超初心者だと思う(なぜなら私が超初心者だから)ので、あえて説明する。
-
-[MDN](https://developer.mozilla.org/ja/docs/Web/Guide/HTML/Forms/Sending_and_retrieving_form_data)の最後の方に書いてある通り、ユーザーから送られてくるデータは信用してはいけません。
-
-下記の引用にある通り、必ずデータはチェックすること。
-
-> サーバに来るすべてのデータを確認およびサニタイズ(※1)しなければなりません。<ins>いつでもです。例外はありません。</ins>
-
-例外はない。絶対だ。
-
-繰り返す。例外はない。絶対だ
+ここではわかりやすくするために、`$_POST['food']` の値をそのまま `$food` という変数に代入しましたが、この方法はダメです。
+なぜなら、GETやPOSTなどで送られくる値は、偽装可能なためです。
+チェックボックスやプルダウンだと、こちらで用意した値した送られてこないと思いがちですが、GETやPOSTなどで送られくる値は、全て偽装可能なため信用できません。
+先ほどの例で言うと、寿司、天ぷら、芸者 以外の値が送られてくることもあります。
+そこら辺についても [【PHP超入門】HTTP(GET・POST)について](http://qiita.com/7968/items/4bf4d6f28284146c288f) で説明されているので、理解していない方はご覧ください。
+
+#**じゃあどうやって確認するの?**
+
+値のチェックの仕方は、 mpyw 氏の「
+[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」が詳説ですが、僕なりに説明してみます。
+
+今回、配列として受け取ります。
+受け取るときに未定義またはNULLではないか、また配列かどうかを確認します。
+未定義またはNULLではないかを確認するには `isset()` 関数を使います。
+配列かどうかは `is_array()` 関数を使います。
+if文を使い、値を確認し、未定義でもNULLでもなく、配列だった場合に `$food = $_POST['food'];` として値を受け取ります
-え?「JQueryで入力チェックしてます(キリッ 」だって・・・
-
-クライアント側で入力チェックしても意味はない。(利便性が向上するという点では意味ある)
-
-必ずサーバー側(PHP)で確認しろ。絶対だ。
-
-<b>※1 サニタイズという用語について神様からコメント頂いたので、そちらも見てね。</b>
-
-#じゃあどうやって確認するの?
-
-チェックの仕方は、最初に紹介した mpyw 氏の「
-[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」を見てもらうのが一番。
-
-なぜなら、私は超初心者だから。
-
-言い訳も済んだので、確認の仕方を説明しようと思う。
-
-データを確認するのに`isset`と`is_array`を使おう。
-
-`isset`では未定義またはNULLではないことを確認。
-
-`is_array`では配列かどうか確認。
-
-組み合わせるとこんな感じ。
-
-```
+```php:php
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
$food = $_POST['food'];
}
```
-未定義またはNULLではなく、配列だった場合に`$food`に`$_POST['food']`を代入してるよ
+配列はアロー演算子 `=>` を使うので、少し難しいです。
+配列を文字列にすることもできます
-これでチェックボックスの値が受け取れたよ。
+#**どうやって文字列にするの?**
-ただ、配列って`=>`こんな記号使うし難しいんですよ。(おい!覚えろよ)
-
-難しい配列やめて文字列にしちゃおう。
-
-#どうやって文字列にするの?
-
-`implode`を使えばOK
+`implode`関数使えば、配列を文字列にしてくれます。
+受け取るときに`implode`関数を使いましょう
```
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
$food = implode("、", $_POST["food"]);
}
```
-これで `、` で区切った文字列になるよ。
-
-`寿司、天ぷら、芸者`のような文字列だよ
+これで `、` で区切った文字列として受け取れます。
+全てにチェックがあった場合は `寿司、天ぷら、芸者` という文字列として受け取ります
-おしまい。
+# **最後というか一番伝えたいこと**
-あっ!この記事では確認のところしか説明してないよ
+この記事を見てる方は、メールフォームや掲示板などのWebアプリケーションを作るたいと考えているのかと思います。
+Webアプリケーションを作るのにセキュリティ対策が欠かせません。
+先ほど紹介した下記は必ず見るようにしてください
-> サーバに来るすべてのデータを確認および<ins>サニタイズ(※1)</ins>しなければなりません。いつでもです。例外はありません。
++ [【PHP超入門】HTTP(GET・POST)について](http://qiita.com/7968/items/4bf4d6f28284146c288f)
++ [$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)
-サニタイズもしましょうね
+セキュリティに関して体系的に学びたいなら、下記の書籍がお勧めです
-サニタイズってなんぞやって方は、調べてね。
+* [体系的に学ぶ 安全なWebアプリケーションの作り方](http://www.sbcr.jp/products/4797361193.html)
-おしまい。
+セキュリティ対策について、必ず学ぶようにしてください。
-<b>※1 サニタイズという用語について神様からコメント頂いたので、そちらも見てね。</b>