PHP質問・雑談スレ5【初心者お断り(ROM歓迎)】
■ このスレッドは過去ログ倉庫に格納されています
PHPに関する質問や雑談をするスレです。
初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。
PHP未導入の方や、手取り足取りが必要な初心者の方はム板のくだスレへどうぞ。
https://mevius.5ch.net/tech/ (【PHP】で板内を検索)
前スレ
https://medaka.5ch.net/test/read.cgi/php/1498653249/
その他リンク
・PHPマニュアル
https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
https://ideone.com/
・プログラミングのお題スレ (求PHPer参戦)
https://mevius.5ch.net/test/read.cgi/tech/1538096947/
このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
(FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼
このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
(HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造 知り合いの鯖缶やってるのがWPに親殺された勢いでWPを嫌ってるけど
WPでブログやってアフィで稼ぐみたいな安易な輩が増えまくってるんだってな
IQ80以下じゃないのか?ってレベルのやつやHTNLも全くできないレベルのじじいが
サポートに連絡しまくってくるんだと HTNLとかありそうでないワード出されると不安になる >>377
wordpressなんか使ってねーつーの >>380
知的障害の指標として今でも普通に使われてるけどね
IQ70未満が知的障害
80だと疑い高めの境目ってとこだからバカの例えとしてはいい線ついてる 過去のcake資源引き継ぐとか理由ない限りLaravelでok >>383
ブログでアフィ自体は大昔からあったが
ここ最近流行?のパターンは、スキルの全くない人間が情報商材みたいなのに騙されて自分にもできると勘違いして手を出すんだとよ
だからサポートに来る問い合わせの内容が知的障害者レベルなんじゃね?
>>382
それな
プログラムやるやつにコミュ障が多いって言われる理由がよくわかるわ 問い合わせのサポート対応できる人は尊敬する
俺なら
んなもん人から教わるようなもんじゃねぇんだから
ググればすぐ分かる事を他人に聞いてる時点でセンスねぇよ
やめちまえ
とか言いそうw https://www.techempower.com/benchmarks/
ここのベンチ見るとphpのswooleとやらが
4位になってるがどういうこっちゃね WordPressなんてブログツールとしか思ってないし
使わないから全く興味ないから、ニュースになっててもスルーだわ JVNの脆弱性レポートが偏ってるのは
ベンダーが掲載を許可するという大前提があるからだ
掲載されてないだけでサイボウズやWPが特別多いわけじゃない Linux難しいぉ
リポジトリみたら5.4だったからしょうがないからソースからいれたんだけど
#!/usr/local/bin/phpとかよく見るしそこに狙ったつもりが
/usr/local/bin/php/bin/phpにインストールされてるw 狙ったところに直接インストールするんじゃなくて
バージョン管理しやすいところにインストールして
シンボリックリンクを張るんだよ
そうすればバージョンの切り替えも簡単だから
Apacheとかも一緒 どうせCentOS7だろうから素直にremiのやつ入れとけ 今日でPHP5.6≒PHP5.xのサポート終了か
7にしても5時代となんもコードは変わってないけど
そろそろナウでヤングでイケてるPHP7のコードかけるようにしないとな! HackはPHPとほぼ同じシンタックスってだけで中身はほぼ別物じゃないの?
2週間前に3.30が出たみたいだしGithubみても更新は活発に見えるし心配はいらんかと HackのPHP5サポートはすでに終了していて
PHP7の機能も積極的には取り入れないとのこと
PHPはこれからもHackの成果を取り入れるだろうから
HackからPHPへの移行は簡単だろうがその逆は大変になるだろう 最近SQLiteでなんかバグあったような気がするけど、
phpinfo見てるとライブラリのバージョンが3.7.17でちょっと不安。
これバージョンアップ出来ない? RHEL7かCentOS7か?
そもそもPHPの sqlite3.so と pdo_sqlite.so は libsqlite3.so (sqliteパッケージ) に依存していてその中身を呼び出してる
更新するなら
1. PHPモジュール sqlite3.so と pdo_sqlite.so を新しいバージョンのsqliteを静的リンクするようにビルドして入れ替える
2. システムの libsqlite3.so を新しいバージョンのsqliteをビルドしたものに差し替える
のどちらかになるわけだがぶっちゃけRed Hatがバグレポ受けた上でwon't fixなら大概大きな問題はなかろうし費用対効果考えたらやってらんねー
それにsqliteはyumとかのコアパッケージが依存しているから切り戻せるかどうか怪しいバージョンアップは危険過ぎる >>400
とてもいい情報ありがとう。
ちょっと試してみる。 セキュリティの勉強をしているのですが、CSRF対策で使用するトークンは、【入力】→【確認】→【実行】の場合、どのタイミングで生成するのが一般的ですか?
IPAの安全なウェブアプリケーションの作り方や、徳丸浩さんの参考書も見ているのですが、難しいです。
詳しい方、アドバイスをください。
よろしくお願いします。 入力-確認を経ないでいきなり実行が出来る場合は実行時に
入力-確認-実行と遷移してきたのを保証(改ざん検出)する場合は全てに 最近増えてるけどCSRFでパスワード再入力求めるとこってユーザビリティ悪すぎだよな >>403
俺、詳しくないけど、【確認】だと思うよ >>404さん
>>407さん
アドバイスありがとございます。
日付が変わってしまい、申し訳ありません。
いただいた助言を踏まえて学習を続けます。
ありがとうございました。 基本は重要な操作をする前の画面でトークン入れて、次の重要な操作で突き合わせる。
例えば、情報を編集する カートに入れる 決済する といったもの。
一番重要な最後の決済だけでやればいいと、カートに入れるに対策をしなかった場合、
よそのサイトでカートに詰め込められたあと、
カートに入れてる品物を確認せず、気づかずに決済を実行してしまうケースも考えられる。
またここで気づいたとしても、覚えのない物を買わされそうになったという不信感が生まれる。
ということで実害は少なくても、カートに入れるにも対策をするべき。
という感じで、どこに必要かを考えてみるといい。
入力→確認画面→実行で考えると、
入力をCSRFで受け付けてしまっても、確認画面に行くだけで攻撃に有効性はないが、
よそからのリクエストを受け付けてしまうことが、脆弱性を生むそもそもの原因なので、
実害はなくてもトークンがなければ全ての画面でリクエストを受け付けないと、
全画面に入れるのも全然あり。 >>409さん
実装によって必要な箇所が変わるのですね。
わかりやすい例えをありがとうございます。 そもそもの話
CSRF対策用のトークンは出力の際に自動で付与するようにし
チェック処理も自動でやるようにしないと
駄目だと思う
XSS対策なんかもそうだけど
こういう事にいちいち人の手を入れる余地があると
必ずミスが発生する
要するにフレームワークに任せなさいってこと
勉強のために自前で実装したいならトークンは
output_add_rewrite_var()
を使って自動付与してチェック処理内に
そのトークンを必ずチェックするような処理を加えればいい
トークンはセッションIDに何らかの種を加えたハッシュ値を使うのが楽
そこまで手間ではない
https://qiita.com/mpyw/items/8f8989f8575159ce95fc
この例を output_add_rewrite_var() を使って
トークンを自動付与するように改造してみるといい mktime,gmmktime,strtotimeで9時間遅いタイムスタンプが出力されてしまいます。
time()の値は、正しい今のタイムスタンプが出ます。
ズレが9時間なので標準時からの時差なんだろうと推測していますが、原因、解決策が分かりません。
どの様な所をチェックしてみるべきでしょうか? >>412
ロケールの設定が適切でないからじゃね
date_default_timezone_set('Asia/Tokyo'); >output_add_rewrite_var()
これは知らなかった
テンプレートに明示的に書きたいし
必要性を感じないけどさすがPHPなんでもアリだな >>414
ありがとう。
ハマって午前中潰してしまったのが、一発で上手くいったよ。 >>413
PHPの生みの親自らがそう言ってるしな >>411さん
アドバイスありがとうございます。
output_add_rewrite_var()は初めて知りました。
フレームワークについては脆弱性をしっかりと理解して、対処方法を学んでから使おうと考えています。
ありがとうございました。 むしろフレームワークを使わない方が脆弱性が増えると思う
セキュリティは最低限の知識しかないけど、追いかけてたら人生終わるってのはよくわかった >フレームワークについては脆弱性をしっかりと理解して、対処方法を学んでから使おうと考えています。
これがプログラマーとしてあるべき姿
>追いかけてたら人生終わる
問題があったときに対処できる幅が広がるから
高級言語やるなら低級言語からやれっていう極論は見たことあるし
時間の無駄だしそれはさすがにないわーって思ったけど
XSSとXSRFとSQL Injectionの3つぐらいは
時間もたいしてかからんしPHPerなら仕組みから知っておくべきだと個人的には思う >>421
ちょうどその3つだわ、師匠から教わったの
プリペアードステートメンド、htmlspecail quat〜
とか言ってたな
もう俺はFWに全部任せるけど、FWを避ける派はどうしてんだおるな スキルのないやつの
XSS対策した(つもり)
CSRF対策した(つもり)
ほどたちの悪いものない
そんなの全く知りません
と言ってくれた方が100万倍マシ
勉強のために車輪の再発明をする事自体は大いに推奨するが
自分のスキルのなさは自覚してもらわないと困る XSS程度のものならFWも度々やらかしてる
一度導入したらアップデートはなかなかされないというのもFWにはありがち
サーバのログ見てもわかるようにある物を導入してるのを前提に攻撃してくるので
オープンソースのものを使うというのは狙われる危険性も増える
FWを使うなら最新情報もちゃんと追うように >>423
そうそう
完全に自覚してるし、だからFWに完全に依存
クライアントにも言っているよ、本気でデータ保護やりたいなら別の業者にお願いしますってね あらゆる攻撃から守り続けることができるベンダーは本当に羨ましい アマグラマーが商売してんじゃねえよ!
適当なもん組んでんじゃねえぞ!オラ!!!!! >>411は別に脳死で既存のフレームワークに丸投げしろという意味ではないんだけどね
俺々マイクロフレームワークでもいいから
そういう処理を自動で行うように設計した方がいいってこと
例えばXSS対策なんかは htmlspecialchars() をいちいち通してたらミスが起こるから
テンプレートエンジン側で {{ $var }}のようにすれば
自動でエスケープするようになってるわけだ
人はミスをする生き物だからミスが入り込みにくい設計を考えるのも大事 どうして誰もがPHPレベルでの整合性を求めるのか,私には分かりません。整合性をとるのはフレームワークの役割です。
フレームワークは問題を解決するための全体的なアプローチを定める場所ですから。
PHPはその下のレベルにあって,ただ低レベルにあるライブラリとか関数とかへのアクセスを提供するだけの存在です。
ラスマス・ラードフの発言な
PHPの立ち位置を理解してないやつが多すぎ 自動処理は必要のないものにまで処理をすることになるから
FWを使わないような層(≒速度重視)とは思想が相容れないんでないか ところでなぜwordpressは毎回毎回セキュリティアップデートしてるの?
それだけ攻撃される穴があるの?
それとも新たな攻撃方法がみつかってそれに対処してるの?
ということはフレームワークにもいろいろ穴があるわけだよね?
なのにwordpress並にはアップデートしてない
なぜですかい? フレームワークを使わない=速度重視ってより
他人の作ったプログラムに囚われたくないんだろう
フレームワークのバージョンアップを適用したら動かなくなったとか
適用したら設定項目が増えてたとか、面倒でしょう?
使ってるフレームワークに脆弱性が見つかったとか言われ
その脆弱性で今まで被害があったのか?とか面倒なこと聞かれたら大変でしょう? >>433
高機能だkら山程セキュリティホールがある
他のFWは低機能だからセキュリティホールが少ない
>>434
まぁセキュリティホールをの説明なしにフルスクラッチで作りがる業者や個人は疑ったほうが良い
脆弱性による被害は無い→今後ある可能性がある、そのコスパは非常に悪い
こういうとこまで説明する必要がある WPはCMSでFWでない
セキュリティアップデートは利用人数と開発者人数によるとこが大きい
潜在的な問題はほぼ100%どのソフトウェアも抱えている
それが表に出ないだけ WPは設計が古すぎる
今だに低レベルなxssが起こってるのは、
テンプレートエンジンを通してないのが理由だし
プラグインで低レベルなxsrfが起ってるのは、
そこの処理がプラグイン開発者に依存してるから
良く言えば自由度が高いと言えるが、
一貫性のある手法を提供しきれてないから、
プラグインで致命的な脆弱性が頻発してる。
この辺りは430の話にも通ずるな
コードレベルでいえばglobal宣言だらけな時点でお察しだし まぁwordpressは世界のサイトの3割だかが
これで作られてるってぐらいシェアがあるから
その分攻撃対象になりやすいってのもある
サバのログ見てりゃ分かるが
中国あたりからwordpressの脆弱性をチェックする
ボットが飛びまくってくるからな PHPでフレームワーク使う必要なくね?
フレームワーク使うぐらいなら別の言語でよくね?
なんでPHPつかってまでわざわざフレームワークなんて使ってるのか?
俺にはペチパー思考はさーっぱり理解できないわw フレームワークを使うのは、既にあるものをわざわざ自分で0から作る必要なくね?ってやつだろう >>440はPHP以外にどんな言語ができて
その言語ではどのフレームワーク使ってて
例えばSQLの組み立てはどうやってるのか教えて FW使うにもプログラム言語を少しは触る必要があるわけで
PHPが簡単という嘘に惑わされた初心者がPHPから始めてるから仕方ない
最近は充実してるけどもっと早く豊富な日本語ドキュメントにアクセスできれば
圧倒的にPythonが流行っていただろうにな >圧倒的にPythonが流行っていただろうにな
無いかなぁ
日本ではHSP、ツクールが流行ってたからな。
なんやかんやでゲームとKAWAIIの国
pythonはないかなぁと思う
pythonメインのDXライブラリみたいなのがあれば流行ってたかもね >>443
俺はJava、Swift、Objective-Cとか
古い言語だとPerlも触れるけど>>440みたいな考えは全く理解できないんで
どんな言語でどんな環境だったら440みたいな考えになるのか興味があるので 芸能人レベルの一般人美女(真ん中)
向かって右端は目と鼻整形済み(本人公言)
左は高身長でナチュラル
ランク付けてみて
https://www.instagram.com/p/BrVaQVblRk7 FWを使う使わないが速度云々とか
WPとFWの区別も付いてないとか
PHPでFW使う意味が分からないとか
もうね…
このスレに初心者お断りって書いてる意味がないと思うの そういやもうwpを長らく触ってるから私は中級者ですっていわれりゃそれはそうだし、
何を持って初心者かだよな >>430
前後の肝心なとこ抜くなよ
この発言はPHPの一貫性のなさや批判に対して開き直った発言で
ラードフが初期にあんま深く考えずオレオレライブラリとして作ってたことを示してる
批判に対して整合性が欲しいならフレームワーク使えばいいということに言及したに過ぎず
ラードフ自身フレームワークの遅さを指摘しPHPでは使う必要はないと言っている
Strutsあたりで流行しRoRで完成したMVCが今主流ってだけで(MVVMも流行ってるが)
PHPはそれ以前に流行したHTML埋込み型のWebアプリケーションFWであるというのは知っておけ
>>448
速度重視するならPHP使わないとか言い出すいつものキ○ガイ?
サーバチューニングして半ば強引に最近WPは早くなってきたけれど
肥大化したアプリケーションというのは元々遅くなるもの
FW(特にフルスタック)なんてのはそういうアプリケーションの代表格 PHPの利点を殺さずMVCでコード書きたいならPhalconかSlimでも使えばいい
LaravelやCakePHPは脳死した人間が使えばいい PHPのコードを手っ取り早く早くするには
ZephirでPHPエクステンション書けばいい
WPをPHPエクステンションに移植したら有名になれるよ 可変引数でうまいバリデーション方法あったら教えて下さい
ルールとしては
・引数の数は3か4である
・$args[0]は1か2か3である
・$args[1]は1-100である
・$args[2]は$args[0]が1か3の場合1-100で$args[0]が2の場合1-10である
・$args[3]は$args[0]が3のもので英数字が入る ただし1文字目は数字はいけない
素直にコードにするとこうなります
function foo(...$args)
{
$len = count($args);
switch ($len) {
case 3:
if ( ($args[0] === 1) && ($args[1] > 0) && ($args[1] <= 100) && ($args[2] > 0) && ($args[1] <= 100) ) {
// pass
} elseif ( ($args[0] === 2) && ($args[1] > 0) && ($args[1] <= 100) && ($args[2] > 0) && ($args[1] <= 10) ) {
// pass
}
break;
case 4:
if ( ($args[0] === 3) && ($args[1] > 0) && ($args[1] <= 100) && ($args[2] > 0) && ($args[1] <= 100) && (ctype_alnum($args[2])) && (!ctype_digit($args[2][0]) ) {
// pass
}
break;
}
}
もうちょっときれいにかけたら書きたいです
これでは見直すたびに鬱になりそうです アプリケーションの文字エンコーディングがUTF-8で統一されている時、
<input>要素から送られてくる文字列の文字エンコーディングの検証は必要ですか? >>455 こういうコード書く奴とは一緒に仕事したくないなと思う 引数の数チェックいるか?俺なら最大4つ想定して無視するが
$list($w, $x, $y, $z) = $args;
switch ($w) {
case 1:
case 2:
case 3:
}
でわけたほうがすっきりする
filter_var($x, FILTER_VALIDATE_INT, [
'options' => [
'default' => FALSE,
'min_range' => 1,
'max_range' => 100
]
]);
(function($x) {
if (is_int($x) && $x > 0 && $x <= 100) return $x;
else return FALSE;
})($x)
こうしてみると下はシンプルだけど上の方がより直感的でわかりやすいと思う バリデーションは本当面倒だよね
なんかいいライブラリない? PHPで制御文字を除去する仕組みを学んでいるのですが、肝心の制御文字の送信方法がわかりません。
ツールなどを使わなければ制御文字は送信できないのでしょうか。
詳しい方、アドバイスをください。
よろしくお願いします。 ADCEBという文字列があるとし、
BとCとDの文字のうち、どの文字が最初に来るのか調べて、
最初に来た文字を変数にしまいたい場合、どのようにするのが
いいでしょうか?
>BとCとDの文字のうち
この部分はAとBを調べたかったり、CとDとEを調べたかったり
可変なのでどう処理すべきか悩んでいます。 >>465
言葉足らずだったので補足です。
ADCEBという文字列の中で、「BとCとD」の文字うちどれが最初に来るのか
調べたい、ということです
この例だとDが答えです。 全部の順序調べたりする必要もなく
最初に見つかったの返すだけならstrposすらいらぬ
$str = 'ADCBE';
$array = ['B', 'C', 'D'];
for ($i = 0; $i < strlen($str); $i++) {
foreach ($array as $char) {
if ($str[$i] == $char) {
echo $char;
break 2;
}
}
}
もうちょいコード短くしたいならforeachのとこはin_array使えばいい
つうか初心者スレ案件 >>465
ほい
$text = "ADCEB
";
if(preg_match("/([DEF])/",$text,$m))
echo $m[1];
>>468
ダッさwww 配列作ってfor/foreach回すと遅重くなるよね?
文字列操作のstrposを必要なだけ並べてやった方が速軽いんじゃないかな? みなさんありがとうございます。
>>470さんのものが簡潔なので利用させていただきます。
preg_matchをこう使う方法もあるのですね…驚きです。
ありがとうございました。 計算量考えたコード書けよ
preg_matchなんて短いだけだからな >>465-466の条件でならstrposよりも早そうだけどな
計算量だけがボトルネックじゃないから
例えば最速であろうハッシュマップを参照するのも
array_key_existsみたいな関数使わんといけないし(じゃないとエラー出る) $str = 'ADCBE';
$array = ['B', 'C', 'D'];
$pos = strlen($str) + 1;
foreach ($array as $char) {
if (($idx = strpos($str, $char)) !== false && $idx < $pos) $pos = $idx;
}
if (strlen($str) > $pos) echo "found {$str[$pos]}";
preg_matchのほうがちょっとだけ早い
1文字でいいならpreg_matchのほうがよさそう preg_matchでパフォーマンスも読みやすさも十分だろうに ■ このスレッドは過去ログ倉庫に格納されています