X



【PHP】下らねぇ質問はここに 9
■ このスレッドは過去ログ倉庫に格納されています
0449デフォルトの名無しさん (ワッチョイ de81-2km2)
垢版 |
2018/08/13(月) 14:57:40.05ID:XxWurSAu0
これ以上やっても信仰する宗教のようなのでやめますが

php.netで $_POST変数が非推奨になり、filter_input関数が推奨になったら
その時に考えることにします

今は、いくつかある対策方法の一つとして聞いておきます
0459デフォルトの名無しさん (ワッチョイ de81-2km2)
垢版 |
2018/08/13(月) 16:44:20.77ID:XxWurSAu0
防げるのはせいぜい自分が書く内部バグくらい?
外部からの攻撃については無力
コツコツとバリッドチェックを用意することになるのは変わらない
こんなんでも堅牢なシステムだって言えるんだろうか
0461デフォルトの名無しさん (ワッチョイ 0a7f-EgBt)
垢版 |
2018/08/13(月) 16:50:37.23ID:B8BpXPvN0
>>456 は結局のところ「注意すれば事足りるでしょ?」ってことを昨日からずっと言い続けてるよね
その注意をかける負担を減らせる手段を一つでも盛り込む事に反発する理由なんて一つもないと思うんだけどな
俺の頭がおかしいのかそうじゃないのかよく分かんなくなってくるじゃん
0466デフォルトの名無しさん (ワッチョイ de81-2km2)
垢版 |
2018/08/13(月) 17:13:09.68ID:XxWurSAu0
堅牢と言っているけども、何から堅牢かと言えば、自分自身が書く記述の誤りから堅牢になると言うこと
プログラムから見たら、グローバル変数だけをガードしてからと言ってバグフリーになるわけじゃない

また、Webサイトとして堅牢をうたうなら、それは外部からの攻撃に対しての話だし
今回提案された関数を使おうと、その点については無力のまま

この辺が改善されたら導入を考えようと思うんですが、如何ですか?
0467デフォルトの名無しさん (ワッチョイ b3b3-Qb5F)
垢版 |
2018/08/13(月) 17:26:15.20ID:rjxAd60g0
>>466
オマエほんとバカだろ。。。
動画見ても全然理解できないと思うけど、まず見てみ。
会話が成立しないくらいズレたことコメントしてるってだけでも理解したほうがいい。
0470デフォルトの名無しさん (オイコラミネオ MMdf-++Qy)
垢版 |
2018/08/13(月) 18:22:02.91ID:6I003ZzcM
>>461
注意すれば足りるっつうか、$_POST に値を代入しないようにコードを書くのがそんなに大変なの?
わざわざそういう設計をしなけりゃそんなことしないし、そうしてるなら必要だからしたんだろうから仕様に沿って使えばいいんじゃね?
ということなんじゃないの。
いや別に filter_input を使うなと言ってるのではないし使えばいいじゃんと思ってるが、$_POST をそこまで忌み嫌うのが意味分からんてことだよ。
それで疎にするとか持ち出してきて、$_POST の代わりに filter_input 使えば疎になるって何のこっちゃ?って感じだろう?
堅牢になるぜならまだ分かるが、疎って?ってさ。
疎にするって話ならと >>415 みたいな手法を持ち出してみたらそれには同意してもらえてるっぽいが、filter_input 使えば疎って話ではないだろってところは通じてないっぽいんだよな。

なんつうか、意識高い系なんだろうなって感じ。
0472デフォルトの名無しさん (ワッチョイ 1b5d-2km2)
垢版 |
2018/08/13(月) 18:55:06.81ID:LXDaPxOa0
スーパーグローバルとfilter_inputに関してはPHP特有だし多少議論があるのは理解する
それでもfilter_inputの方がベターだと思うが

しかしグローバル変数使うなが納得出来ないというのはお話にならない
0473デフォルトの名無しさん (ワッチョイ 6376-IYYR)
垢版 |
2018/08/13(月) 19:31:08.20ID:Mozi/syi0
正直、ここしばらくフレームワークの世話になってたから
$_POSTもfilter_inputも明示的につかったことない
でも、ざっと見た限りではよっぽどトリッキーなことしない限り
filter_inputをつかわない理由はないな
0474デフォルトの名無しさん (ワッチョイ b3b3-Qb5F)
垢版 |
2018/08/13(月) 19:59:59.97ID:rjxAd60g0
>>470
密とか疎に対して「結合」って使ったから良くなかったかもね。
結合というより、関係性かなぁ。

$_POST が変更可能な変数であり、かつどこでも使用できるため、使用箇所の関係性が密になってしまう。
値が変更になれば、当然後続が影響を受けるから密ね。

だから、http から直接値を引っ張ってくる filter_input 使用することで、どこで使用しても一律な値を保証できるよう関係性を疎に保とうよ。
って書きたかったんだわ。

結局、$_POST 使用するたびに、プロジェクト全体を grep するとかアホらしいので、新規にコード書くならまず $_POST は使わん。って程度の決意。
0476デフォルトの名無しさん (ワッチョイ b3b3-Qb5F)
垢版 |
2018/08/14(火) 07:14:07.57ID:fH8thKa+0
>>475
回避不能だねw
基本はフレームワークに閉じ込めて、自分では $_FILES とか $_SESSION は書かない。
で、どうしても自分で書かなきゃいけないときは、念のため grep するぐらいしか対応できない。
0478デフォルトの名無しさん (ワッチョイ bbe9-hE18)
垢版 |
2018/08/16(木) 11:14:39.29ID:wpZ5Mbd20
>>477
同じくくだらない話に今追いついたが
たったそれだけの話だよな

グローバル変数なんか感覚的・直感的に気持ち悪いと感じないようじゃ
いちいち細かい理由を説明しないと理解できない時点で
プログラマとして失格だと思う

趣味でやってて自分1人さえ理解できればよくて
メンテも一生自分1人でやるのなら好きにやりゃいいけどさ
0482デフォルトの名無しさん (オイコラミネオ MM0f-PVJR)
垢版 |
2018/08/16(木) 12:23:26.84ID:Z+yvFL8qM
>>480
PHPの仕様として存在しPHP自体が用意してる参照が非推薦ともされていない情報に対する参照がグローバル(スーパーグローバル)というだけでなぜいけないのか?という話だよ。
自分で勝手グローバルを作ろうって話じゃない。
0486デフォルトの名無しさん (スププ Sdbf-V6hB)
垢版 |
2018/08/16(木) 13:02:04.93ID:qFV5giwld
グローバル変数云々の話以外だと例えば
?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']よりはベターってだけ

フレームワークを使わない便利な関数を使わないって人ってのは
大した頭もないくせして車輪の再発明が大好きなんだろうとお察しする
絶対に一緒に仕事をしたくないタイプ
0487デフォルトの名無しさん (ワッチョイ bbe9-hE18)
垢版 |
2018/08/16(木) 13:14:38.66ID:wpZ5Mbd20
register_globalsやmagic_quotes_gpcみたいなPHPの黒歴史や
伝説の名言「例えば、PHPを避ける」なんかを知らない人も
増えてるんだろうなと思う

今から10数年前のPHP4を勉強してた頃の自分なら
$_GETや$_POSTを直接使って何が悪いの?と言ってた筈

プログラミングの世界は1年前の自分ですら赤の他人だし
いつか理解できる日が来るといいね

理解できなくても食うに困らない稼ぎがあるなら
それはそれでいいんじゃない?(周りの人は迷惑だけどw)
0488デフォルトの名無しさん (アウアウカー Sa0f-Rbm/)
垢版 |
2018/08/16(木) 13:24:30.70ID:NlvTq02Da
PHPの開発方針がめちゃくちゃ保守的だってことも知らないのだろう
https://externals.io/message/100087

php-internalsでも$_POSTや$_GETをimmutableにしないのはあくまで後方互換性が崩れるからだとしか言われてない($_ENVや$_SERVERはまた別だが)
スーパーグローバルの(スーパーグローバルの書き換えとは独立した)immutable版があればいいのにと思う
0489デフォルトの名無しさん (スププ Sdbf-V6hB)
垢版 |
2018/08/16(木) 14:08:54.52ID:qFV5giwld
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
0490デフォルトの名無しさん (ワッチョイ bbe9-hE18)
垢版 |
2018/08/16(木) 14:20:27.81ID:wpZ5Mbd20
>>489
>↑これ理解できてるんだろうか?
>>442を見る限りでは勘違いしてるっぽいね

> $_GETや$_POSTを直接使ってるやつってユニットテストはどうやってんの?

その例のように
$_GET['foo'] = 'hage';
とかやってるんじゃないかな…

真面目な話
個人開発レベル程度の経験しかない人だと
PHPUnitなんて使った事ない(というかユニットテストという概念を知らない)って人がわりといたりする
0491デフォルトの名無しさん (オイコラミネオ MM0f-PVJR)
垢版 |
2018/08/16(木) 14:26:51.20ID:Z+yvFL8qM
>>486
そこでちょろっと言ってることが本質なんじゃないの。
一番に検討しなくちゃいけないのは、外とのインタフェースをあちらこちらに書かず特定の機構に閉じ込めるということだろ。
閉じ込めた中で $_GET と filter_input のどちらを使うかなんてことは本質じゃなく、その時の都合でベストチョイスすればいいだけのこと。
どっちもPHPが用意している正当なインタフェースなんだから。
グローバルはいけないんだなんて言ってみても、結局 >>475-476 でしょ。
0493デフォルトの名無しさん (ワッチョイ ebb3-hE18)
垢版 |
2018/08/16(木) 15:34:33.46ID:IVwSm3Wy0
>>491
> 一番に検討しなくちゃいけないのは、外とのインタフェースをあちらこちらに書かず特定の機構に閉じ込めるということだろ。
このことはだれも否定していない。

> 閉じ込めた中で $_GET と filter_input のどちらを使うかなんてことは本質じゃなく、その時の都合でベストチョイスすればいいだけのこと。
こっちを、スーパーグローバル変数を使用するのはやめようぜ。って言ってる
自前実装だろうが、PHPの仕様だろうが、グローバルな変数ってだけで悪w

> グローバルはいけないんだなんて言ってみても、結局 >>475-476 でしょ。
だから、immutable 版がほしいね。って流れ
0494デフォルトの名無しさん (ワッチョイ bbe9-hE18)
垢版 |
2018/08/16(木) 16:04:23.82ID:wpZ5Mbd20
ざっと見て>>448あたりは結構頑張って理由を書いてると思うし
>>493はワッチョイから判断するに同じ人だと思うのだけど
自分は>>442を見た時点で説明するだけ時間の無駄だと判断した

スーパーグローバル変数(笑)なんてものを直接使う糞コードが少しでも減ってくれたらいいなとは思う
0496デフォルトの名無しさん (ワッチョイ bbe9-hE18)
垢版 |
2018/08/16(木) 17:14:51.55ID:wpZ5Mbd20
来週の木曜0:00AMまではワッチョイ末尾4桁「hE18」はJaneStyle4.00をデフォの設定で使ってる人
すなわちUserAgentを現してる(毎週木曜リセット)

じゃぁどこ見て判断してるのかといえば「b3」で
大雑把に回線が同じHostなんだろうって事を確認して
あとは文体で判断してる(リセットされない)

プログラム板の人なんだからそれぐらいの法則性は自力で見つけて欲しいものだが…
0497デフォルトの名無しさん (ワッチョイ bbe9-hE18)
垢版 |
2018/08/16(木) 17:19:27.02ID:wpZ5Mbd20
ちなみにこんなサービスもある
ttps://afi.click/browser/list/

プログラム板の住人なら
どうやればこのサービスを実現できるか
DB設計から考えてみたらいいんじゃないかな
0501デフォルトの名無しさん (ワッチョイ ebb3-hE18)
垢版 |
2018/08/16(木) 20:11:17.99ID:IVwSm3Wy0
この話題の最初に書いたとおり、filter_input の使用に関して、スーパーグローバル回避のためって理由がググっても中々ヒットしない。
ある程度コードかけるようになると自明だし、フレームワーク使うようになると filter_input すら使う機会が少なくなるからだと思うけど、量産型初心者が全部 $_POST で育ってくるのでめんどいw
みんなどんどん素敵記事書いて、初心者に広報してくれんかねぇ。
0502デフォルトの名無しさん (ワッチョイ 6b95-8iSw)
垢版 |
2018/08/16(木) 20:24:00.00ID:S/g/TLeK0
グローバル変数を使わない方がいい理由が分からないって人ってやっばりPHPしか書けない人なのかな?
他の言語では常識な事だけに何が理解できないのかが理解できない
0504デフォルトの名無しさん (ワッチョイ ef17-xQfD)
垢版 |
2018/08/16(木) 20:51:12.43ID:0Ewq9KDZ0
メジャーなフレームワークのコードを読んでみたりはしないのだろうか
全部を確認したわけではないけど流石に$_GET $_POSTを直接ごにょごにょやってるFWは無いと思う
0506デフォルトの名無しさん (ワッチョイ ebb3-hE18)
垢版 |
2018/08/16(木) 21:21:55.14ID:IVwSm3Wy0
>>505
これ、オレがコメントした時に参考にした記事www
これのせいで、「疎結合」とか、伝わりにくい表現使ってしまった。

ちゃんと理解した奴がまとめて記事書いてくれprz
0507デフォルトの名無しさん (ワッチョイ efd5-PVJR)
垢版 |
2018/08/16(木) 23:22:50.51ID:IQGCIGud0
>>504
laravel 5.6.33 の新規プロジェクト作って grep してみたら、filter_input はヒットしなかったよ。
$_GET やら $_POST、$_SERVER なんかを使ってるコードはたくさんあるが、これが FW 本体なのかは知らないから見てるものが違うかもしれんが。

ついでに手元にあった古い cakephp のコードも grep してみたけど、やはり filter_input は使ってないようだね。
最新だとどうなのかは知らないけど。

どのフレームワークのコードを読んだの?
0509デフォルトの名無しさん (ワッチョイ efd5-PVJR)
垢版 |
2018/08/17(金) 10:55:31.64ID:FbY5sXOm0
その辺はいろいろなFWのコードを読んだ >>504 がまず解説してくれると思うけど、
>>493 によればグローバルな変数ってだけで悪らしいし、それについての否定コメントも無いことを見れば共通認識なんだろうから、
この流れから言えば量産型初心者が作ってるってことなんじゃない。
スパーグローバルの差し替えなんて密結合(?)な行儀の悪いこともしてるようだから、ゴミがメジャーになった悲劇的なケースなんだろうかね。
おれはそうは思わないけど。

filter_input は多重配列に弱いし $_GET や $_POST も含めて同じパラメタ名が重複することに気付けなかったりするので必要に応じて自前で QUERY_STRING やら STDIN を読む選択もあるだろうと思ってるから、
FW の利用を含めておれはその時一番都合のいい方法を選択するから気楽なもんだ。
選択肢を絞ることを徹底するというのも品質管理の手法の一つとしてあると思ってるけどね。

何にしても解説を待ちたいね。
0510デフォルトの名無しさん (ワッチョイ abdb-mZ3i)
垢版 |
2018/08/17(金) 11:20:01.64ID:BAgYE8OH0
グローバル変数とユニットテストについて質問です。
ユニットテストで、NULLバイトチェックのため、$_GETにユーザー入力値(ヌルバイト¥0)を
直接代入してテストしていますが、これはまずいのでしょうか?

public function test_checkNullbyte()
{
  $_GET['nullbyte'] = "abc\0xyz";
  $this->object->checkNullbyte();
}
0515513 (ワッチョイ 9fd0-QxOT)
垢版 |
2018/08/18(土) 17:14:55.37ID:2Bt8PW+v0
>>513です

>>514さん
ISO-HTMLなのでイベントハンドラ?も使えないです。
0516デフォルトの名無しさん (ワッチョイ 0f81-ipLS)
垢版 |
2018/08/18(土) 17:34:08.27ID:gititOy10
安易だが
ブラウザから返してくる、$_SERVER['HTTP_REFERER']の値を信じて、そこに送り返してあげる
(セットしないブラウザもあるし、嘘も書けるので、オススメはしない)

面倒だが
自分のサイトだけで遷移しているなら、直前のURLをセッションに持たせ、それを参照して戻す
(入力フォームで行ったり来たりする場合は、入力しかけのフォームの値も保持しないと行けなくなる
 こういう場合、相当面倒な処理を書かないと行けないと思うが、仕方ないね?)
0517デフォルトの名無しさん (ワッチョイ 0f81-ipLS)
垢版 |
2018/08/18(土) 17:38:53.55ID:gititOy10
あるいは
フォームでPOSTする要領で直前のURLに遷移すると言う方法もある
その場合はサーバー側で次画面に遷移する際に、
現在の場所をフォームに埋め込む形で出来る
0518513 (ワッチョイ 9fd0-QxOT)
垢版 |
2018/08/18(土) 17:38:54.09ID:2Bt8PW+v0
>>513です

>>516さん
セッションですか !?
身につけたいので頑張ります!
0519デフォルトの名無しさん (ワッチョイ 7b7c-mZ3i)
垢版 |
2018/08/18(土) 18:39:50.05ID:6yCMBjdI0
>>508
$_REQUESTとかってwww-form〜専用だろ。
0521513 (ワッチョイ 9fd0-Mwiu)
垢版 |
2018/08/20(月) 14:51:18.69ID:/k2xBvnt0
>>513です

>>517さん
お返事が遅れました。
戻る際にもフォームを使うということですか。
ありがとうございます。

>>520さん
お返事が遅れました。
>>確認から入力に戻るような話?
はい。PHPで対応したいので現在勉強中です。
始めはHTMLのtype="heidden"を採用しようと考えていたのですが、いただいたレスやセキュリティを考えた結果、セッション変数を使ってみようかと思い試行錯誤中です。
0522デフォルトの名無しさん (ワッチョイ efd5-PVJR)
垢版 |
2018/08/20(月) 16:35:49.23ID:aXzcMKFL0
>>521
そういう遷移ならもっとシンプルに考えた方がいいんじゃね。
submit ボタンに name を設定しておけば、送信時に押されたボタンが分かるよ。
>>520 のような全部の画面は例えば form.php で処理させ、押されたボタンによって画面を出し分けるなんてのが簡単じゃないかな。
確認画面には例えば <button type="submit" name="act" value="back">戻る</button> と <button type="submit" name="act" value="send">送信</button> 置いておく感じ。
入力画面には <button type="submit" name="act" value="check">確認</button> とか。
すると form.php はこんな感じ。

$act=filter_input(INPUT_POST, 'act');
$view=入力画面;
入力値の取得とバリデーション;
if(エラー無し) {
if($act==='check') {
$view=確認画面;
}
elsif($act==='send') {
登録処理;
if(成功) {
$view=完了画面;
}
}
}
$view 表示;

セッション使ってないから、確認画面には入力値を hidden で埋めておく。
入力画面ではエラーメッセージの表示も行う感じ。
0523デフォルトの名無しさん (ワッチョイ efd5-PVJR)
垢版 |
2018/08/20(月) 16:45:12.31ID:aXzcMKFL0
>>522
その流れだと初回表示時にバリデーションが走って必須項目未入力のエラーが出ちゃいそうだねw
説明用とは言え雑だったが、submitボタンが取れることが分かればうまいことやれるでしょ。
0524513 (ワッチョイ 9fd0-Mwiu)
垢版 |
2018/08/20(月) 17:48:24.04ID:/k2xBvnt0
>>513です

>>522さん
そのような方法もあるんですね。
くださったレスを参考にいろいろと試行錯誤してみます。
ありがとうございました。
0525デフォルトの名無しさん (ワッチョイ 0fb8-O+0A)
垢版 |
2018/08/21(火) 06:38:40.38ID:xkZA2QwA0
hiddenが危険という言葉を鵜呑みにする必要はない
用途による
メールフォームの確認程度なら別にhiddenでいい
そんなの改ざんする意味もなければされたところで問題ないし
最終的に受け取ったデータを通すかはPHPが判断すればいいこと
0526デフォルトの名無しさん (ワッチョイ db8a-Fz0V)
垢版 |
2018/08/21(火) 12:56:33.44ID:RbDl1jHe0
hiddenに限らずチェックはしないとね
さもないと、支払もすんでいない商品を買ったことにされたり
ログイン認証済んでいないのに、内部に入り込まれたりするから
0527デフォルトの名無しさん (ワッチョイ 1fe7-QxOT)
垢版 |
2018/08/22(水) 05:59:35.69ID:sXSBMfza0
質問投下です。
PHP 2chBBSをphp7.0のサーバーにアップして色々と対応させるよう書き換えましたが、これだけが分かりません。
abon.php,92行目あたり
$line = preg_replace("!<a href=\"\.\./test/read\.php/$_POST[bbs]/$_POST[key]/([\d|\-]+)\" target=\"_blank\">&gt;&gt;([\d|\-]+)</a>!e",
"'<a href=\"../test/read.php/$_POST[bbs]/$_POST[key]/'.res_num('$1',$del).'\" target=\"_blank\">&gt;&gt;'.res_num('$2',$del).'</a>'", $line);

php7ではpreg_replaceのe修飾子が廃止されており、preg_replace_callbackを使う事に
なっているようですが、ググってみても、どのように置き換えれば良いのか分かりません。

お知恵をお借りできれば助かります。よろしくお願いします。
0528デフォルトの名無しさん (ワッチョイ cb65-ipLS)
垢版 |
2018/08/22(水) 07:23:29.30ID:XDj/gPFz0
その部分だけ見ててもすげーやべーコードなのが分かるから手直し以前にゼロから作り直した方がいいよ
つか調べたら最終更新2005年(13年前)でかつこのコードとか本格的にやべーのでもっと新しくてまともなもの探さなきゃダメだよ
0530527 (ワンミングク MMbf-ycnR)
垢版 |
2018/08/22(水) 08:17:00.54ID:2cdwFvgEM
>>528
レスありがとうございます。
これ、ちまちまと手直しして使っておりまして。
このコードは管理機能内の記事削除部分で、管理者しか使えないですし、
第三者が入れないよう認証かけてるのでセキュリティーは多分大丈夫だと思います。

取りあえず使えるようにしたいので手直し出来るのであれば教えて欲しいです。

あと、どういう点がやばいのかご教示いただければ勉強出来るので非常に助かります。
0531デフォルトの名無しさん (ワッチョイ ef9f-vvAx)
垢版 |
2018/08/22(水) 08:40:59.95ID:PHQZkUhf0
だから、$_POSTをいきなり正規表現の処理に入れてるところがヤバイって言いたいんだと思う。
bbsやkeyに悪意のあるコードを入れてられても、そのままノーチェックで処理を継続していたらヤバイ。

仮にチェック済だとしても、スーパーグローバルを使ってると頭悪そうにみえるしな。
0532デフォルトの名無しさん (ワッチョイ 0b5b-hE18)
垢版 |
2018/08/22(水) 10:16:38.53ID:mlQDc+9J0
>>527
$line = preg_replace_callback(
  "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">&gt;&gt;([\d|\-]+)</a>!",
  'callback_hoge', $line);

function callback_hoge($matches)
{
  return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $del). '\" target=\"_blank\">&gt;&gt;' . res_num($matches[2], $del) . '</a>';
}

クロージャ使って書くなら

$line = preg_replace_callback(
  "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">&gt;&gt;([\d|\-]+)</a>!",
  function ($matches) {
    return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $del). '\" target=\"_blank\">&gt;&gt;' . res_num($matches[2], $del) . '</a>';
  },
  $line
);

半角スペース2個を全角スペースにして書いてるので注意
0533デフォルトの名無しさん (ワッチョイ 0b5b-hE18)
垢版 |
2018/08/22(水) 10:25:32.15ID:mlQDc+9J0
【補足】
他の人も書いてるけど
たった1行のコードから色々とヤバさが伝わってくる代物なので
他の代替手段を使うことを強くおすすめ

少なくとも $_POST[bbs] じゃなく {$_POST['bbs']}

>>530
JVNにXSSの脆弱性がある事が報告されてる
https://jvn.jp/jp/JVN48774168/index.html

コードをざっと斜め読みしたけど他にも色々と駄目すぎてどこから手を入れるべきかアドバイスできないレベルで酷い
2005年のコードでもきちんと書いてればPHP7でも大体問題なく動くものだけど
このコードだと他にも色々と問題が出ると思う
0534デフォルトの名無しさん (ワッチョイ 0b5b-hE18)
垢版 |
2018/08/22(水) 10:32:57.26ID:mlQDc+9J0
>>532訂正
$delって変数があるの見落としてた

$line = preg_replace_callback(
  "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">&gt;&gt;([\d|\-]+)</a>!",
  'callback_hoge', $line);

function callback_hoge($matches)
{
  return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $GLOBALS['del']). '\" target=\"_blank\">&gt;&gt;' . res_num($matches[2], $del) . '</a>';
}

クロージャ使うなら

$line = preg_replace_callback(
  "!<a href=\"\.\./test/read\.php/$_POST['bbs']/$_POST['key']/([\d|\-]+)\" target=\"_blank\">&gt;&gt;([\d|\-]+)</a>!",
  function ($matches) use ($del) {
    return "<a href=\"../test/read.php/$_POST['bbs']/$_POST['key']/" . res_num($matches[1], $del). '\" target=\"_blank\">&gt;&gt;' . res_num($matches[2], $del) . '</a>';
  },
  $line
);
0535デフォルトの名無しさん (ワッチョイ 0fb8-O+0A)
垢版 |
2018/08/22(水) 10:41:30.78ID:jQIraJCs0
エラーを無視するような感じのエラー処理が適当なコードだから
セキュリティもそれなりなのだろうというのが容易に想像出来るんだわ
なんせPHP4時代のコードだし今ほどそのへん考慮されてないからねえ
0536デフォルトの名無しさん (ワッチョイ 0b5b-hE18)
垢版 |
2018/08/22(水) 10:41:35.61ID:mlQDc+9J0
>>529
コード内に出てくる $_POST[bbs](本当は $_POST['bbs'] だが)は
まともにチェックされてないっぽい
unlink("../$_POST[bbs]/...");
みたいなコードが散見されるから
NULLバイト攻撃も素通りだと思う

ヤバすぎ
0537デフォルトの名無しさん (オイコラミネオ MM3f-PVJR)
垢版 |
2018/08/22(水) 10:52:29.28ID:OKO5mG4BM
>>532
$del を受ける use が必要じゃね

あと細かい話だが、PHPが単なる即時関数もクロージャと言うのにはちょっと違和感ある。
>>532 のケースはクロージャになるけど、クロージャってやっぱスコープが特殊なところに意義があるというか。
0539デフォルトの名無しさん (ワッチョイ cb65-ipLS)
垢版 |
2018/08/22(水) 10:58:38.85ID:XDj/gPFz0
OSに処理投げる形式のファイルシステム関数についてはnulバイト攻撃はPHP側で対策されてはいる
https://github.com/php/php-src/blob/master/ext/standard/file.c#L1510
https://github.com/php/php-src/blob/master/Zend/zend_API.h#L1011

が, 何れにせよ救いがたいコードで, 管理者しか使えないから問題ないという発想も正直ヤバい
この状態から>>527の質問のレベルで更にツギハギで直してるっていうんだからセキュリティに関しては想像もしたくないというのが正直なところ
0541デフォルトの名無しさん (ワッチョイ 0b5b-hE18)
垢版 |
2018/08/22(水) 11:08:19.17ID:mlQDc+9J0
>>539
かなり昔に対策されたんだな
知らなかったサンクス

$_POST[bbs]でコード内を検索したら
unlink("../$_POST[bbs]/dat/$_POST[key].dat");
こんなコードが出てきたんでびっくりして脊髄反射してしまったww
0542デフォルトの名無しさん (ワッチョイ cb65-ipLS)
垢版 |
2018/08/22(水) 11:35:44.27ID:XDj/gPFz0
ついでに正規表現パターンにPOSTデータ突っ込むのがどうしても我慢ならなかったから直してみた

$line = preg_replace_callback(
'!<a href="\.\./test/read\.php/(?<bbs>[^/]+)/(?<key>[^/]+)/(?<num>[\d|\-]+)" target="_blank">&gt;&gt;\k<num></a>!',
function ($matches) use ($del) {
$bbs = filter_input(INPUT_POST, 'bbs');
$key = filter_input(INPUT_POST, 'key');
if ($matches['bbs'] !== $bbs || $matches['key'] !== $key) {
return $matches[0];
}
return '<a href="../test/read.php/'.$bbs.'/'.$key.'/'.res_num($matches['num'], $del).'" target="_blank">&gt;&gt;'.res_num($matches['num'], $del).'</a>';
},
$line
);
0543デフォルトの名無しさん (ワッチョイ 0b98-IWHs)
垢版 |
2018/08/22(水) 11:58:13.96ID:nWdToOU90
Interface用のファイルって基本的にどこに置けばいいの?
それを継承するクラス群と同じディレクトリなのか、
もしくは最初から一箇所(例えばMyApp\Contract等)にまとめていいのか
0544527 (ワンミングク MMbf-ycnR)
垢版 |
2018/08/22(水) 12:28:34.49ID:2cdwFvgEM
>>532
手直し、ありがとうございます。
勉強させてもらいます。


件の掲示板ですが、社内LANで運用されておりまして、前任者より引き継いだものです。
設置はさらに前の前任者(退職)が行ったようです。
お察しの通り、phpのスキルはそれ程高くはありません。

移行を検討するよう進言してみます。
ありがとうございました。
0545デフォルトの名無しさん (ワッチョイ ef9f-vvAx)
垢版 |
2018/08/22(水) 13:23:13.49ID:PHQZkUhf0
社内でしかも管理者限定なら急ぐことはないか…
でもコードの品質全てが問題ありそうだから、仲間内で注意喚起はした方がいいな。
JVNで周知されてるのも良い理由になると思う。
0548デフォルトの名無しさん (ワッチョイ 0b5b-hE18)
垢版 |
2018/08/22(水) 18:00:41.89ID:mlQDc+9J0
>>547
英語版のPHPマニュアルの改変履歴追ってみると7.2.0での対応で一段落って感じだけど
日本語版には書かれてないな

NULLバイトや改行コードを悪用したインジェクションなら
mail()やmb_send_mail()に渡すデータをバリデーションしてたら7.2.0未満でも問題ない筈だが
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況