質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

2208閲覧

`filter_input`に文字列はないのでしょうか?

uchiwa

総合スコア4

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2020/11/09 17:14

編集2020/11/09 17:49

filter_inputに文字列はないのでしょうか?

現状で'a''b'の値をPOSTで得て、次のようにしています

php

1$alphabet = isset($_POST['alphabet']) ? $_POST['alphabet'] : false; 2if ( $alphabet !== 'a' && $alphabet !== 'b' ) { 3 die('alphabetが不正です'); 4} else { 5 // $alphabetを使ってデータベースから値を取得する処理をここに書く 6}

これでは危険らしくfilter_inputを使うべきと知りまして、マニュアルを見るといくつかオプションがあったのですが、

マニュアル
https://www.php.net/manual/ja/filter.filters.validate.php

上記マニュアルのどこにも文字列のバリデーションがありません。

数値ならFILTER_VALIDATE_INTだったりメールならFILTER_VALIDATE_EMAILだったりとあるのに、文字列の場合はどうしたらよろしいでしょうか?

fugusuki2202👏を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/09 22:36

どのような「危険」を想定していますか?
uchiwa

2020/11/09 22:51

どんな危険があるとか知らないレベルです…
maisumakun

2020/11/09 23:00

ほとんどのセキュリティ対策は、想定される特定の危険と対応するものですので、想定がなければ考えることはできません。
uchiwa

2020/11/09 23:03

えっと、'a'|'b' のみ許可としたいのですが、危険を想定しなければなりませんか? 例えば家に鍵をつけるとき「鍵を持つものだけ許可」と思うのが通常で、「泥棒が入るかもしれない、近所の子供が勝手に入るかもしれないetc」などは想定しないと思いますが、この考えはプログラミングにおいては間違っているのでしょうか?
maisumakun

2020/11/09 23:04

> 危険を想定しなければなりませんか? 「これでは危険らしく」と書いたのはuchiwaさん自身ですよね?
uchiwa

2020/11/09 23:08

えっと、そうですけど… 普通家に鍵をつけるとき「この近所は危険らしいから鍵をつけておいた方がいい」って思いませんか? そこで鍵屋さんに行ったら「どんな危険があるか想定してこい」と言われましても、「とりあえず鍵かけたいんですけど」ってなると思うのですが… 何がおかしいのかわからないです。
maisumakun

2020/11/09 23:29 編集

> 何がおかしいのかわからないです。 玄関の鍵は、「家に不適切に侵入される」という1種類の脅威への対策だということが明らかですが、コンピューターセキュリティ上の脅威は何通りも考えうるものです。 ある条件では「必要な機能」が、別な条件では「対策しなければならない脅威」となることすらありえます。
退会済みユーザー

退会済みユーザー

2020/11/09 23:30

> どのような「危険」を想定していますか? これ、ちゃんと意識した方が良いですよ。 参考:https://teratail.com/questions/63786
uchiwa

2020/11/09 23:45

えっと、コンピューターセキュリティ上の脅威ですか…全然わからないですね…
uchiwa

2020/11/09 23:46

te2jiさんリンクありがとうございます。参考にさせていただきます。
guest

回答4

0

送られる情報自体が全て基本的に文字列で、その中の形式をチェックするものなので「文字列かどうか」というものはないです。
emailだってそういう文字列の集合体です。あくまで「どういう文字列かをチェックしている」と思ってください。

投稿2020/11/09 21:28

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uchiwa

2020/11/09 21:57

なるほどそういうものですか。 そうなりますと、質問の 'a'|'b' のみ許可という場合、どうバリデーションしたらいいのでしょうか? もしお時間ございましたらバリデーションのソースコードを頂戴できましたらばと。
m.ts10806

2020/11/09 22:15 編集

filter_inputで取得した変数を個別でチェック。質問に提示されたコードでほぼできてます。
maisumakun

2020/11/09 22:38

> 送られる情報自体が全て基本的に文字列で 配列が来ることはありえます。
m.ts10806

2020/11/09 22:48

はい。ですので「基本的には」と書きました。
uchiwa

2020/11/09 22:57

なんでトゲトゲするんですか…汗汗
m.ts10806

2020/11/09 23:27

ん?これでトゲトゲと言われても…。 淡々と事実をやり取りしているだけですよ。特に尖った感情とかはないです。
m.ts10806

2020/11/09 23:29

「フィルタリング」と「バリデーション」は厳密には違う概念ですので、「バリデーション」をしたいのでしたら、あくまで自身で組み込む必要があります。
uchiwa

2020/11/10 00:12

ああなるほど! フィルタリング → filter_input バリデーション → if ( $alphabet !== 'a' && $alphabet !== 'b' ) であって、質問の 'a'|'b' のみ許可という場合、結局こう書くしかないというわけですな。 ありがとうございます。
m.ts10806

2020/11/10 00:17

フィルタはいわば「ふるい」なので「受け取る前に」どうするか バリデーションは「受け取った上で利用する前に」どうするか だと私は解釈しています。 特に今回はuchiwaさんが独自にチェックしたい要件なので受け取ったあとに内容確認するしかないのです。
m.ts10806

2020/11/10 00:23

「しかない」というより、「受け取りとバリデーション一緒に書くのは実装的に読みづらくならないか」という懸念の方が強いかもしれない
m.ts10806

2020/11/10 00:24 編集

他のコメントにあるように「これくらいで正規表現使うのもねえ」というのもあります。 要件が仮ではなく具体的なものならもっと発展的なアドバイスもできるのでしょうけど。
uchiwa

2020/11/10 00:26

なるほど。yambejp様、te2ji様のコードはフィルタの方法に文字列を入れることでバリデーションを一緒にやっていて、私もこれを指してバリデーションと呼んでいたのですが、理解が進みました。 そう理解すると、仰る読みづらさというのもわかる気がします。 まっ今回はせっかく知ったので正規表現でいってみます。たびたびありがとうございました!
hentaiman

2020/11/10 00:30

バリデーションっていうと文字通り検証です ログインの場合だとインプット確認するだけじゃ無理ですよね。 この場合だとID/PWが正しいかどうかDBに問い合わせた結果を以て判定する事でバリデーションと言いますね
guest

0

ベストアンサー

PHP

1$alphabet=filter_input(INPUT_POST,"alphabet",FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/^[ab]$/"]]); 2var_dump($alphabet);

投稿2020/11/10 00:15

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uchiwa

2020/11/10 00:21

ありがとうございます。本当に助かりました。 [ab]と一緒にするのですね。 (a|b)ではまずいでしょうか?
yambejp

2020/11/10 00:31 編集

(一部補足) 正規表現の話ですね [ab]と(a|b)は1文字の比較の場合、 基本的に同義ですのでどっちでもいいです [abcd]≒(a|b|c|d) []の場合は否定ができるのが特徴です [^abc]=「abc以外」にヒットします いっぽう|区切りの場合は複数文字の比較に利用できます (ab|cd)=「ab」か「cd」
uchiwa

2020/11/10 00:27

よくわかりました。ご返信どうもありがとうございます!
uchiwa

2020/11/10 11:01

(一部補足)←ありがとうございます。それぞれのメリット覚えておきます。
guest

0

filter_inputを使う場合、「FILTER_REQUIRE_SCALARで配列を弾く」ということは必要かもしれません。

alphabet[]=fooのようなクエリを送られると、$_POST['alphabet']配列になります

投稿2020/11/09 22:29

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/09 22:31

> filter_inputに文字列はないのでしょうか? $_GETや$_POSTで送信できる値は、もともと別ハンドリングが必要なファイルを除けば「文字列」と「文字列の配列」だけなので、配列を弾けば得られる値は文字列です。
uchiwa

2020/11/09 22:59

確かに配列ではないので弾いた方がいいかもしれません。そちらのオプション調べましても「スカラーを必須とする」といった説明しかなく理解できなかったのですが、質問の 'a'|'b' のみ許可という場合、どうバリデーションしたらいいのでしょうか?
maisumakun

2020/11/09 23:01

> 質問の 'a'|'b' のみ許可という場合、どうバリデーションしたらいいのでしょうか? それは別途チェックしてください。
uchiwa

2020/11/09 23:11

別途チェックというのは、すみませんどういうことでしょうか?
maisumakun

2020/11/09 23:13

if ( $alphabet !== 'a' && $alphabet !== 'b' )と、すでにuchiwaさんが書いているコードのとおりです。
guest

0

FILTER_VALIDATE_REGEXPでイケるんじゃないかなぁ。。。
ただ、あんまり正規表現使いたくない感じですけど。

php

1<?php 2$arr = ['hoge', 'fuga', 'piyo']; 3 4foreach($arr as $val){ 5 var_dump(filter_var($val, FILTER_VALIDATE_REGEXP, ['options'=> ['regexp' => '/^(hoge|piyo)$/']])); 6}
string(4) "hoge" bool(false) string(4) "piyo"

投稿2020/11/09 22:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uchiwa

2020/11/09 22:55

どうしてfilter_varにしてしまったのでしょうか?汗汗 filter_inputで知りたいのですが、もう少しお助けいただけないでしょうか。 以下ではいけませんよね?filter_varからfilter_inputへの変換がわからないのです。 $alphabet = ilter_input(INPUT_POST, 'alphabet ', FILTER_VALIDATE_REGEXP, ['options'=> ['regexp' => '/^(a|b)$/']]));
退会済みユーザー

退会済みユーザー

2020/11/09 23:01

> どうしてfilter_varにしてしまったのでしょうか?汗汗 知りたかったのは、適用すべき検証フィルタなのでは?
退会済みユーザー

退会済みユーザー

2020/11/09 23:15 編集

うーん。やっぱり、ここで正規表現まで使ってフィルタしたくないなぁ^^; 他の回答者のコメントのように、別途チェックが妥当な設計な気がします。
uchiwa

2020/11/09 23:11

POSTで'a'|'b' のみ許可としたいので、そのプロセスで検証フィルタが必須なのは間違いございませんが、それだけでは先に進めません…filter_varからfilter_inputへの変換がわからないのですが、そこは教えてはいただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問