【PHP】下らねぇ質問はここに 9
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問スレです
前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 8
http://mevius.5ch.net/test/read.cgi/tech/1489506082/
次スレは>>980以降
本文の1行目に以下を追加すること
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>418
filter_input じゃ、ググれないよ。
グローバル変数を使用しない理由を検索してみるといい。
キーワード知らないと、ググれないっていうのはそういうこと。 >>419
@t_wada の前でも同じこと言えんの? 既存コードを修正すべきだとまでは言わないが, 新規コードにはfilter_inputを使うべきだという点に関しては疑う余地がない >>420
つまり、公開されているPHP関連のサイトではそのような話題が出ていないと言うことでOK? >>419
んまあデバッグしたりコマンドラインでも実行できるようにしたりする可能性を考えると、HTTPリクエストの扱いは浮かせて置いた方がいいかなって気はするよ。
後は同意。
$_POST がダメで filter_input ならいいって話には繋がらないと思うし、$_POST をわざわざ書き換えるならあえてそういう設計なんだろうけど、それが甘いか明確になってないだけじゃねとしか思わん。
そういう設計はかくかく然々でお勧めしないよって話ならまだ聞ける。
ちなみに >>416 は見たよ。
話のうまいやつで面白かったよ。
PHP にも assert あったのね。しかも運用時にいないことにできるとか、なかなかいいじゃないか。 キーワードで検索出来ないってことがとても不自然に感じるんだけど
普通に推奨されていると言うなら、行う記事があってもおかしくはないよね
まさか、この関数が非公開関数で秘密にしないといけないものだったりして >>423 >>425
グローバルスコープな変数使うなよって話以上に何が聞きたいの?
グローバル使用しない代替手段使おうねって話でしか無いんだけど^^;
そろそろ理解しようよ。 >>426
それならそういえば良いでしょう
変な関数持ち出す必要もないし
普通に推奨されているなんて言いだすから
サイトを教えてくれと言う話になってるんだし >>426
よく言われるようなグローバル使うなって話は、自分で定義するのは極力避けましょうってことであり、用意されてるものを使うなって話ではないんじゃない? そんな事実上の内部バグを問題にするよりも
リクエスト投げてくるのは、こちらが用意したフォームとは限らない、
想定外のリクエストに乗せられることが現実に発生するんだし、
そちらのチェックの方が重要だと思うよ
そういう実際的な話題を提供して議論する方が良いと思うな >>428
最初っから、そう言ってるんだぜぃw
> >>399
> 前者が危険な理由はキーワード知らないと filter_input でググってもでてこないと思うけど。 途中で投稿してしまった。
> $_POST が危険って言われるのは、変更可能なスーパーグローバルだから。
> filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物。
> ググってでてくる情報で、変数汚染に触れてる記事はないので、概要知らないとたどり着けないんだぜぃ! >>429
改変されるリスクの有無は同じなので、限定した話ではない。 ググっても出てこない関数がどうして普通に推奨されていると言うのか、
その根拠を聞きたかったんですが
そんなに話題に上らない関数と言うことで良いんでしょうか? しつこくて済みませんが、グローバル変数を使うなと言うのは、一種の宗教だと思うんです
信じる人はそうすれば良いけど、信じない人はそうしなくてもいいと言う程度で PHP The Right Wayくらいは必読だと思う
ttps://www.phptherightway.com/#data_filtering
理由もなくスーパーグローバルを直接叩くようなコードを新しく書いたならそれだけでrejectするに足る
それ以外のグローバル変数も納得出来る説明がコードやコメントに無いならreject エラーが起きない方法をとるのに越した事はないと思うけど、何をそんなにむきになってるのだろう >>436
そこからどこまで読めばお前さんの言いたいことが書いてあるのが分からんが、とりあえず外部データをサニタイズせずに使うことの危険性なんかを説明してるのかな?
それを解決するのに filter_input や filter_var を使えますよという話だよね?
グローバル使うな的な話は書いてないようだが、ただ実はもしやと思ってたんだけど、register_globals を使うなって話と混同してるんじゃない?
それは危ないから使わない方がいいよ。
そしてそれは $_POST を使うななんてこととは全く関係無い。 >>434
ずっと同じことのループやねぇ。。。
> ググっても出てこない関数がどうして普通に推奨されていると言うのか、
ググって出てこないのは、$_POST の危険な理由。
関数としては各所で便利だぜぃ。って紹介されている。
PHP The Right Way もその一つ。 >>435
> しつこくて済みませんが、グローバル変数を使うなと言うのは、一種の宗教だと思うんです
宗教じゃなくて、意識の話。読みやすく/使いやすく/再利用性の高いコード書くことを意識していれば、グローバル変数の使用はまず避けるように設計する。
避ける気がないのは、読みやすく/使いやすく/再利用性の高いコード書く意識が無いってだけ。 >>435
他言語しか知らないけど、グローバル変数なんてめったに使わない
>>440
PHP勉強中だけど、教本のサンプルって短いからグローバル使いまくり
いいコードの書き方ってなかなかないね
やっぱり実践のコード((またはきれいな)が見たいよ filter_input 自体は $_POST使っているんでしょ? >>440
だからさ、自分でわざわざグローバル変数作るなってことだろ、それは。
既に用意されてるものを使うなって理由としてグローバル変数だから(誰でも書き換えられるから)ってのは意味が分からんだろ。
わざわざ示されたもの読んで言ってるんだから >>438 にも答えてくれよ。 >>443
ずっと同じことのループやねぇ。。。
> 改変されるリスクの有無は同じなので、限定した話ではない。
改変されるリスクの有無は同じなので、限定した話ではない。
この辺が、結合を疎にする意味。
> わざわざ示されたもの読んで言ってるんだから >>438 にも答えてくれよ。
オレが示したわけじゃないんで解釈あってるか分からんけど、普通に読めば「ググっても出てこない関数がどうして普通に推奨されていると言うのか、その根拠を聞きたかったんですが」に対するコメントだと思うぞ。
filter_input 紹介している有名記事を教えてくれたんでしょ。 >>442
filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物。
試してみるといいよ。オレも最初試したw >>444
あ、ごめん
別の人と混同してたわ
それはそれとして結合を疎にする話、自分でグローバル変数を用意してそれを介して複数クラスやモジュールでコミュニケーションするって話ならそれは結合が密だと言えると思う。
でもただシステムが用意してるリソースを参照するからと言ってそれが密かと言えばそうじゃないし、密だったとしてそれを疎にするためにラップしなさいっていうならそれは分かる。
filter_input 使ったところで何が疎になってるの?って感じだけど、そこらへんどうなの?
若干繰り返しになるけど、PHP固有の関数である filter_input 自体を直接参照せずラップしましょうってところまで行ってるのであれば、そういう方法論もあるかと思うよ。
グローバル変数誰かが書き換えたら不具合が起こるって、スコープが狭いだけでクラスメンバ変数を誰かが書き換えちゃったらという話と同じような話でしょ。
早い話、選定してるものを仕様通りに使ってないという問題なんだかrさ。 個人的には $_POST をリードオンリーにして使ってるが、俺だけだろうな >>446
filter_input は HTTP で投げられた値を直接参照するので、$_POST とは全然別物
スーパグローバル変数は「参照」できるだけでなく、「書き込む」こともできるのでどう使っても密になる。
オブジェクトのプロパティに「POST内容を突っ込んでおく」場合でも、スーパーグローバル変数を使用して取り出すと行儀の悪いモジュールやライブラリに邪魔される可能性が残る。
取り出しのときに読み取り専用の関数を使用すると、そういった結合を疎にすることができ、予防的にコードが書ける。
で、ここで言う読み取り用の関数が filter_input
> グローバル変数誰かが書き換えたら不具合が起こるって、スコープが狭いだけでクラスメンバ変数を誰かが書き換えちゃったらという話と同じような話でしょ。
読みやすく/使いやすく/再利用性の高いコード書く場合は、発想が逆でそういった事をさせないように設計する。
堅牢なコードを理解してないみたいなんで、これでも見て意識改善するといいよ。
https://youtu.be/17i1EL9pBwA これ以上やっても信仰する宗教のようなのでやめますが
php.netで $_POST変数が非推奨になり、filter_input関数が推奨になったら
その時に考えることにします
今は、いくつかある対策方法の一つとして聞いておきます >>448
書き込めたら密だって?
なんかワケわからんが、お前さんの言う密って何?
ちなみにそれは見たよ。 >>450
複数クラスやモジュールでコミュニケーションしてしまう状態 あなたはそういう風に使いたいのかも知れないが
普通の人はそうは使わない
いつまで自分の信仰に拘るんだろう >>452
グローバル変数の汚染を回避する設計って普通だぞ^^;
新興でも何でも無い。 汚染する犯人は自分以外にいないんですが
多重人格者でもなければ心配ないでしょう >>454
3ヶ月目の初心者みたいなこと言うなよ。。。
堅牢なコードを理解してないみたいなんで、これでも見て意識改善するといいよ。
https://youtu.be/17i1EL9pBwA 汚染の原因なんて事前に特定出来るでしょう
それが出来ない人だから、こんなことするの? >>456
だから動画見ろってw
汚染も含めて「影響を受けない/受け付けない」コードの書き方を研究して、公開してくれてるんだから。 一か月前の自分は他人だよ
一年も経てば細部なんて何も覚えてない
俺は自分にそこまで自信を持てないわ 防げるのはせいぜい自分が書く内部バグくらい?
外部からの攻撃については無力
コツコツとバリッドチェックを用意することになるのは変わらない
こんなんでも堅牢なシステムだって言えるんだろうか グローバル変数に対して誤って代入している箇所を見つける事が
そんなに難しいことなんだろうか? >>456 は結局のところ「注意すれば事足りるでしょ?」ってことを昨日からずっと言い続けてるよね
その注意をかける負担を減らせる手段を一つでも盛り込む事に反発する理由なんて一つもないと思うんだけどな
俺の頭がおかしいのかそうじゃないのかよく分かんなくなってくるじゃん 誤った代入ならローカル変数にだってあり得るが
こういうロジックミスはそれを使っても防ぎようがない
丹念にチェックし潰していくしかない あと宗教だの信仰だの言ってるけど、頑として自分の主張を曲げずにずっと言い続けてるってのは、結局のところそれは「別の宗教(信仰)」なのでは……? 経験により積み重ねてきた手法を変えるというのは
それだけの説得力が必要なんだと思います
だから布教は大変なんでしょう 堅牢と言っているけども、何から堅牢かと言えば、自分自身が書く記述の誤りから堅牢になると言うこと
プログラムから見たら、グローバル変数だけをガードしてからと言ってバグフリーになるわけじゃない
また、Webサイトとして堅牢をうたうなら、それは外部からの攻撃に対しての話だし
今回提案された関数を使おうと、その点については無力のまま
この辺が改善されたら導入を考えようと思うんですが、如何ですか? >>466
オマエほんとバカだろ。。。
動画見ても全然理解できないと思うけど、まず見てみ。
会話が成立しないくらいズレたことコメントしてるってだけでも理解したほうがいい。 >>466 の提案を受け入れたら考えます
出来ないなら、これで終わります >>468
なんで交換条件なんだよw
そのままズレてろ。どうでもいいわ。 >>461
注意すれば足りるっつうか、$_POST に値を代入しないようにコードを書くのがそんなに大変なの?
わざわざそういう設計をしなけりゃそんなことしないし、そうしてるなら必要だからしたんだろうから仕様に沿って使えばいいんじゃね?
ということなんじゃないの。
いや別に filter_input を使うなと言ってるのではないし使えばいいじゃんと思ってるが、$_POST をそこまで忌み嫌うのが意味分からんてことだよ。
それで疎にするとか持ち出してきて、$_POST の代わりに filter_input 使えば疎になるって何のこっちゃ?って感じだろう?
堅牢になるぜならまだ分かるが、疎って?ってさ。
疎にするって話ならと >>415 みたいな手法を持ち出してみたらそれには同意してもらえてるっぽいが、filter_input 使えば疎って話ではないだろってところは通じてないっぽいんだよな。
なんつうか、意識高い系なんだろうなって感じ。 チームで開発したことないんだろ、きっと
それか、一人で十分な開発規模
あるいはチームでテレパシーw スーパーグローバルとfilter_inputに関してはPHP特有だし多少議論があるのは理解する
それでもfilter_inputの方がベターだと思うが
しかしグローバル変数使うなが納得出来ないというのはお話にならない 正直、ここしばらくフレームワークの世話になってたから
$_POSTもfilter_inputも明示的につかったことない
でも、ざっと見た限りではよっぽどトリッキーなことしない限り
filter_inputをつかわない理由はないな >>470
密とか疎に対して「結合」って使ったから良くなかったかもね。
結合というより、関係性かなぁ。
$_POST が変更可能な変数であり、かつどこでも使用できるため、使用箇所の関係性が密になってしまう。
値が変更になれば、当然後続が影響を受けるから密ね。
だから、http から直接値を引っ張ってくる filter_input 使用することで、どこで使用しても一律な値を保証できるよう関係性を疎に保とうよ。
って書きたかったんだわ。
結局、$_POST 使用するたびに、プロジェクト全体を grep するとかアホらしいので、新規にコード書くならまず $_POST は使わん。って程度の決意。 ところで $_FILES や $_SESSION へのアクセスはどうやってるの? >>475
回避不能だねw
基本はフレームワークに閉じ込めて、自分では $_FILES とか $_SESSION は書かない。
で、どうしても自分で書かなきゃいけないときは、念のため grep するぐらいしか対応できない。 追いついた。
単にグローバル変数を使わないようなコードを書きましょうねって話よね。
大昔BASICからCに移行したときに見た話かな。 >>477
同じくくだらない話に今追いついたが
たったそれだけの話だよな
グローバル変数なんか感覚的・直感的に気持ち悪いと感じないようじゃ
いちいち細かい理由を説明しないと理解できない時点で
プログラマとして失格だと思う
趣味でやってて自分1人さえ理解できればよくて
メンテも一生自分1人でやるのなら好きにやりゃいいけどさ >>477,478
追い付いたというからにはそれなりに読んだんだろうに、それで単にグローバル変数を使う話に見えるならプログラマー失格だと思うよ >>479様がマウントを取りたいがために風呂敷を拡げ始めたと聞いてバックネット裏の席を確保しました >>480
PHPの仕様として存在しPHP自体が用意してる参照が非推薦ともされていない情報に対する参照がグローバル(スーパーグローバル)というだけでなぜいけないのか?という話だよ。
自分で勝手グローバルを作ろうって話じゃない。 >>482
>>477と>>478はどのあたりがプログラマ失格なんですか?
>自分で勝手グローバルを作ろうって話じゃない。
彼ら(>>477 >>478)はこれに該当する旨を話してるんですか?
どのあたりがそうなんですか? 人の話を聞かないまま退散したあのかたが蒸し返しで再登板しただけでした
解散 グローバル変数云々の話以外だと例えば
?foo[]=1&foo[][]=2&foo[][][]=3
の時の
htmlspecialchars($_GET['foo']);
はエラーになるわな
なのにis_set($_GET['foo']) や array_key_exists('foo', $_GET) 程度で満足してるウンココードだらけで
そういうウンココードが書籍にまで書かれててウンコが量産されてるのもphpの問題だな
htmlspecialchars(filter_input(INPUT_GET, 'foo'));
ならエラーにはならないが、現実的にはfilter_input()も直接は使わないわけで
フレームワークを通さずに書きたいなら$_GET['foo']よりはベターってだけ
フレームワークを使わない便利な関数を使わないって人ってのは
大した頭もないくせして車輪の再発明が大好きなんだろうとお察しする
絶対に一緒に仕事をしたくないタイプ register_globalsやmagic_quotes_gpcみたいなPHPの黒歴史や
伝説の名言「例えば、PHPを避ける」なんかを知らない人も
増えてるんだろうなと思う
今から10数年前のPHP4を勉強してた頃の自分なら
$_GETや$_POSTを直接使って何が悪いの?と言ってた筈
プログラミングの世界は1年前の自分ですら赤の他人だし
いつか理解できる日が来るといいね
理解できなくても食うに困らない稼ぎがあるなら
それはそれでいいんじゃない?(周りの人は迷惑だけどw) PHPの開発方針がめちゃくちゃ保守的だってことも知らないのだろう
https://externals.io/message/100087
php-internalsでも$_POSTや$_GETをimmutableにしないのはあくまで後方互換性が崩れるからだとしか言われてない($_ENVや$_SERVERはまた別だが)
スーパーグローバルの(スーパーグローバルの書き換えとは独立した)immutable版があればいいのにと思う PHPしか書いた事ないやつだとimmutableという概念を知らない可能性もありそう
そもそもさ
?foo=bar
$_GET['foo'] = 'hage';
var_dump($_GET['foo']); // string(4) "hage"
var_dump(filter_input(INPUT_GET, 'foo')); // string(3) "bar"
↑これ理解できてるんだろうか?
あと素朴な疑問だが
$_GETや$_POSTを直接使ってるやつってユニットテストはどうやってんの?
ブラウザで表示させて実際に値を入力してテストとかやってそうw >>489
>↑これ理解できてるんだろうか?
>>442を見る限りでは勘違いしてるっぽいね
> $_GETや$_POSTを直接使ってるやつってユニットテストはどうやってんの?
その例のように
$_GET['foo'] = 'hage';
とかやってるんじゃないかな…
真面目な話
個人開発レベル程度の経験しかない人だと
PHPUnitなんて使った事ない(というかユニットテストという概念を知らない)って人がわりといたりする >>486
そこでちょろっと言ってることが本質なんじゃないの。
一番に検討しなくちゃいけないのは、外とのインタフェースをあちらこちらに書かず特定の機構に閉じ込めるということだろ。
閉じ込めた中で $_GET と filter_input のどちらを使うかなんてことは本質じゃなく、その時の都合でベストチョイスすればいいだけのこと。
どっちもPHPが用意している正当なインタフェースなんだから。
グローバルはいけないんだなんて言ってみても、結局 >>475-476 でしょ。 >>491
> 一番に検討しなくちゃいけないのは、外とのインタフェースをあちらこちらに書かず特定の機構に閉じ込めるということだろ。
このことはだれも否定していない。
> 閉じ込めた中で $_GET と filter_input のどちらを使うかなんてことは本質じゃなく、その時の都合でベストチョイスすればいいだけのこと。
こっちを、スーパーグローバル変数を使用するのはやめようぜ。って言ってる
自前実装だろうが、PHPの仕様だろうが、グローバルな変数ってだけで悪w
> グローバルはいけないんだなんて言ってみても、結局 >>475-476 でしょ。
だから、immutable 版がほしいね。って流れ ざっと見て>>448あたりは結構頑張って理由を書いてると思うし
>>493はワッチョイから判断するに同じ人だと思うのだけど
自分は>>442を見た時点で説明するだけ時間の無駄だと判断した
スーパーグローバル変数(笑)なんてものを直接使う糞コードが少しでも減ってくれたらいいなとは思う ワッチョイで >>448 と >>493 が同じってどうやって判断するの?
>>493 と >>494 は hE18 で同じかなって気がするが、そういう見方じゃないんだっけ。 来週の木曜0:00AMまではワッチョイ末尾4桁「hE18」はJaneStyle4.00をデフォの設定で使ってる人
すなわちUserAgentを現してる(毎週木曜リセット)
じゃぁどこ見て判断してるのかといえば「b3」で
大雑把に回線が同じHostなんだろうって事を確認して
あとは文体で判断してる(リセットされない)
プログラム板の人なんだからそれぐらいの法則性は自力で見つけて欲しいものだが… ちなみにこんなサービスもある
ttps://afi.click/browser/list/
プログラム板の住人なら
どうやればこのサービスを実現できるか
DB設計から考えてみたらいいんじゃないかな 他人に根拠希薄にプログラマー失格とか罵っときながらのオチがこれ 11レスもしながら出だしの>442の時点で間違ってるのは
オチとは言わず「ボケ」と言うんじゃないかと
たくさんのツッコミが貰えて本望だろう この話題の最初に書いたとおり、filter_input の使用に関して、スーパーグローバル回避のためって理由がググっても中々ヒットしない。
ある程度コードかけるようになると自明だし、フレームワーク使うようになると filter_input すら使う機会が少なくなるからだと思うけど、量産型初心者が全部 $_POST で育ってくるのでめんどいw
みんなどんどん素敵記事書いて、初心者に広報してくれんかねぇ。 グローバル変数を使わない方がいい理由が分からないって人ってやっばりPHPしか書けない人なのかな?
他の言語では常識な事だけに何が理解できないのかが理解できない ✕PHPしか書けない
◯PHPすら書けない
PHPerが馬鹿にされる理由がよく分かるよな メジャーなフレームワークのコードを読んでみたりはしないのだろうか
全部を確認したわけではないけど流石に$_GET $_POSTを直接ごにょごにょやってるFWは無いと思う ググってみるとteratailに質問してる初心者のやり取りを見つけたからurlを張っとく
https://teratail.com/questions/63786
501の言う量産型初心者が1人でも減ってくれることを願って。。。 >>505
これ、オレがコメントした時に参考にした記事www
これのせいで、「疎結合」とか、伝わりにくい表現使ってしまった。
ちゃんと理解した奴がまとめて記事書いてくれprz >>504
laravel 5.6.33 の新規プロジェクト作って grep してみたら、filter_input はヒットしなかったよ。
$_GET やら $_POST、$_SERVER なんかを使ってるコードはたくさんあるが、これが FW 本体なのかは知らないから見てるものが違うかもしれんが。
ついでに手元にあった古い cakephp のコードも grep してみたけど、やはり filter_input は使ってないようだね。
最新だとどうなのかは知らないけど。
どのフレームワークのコードを読んだの? なんで使ってないんだろうな
さすがに何らかの理由があるはずだよな その辺はいろいろなFWのコードを読んだ >>504 がまず解説してくれると思うけど、
>>493 によればグローバルな変数ってだけで悪らしいし、それについての否定コメントも無いことを見れば共通認識なんだろうから、
この流れから言えば量産型初心者が作ってるってことなんじゃない。
スパーグローバルの差し替えなんて密結合(?)な行儀の悪いこともしてるようだから、ゴミがメジャーになった悲劇的なケースなんだろうかね。
おれはそうは思わないけど。
filter_input は多重配列に弱いし $_GET や $_POST も含めて同じパラメタ名が重複することに気付けなかったりするので必要に応じて自前で QUERY_STRING やら STDIN を読む選択もあるだろうと思ってるから、
FW の利用を含めておれはその時一番都合のいい方法を選択するから気楽なもんだ。
選択肢を絞ることを徹底するというのも品質管理の手法の一つとしてあると思ってるけどね。
何にしても解説を待ちたいね。 グローバル変数とユニットテストについて質問です。
ユニットテストで、NULLバイトチェックのため、$_GETにユーザー入力値(ヌルバイト¥0)を
直接代入してテストしていますが、これはまずいのでしょうか?
public function test_checkNullbyte()
{
$_GET['nullbyte'] = "abc\0xyz";
$this->object->checkNullbyte();
} >>510
そのチェックメソッドが $_GET を参照する作りになってるならいいと思うよ。 >>511
ありがとうございます。
プロダクトコードのスーパーグローバル変数の参照部分を見直してみます。 JavaScriptを使わず、PHPだけでフォームの戻るボタンって作れるんですか !? >>513
JavaScriptを使わずと言うことは
<input type="button" value="戻る" onclick="history.back()">
こういうのもだめってことかな? >>513です
>>514さん
ISO-HTMLなのでイベントハンドラ?も使えないです。 安易だが
ブラウザから返してくる、$_SERVER['HTTP_REFERER']の値を信じて、そこに送り返してあげる
(セットしないブラウザもあるし、嘘も書けるので、オススメはしない)
面倒だが
自分のサイトだけで遷移しているなら、直前のURLをセッションに持たせ、それを参照して戻す
(入力フォームで行ったり来たりする場合は、入力しかけのフォームの値も保持しないと行けなくなる
こういう場合、相当面倒な処理を書かないと行けないと思うが、仕方ないね?) あるいは
フォームでPOSTする要領で直前のURLに遷移すると言う方法もある
その場合はサーバー側で次画面に遷移する際に、
現在の場所をフォームに埋め込む形で出来る >>513です
>>516さん
セッションですか !?
身につけたいので頑張ります! >>508
$_REQUESTとかってwww-form〜専用だろ。 ■ このスレッドは過去ログ倉庫に格納されています