【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 >include('/path/file.txt');
/ から始まっているから、何かからの絶対パスかな?
プロジェクトルートか、公開サイトのルートからの絶対パスかな? 上のは言ってみればfile://になるんじゃないの? 違う? 公式のmail()とmb_send_mail()のページを見ていたのですが、
mail()のsubjectは表題、messageはメッセージ、
mb_send_mail()のsubjectは件名、messageは本文となっていました。
これは何かが違うということでしょうか。
くだらない質問と思いますが、よろしくお願いします。 全く同じ意味ですが異なります
この事に気をつけて厳密に取捨選択し、
どっちでもいいから適当に使いましょう mailはエンコードしてくれないから自分でしてから呼び出す。
mbはエンコードしてくれる。
というか、ググれよ! どっちの関数も直接使うには勝手が悪いので、さっさと基礎理解してライブラリ使うようにしましょう。 <form method="get" でsubmitした場合、
$_GETを使うのが普通だと思うのですが
$_POSTでも値が取れるのですが、そういうもんですか? 普通だけど普通じゃなくなって来たから、filter_input使う。
このスレの上の方にも出てる。 >>619
それちゃんとGETメソッドで送ってる?
GETとPOSTでは受け渡し方法が違うから
ちゃんとやっていればPOSTでは受けとれないはず >>621
WordPressなんですが、
form タグを埋め込んでbuttonクリックでsubmitしているので間違は無いと思います。
でも何故か$_GETでも$_POSTも値が取れるんです。 methodをgetでサブミットしてるなら
HTTPプロトコルではcontent bodyの部分は空になる
そういう仕様だからな
つまり通常postで取得できる部分はからっぽ
methodをpostでサブミットしてるなら
そういう状況はHTTPプロトコルでも十分にありえる
uriにurlエンコードされた文字列が含まれる状況でpostしたケースならありえるということになる
ちなみにオレはスクリプトの変数にその値がどう格納されるかは知らない
質問してるヤツは
getでサブミットしてんのになんでそんなことがおきんの?
というのが質問の主旨と理解した
低学歴知恵遅れがその質問をどう解釈したかは知らない >>619
サーバーのログって見ることは出来ない?
リクエストがどういうメソッドでやり取りされたか分かると思うけど >>624
冗談にムキになって… 低学歴知恵遅れとかw
主旨についてはわかってて書いてんの。
それが5chというところだから。 はい低学歴知恵遅れ図星
ごまかそうとしても
もうバレてるからな
分かりやすいわ。。。 冗談は冗談が通じる相手にしないと
この質問者はPOSTとGETについて理解できていないんだから
冗談だとは受けとってないと思うぞ 冗談とは言え、とりあえずパケットキャプチャしてみたら?に行き着いて欲しかったんだけどな。
その後、フレームワークなりの変数の検査するとか。
やり方を切り分けて絞り込んでいかないといけない。 PHPを始めたのですが分からないことがあるので教えてください。
https://qiita.com/mpyw/items/2f9955db1c02eeef43ea
上記ウェブサイトに次のコードがあるのですが、配列?を使用する理由を教えてください。
if (!isset($_POST['email'])) {
$errors[] = 'Eメールアドレスが送信されていません';
} elseif ($_POST['email'] === '') {
$errors[] = 'Eメールアドレスが入力されていません';
}
よろしくお願いします。 >>631
この例文の中では特に意味はない。post したページに戻る際、エラーをまとめて送る時に使う。 >>632
このような使い方もあるんですね。
教えてくださり、ありがとうございました。 HTMLとPHPを使ってメールを送信するため、次のように書いたのですが、良いか悪いか判断ができません。
右も左も分からないため、どのようなことでも構いませんのでアドバイスをください。
メールは【入力】→【確認】→【送信】の流れで送信されます。
どうか、よろしくお願いします。
【input.php】
https://ideone.com/cEGHAA
↓
【check.php】
https://ideone.com/R9GueN
↓
【thanks.php】
https://ideone.com/R2mR1b form.php
confirm.php
send.php
こうすると良いと思う >>635
アドバイスありがとうございます。
辞書を引いたら納得しました。
さっそく反映したいと思います。 ネタにマジレスしてるんで、仕方ないからチラ見してみた。
このスレのダメな例の集大成みたいだな。
受け取った値の長さに制限を掛けて、巨大データを受け入れないようにする。
HTML側でもmaxlengthやtype="email"やrequiredを使うと気休めになるかも。
PHP側でも長さをチェックする。
filter_inputの使い方が違う。
受け取った価をあえて$_SESSIONに入れてどうする?
それは使わずに$subjectとかに代入する。
mail関数に入れるデータはエンコードするか、mb_send_mailを使う。
あとは動いてるならいいんじゃない? 勉強のためならいいけどガチでサービスに導入とかはしない方がいいと思うよ
既存のサービス使った方が絶対に安全 class内のプロパティに関数って指定できないでしょうか?
class Test {
public $date = date("Y-m-d");
}
というイメージです。これを記述しても
Parse error: syntax error, unexpected '(', expecting ',' or ';'
というエラーが出るので無理だと思っているのですが、
できる方法があれば教えてください。 やり方はいろいろあるが、一般的にはコンストラクタの中で代入するんじゃないかな やり方はいろいろあるが、一般的にはコンストラクタの中で代入するんじゃないかな >>637
アドバイスありがとうございます。
次を課題に学習を進めたいと思います。
・HTMLとPHPで値の長さに制限を掛ける
・filter_inputの使い方を理解する
mail関数に関してもmb_send_mail関数と合わせて考え直します。
セッション変数については入力されたデータを持ちまわる体で使用しようと考えているのですが、type="hidden"の方が良いのでしょうか。
今は自身の理解が不足しているので、もう一度最初から取り組みます。
アドバイスありがとうございました。
>>638
アドバイスありがとうございます。
やはり既存のサービスの方が安全ですか。
今は自身のために勉強したいと思います。
アドバイスありがとうございました。 このくらいのフォームなら hidden の方がいいんじゃね。
セッションでなんかメリットある? >>643
参考URLありがとうございます。
hiddenとセッションの使い分けを勉強します。 >>646
う、うん。
でも一番はそこじゃないんだな。
スーパーグローバル変数を書き換えるべきではないのに、
そらをしてしまっているところね。
そもそもスーパーグローバルを使わないためのfilter_inputだから。
最初は誰でもそんなもんだから頑張ってね。 >>647
さっそく勘違いしてしまいました。
アドバイスありがとうございます。 そのURLを見たけど、tarファイルを展開してLinuxでコンパイルしてるよね。
この時点でWindowsはまったく該当しないので見てもわかるわけない。
Windows用のコンパイル済みバイナリをインストールするのが正解かと。
それか、そのファイルをWindowsで自前コンパイルするか。 ありがとうございます。
いくつか調べてlibpuzzleがC言語で作られているはわかりました。
Windowsだとsoファイルではなくdllファイルで動かすみたいだから
libpuzzle.cをコンパイルしてdllにする、という感じなのでしょうか? C言語は…、ちょっというかさっぱりわからないですね…。
GitHubでlibpuzzleの解凍されたフォルダが有りました。
https://github.com/jedisct1/libpuzzle
もし参考になれば >>647
そこで言ってるスーパーグローバルの書き換えって $_SESSION のこと? >>654
そう。
言われてハッとしたんだが、もしかして俺すげー嘘ついてる?
フレームワーク無しなら$_SESSIONに代入せざるを得ないか?
何かもう忘れたわ。
適当な記憶でたまに嘘ぶっこくから少し自重する。 面白い議論だと思ってたんだけど
できれば続けてくださいな
セッションは使用禁止にすべきかどうかまで >>655
うん、$_SESSION はこれを直接触る以外のアクセス方法は無いと思う。
そしてセッションのクリアとか考えるのも面倒なので、今回のケースだと hidden の方が手軽だと思う。 libpuzzleはインストールが困難と判断したので、
他のものを調べたところ、Perceptual Hashが良さそうだったので変更しました。
コンポーザーをダンロードして、インストールはできました。
ですが、実行すると「Uncaught Error: Class 'Jenssegers\ImageHash\ImageHash' not found」といったように認識されません。
Windows7のXAMPPだとuseの書き方が違うのでしょうか?
ソースは以下の通りです。
use Jenssegers\ImageHash\ImageHash;
use Jenssegers\ImageHash\Implementations\DifferenceHash;
$hasher = new ImageHash(new DifferenceHash());
$hash = $hasher->hash('path/to/image.jpg');
echo $hash;
// or
echo $hash->toHex(); ちゃんとautoload.phpをrequireしてるか? >>648
>>657だって! 本当に申し訳ないです。 投稿フォームは、確認画面なくすと session 使う必要がなくて、スマートな実装になるよ。
そもそも確認が必要な内容かどうか検討してみると良いです。
確認が必須なら、モーダルで一旦表示させて投稿させると UX も向上して happy。
ただ、画面はちょっとややこしくなるけどねぇ。。。 >>660
何それ…
やってない
帰ったらやってみる >>634のfilter_inputって使い方間違ってるん?(´・ω・`) 美しさはともかく、間違ってはいない。
勘違いしていたのは俺…
申し訳ないです。 提唱者が逃げ出したから、
こういう時にどう使ったら良いか
教えてくれない ユーザー入力を画面上に表示する場合、どんな時でもhtmlspecialchars関数を使った方がいいんですか !? >>667
個人的にはここの説明が納得しやすかった
https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d
画面表示で Content-Type: text/plain の時は、当然だけど必要無い。
text/html な中で、text/plain はちょっと思いつかなかった。
だれかフォローよろしくw 考えられるパターンとしては
1.入力値の検証はせずそのまま出力する
2.入力値の検証はせずhtmlspecialcharsを使う
3.入力値の検証→問題はないのでそのまま出力
4.入力値の検証→問題なのでhtmlspecialcharsを使う
5.入力値の検証→問題はないがhtmlspecialcharsを使う
6.入力値を出力前に無害化してそのまま出力
1は当然やっちゃだめ
6は元の入力値と異なる可能性が生まれるので使うなら重要でない箇所限定(非推奨)
5は冗長だが5が一番おすすめ phpの質問じゃないかもしれないんだけど
URLから指定のディレクトリにアクセスした時に
ファイル名が何だろうと指定のファイルを参照させることって出来ますか?
hoge.com/rand/test.txt
hoge.com/rand/aaa.jpg
randディレクトリにアクセスしたら
ファイルの有無に関わらず
hoge.com/rand/index.phpを参照させて
test.txtやaaa.jpgのURL文字列に応じて
phpが振る舞いを変えてコンテンツを表示させたいです
そんなこと可能でしょうか? 要するに
hoge.com/rand/aaa.jpg
を見てるつもりで
hoge.com/rand/index.php?q=aaa.jpg
で内部的に処理して返したいってことです file(”aaa.jpg”)
で表示できたような print file($_GET[q])
だったかな
忘れた >>671
mod_rewriteを使って、
RewriteCond %{REQUEST_FILENAME} hoge.com/rand/(.*)$
RewriteRule ^hoge.com/rand/(.*)$ %1/%2/index.php?q=$1
こんな感じでリクエストを書き直す?
うまく行くかちょっと自信ない PHPの処理はHTMLの外で行い、結果だけをHTMLの中に表示する方法が良いんですか?(´・ω・`) >>676
その方がいいと思うよ。
HTMLを修正する理由と処理を修正する理由は大抵違うから、それぞれ分けておくと都合がいいと思う。
分業の面でもいいし、処理の見通しも良くなる。
ただそう作るなら、表示(見た目)のためのコードは処理側から排除するのがいいと思う。
エスケープはもちろん、例えばマイナスの数値を表示するのに▲を付ける仕様だったとして、それを行うコードはHTML側に実装する感じ。
処理側で▲付きの文字列を作るようなことするとカオスになっていく。 >>676
そしてPHPはHTMLを分けるというのが非常に簡単にできるから、やらなくちゃ損くらいに思った方がいい。
<?php
:
いろいろ処理;
:
include 'gamen.html';
?>
みたいに include するだけで表示されるんだから。
実際には gamen.html にはわずかなPHPコードも入る純粋な HTML ではないから拡張子を .html とするよりは、.php なり .tpl(テンプレート)なりそれっぽいのにしておくといいと思う。
案外 .php にしておくと、ブラウザからそれを直接見てもPHPのコードは直接見えないから手軽な安全策かも。 >>677
>>678
分けた方が管理しやすいですか(゜-゜)
ありがとうございました。 今回乗っ取りが可能な脆弱性が発見されましたが、その脆弱性を試したいです。
どうすればいいのでしょうか? Bug #76582が原因らしいからバグレポート読んでみたら?
再現コードも書いてるよ
まぁ単にXSSが可能だったってだけでそれ以上でもそれ以下でもないが laravelを始めようと思うのですがrailsと比べて何が良くて何が悪いのか聞きたいです
僕自身railsはチュートリアルやったくらいしか知りません set_file_buffer (stream_set_write_buffer)が動作しないということが2003年ごろから言われているみたいですが
今さっき検証してみたところやはり-1が返ってきて動作していないようです
何故こんな関数が未だに存在しているのか、わかる方よろしくお願いします
http://jp2.php.net/stream_set_write_buffer POSTされた値を最初に変数に代入してから検証するのと、
検証してから変数に代入するのとでは安全性に違いはありますか?
変な質問で申し訳ない(´・ω・`) 一概には言えないが、値の検証はその値を使う直前にやるのが一番良い
検証の後に不用意に値が書き換わってたら検証の意味がない >>685
いただいたレスを参考に考えた結果、値を使う直前に検証することにしました。
アドバイスありがとうございました。 >>658です。
お返事遅くなってしまい申し訳ないです。
>>660
うまくいきました。
XAMPPだと相対パスだとうまく行かなかったのですが、
絶対パスだとうまく行きました。
どうもありがとうございます。 if($A === $B){
$A;
}else{
$B;
}
と
if($A !== $B){
$B;
}else{
$A;
}
って どっちが良いですか !?
って聞かれても俺にはわかんねーよ(´・ω・`)
というグチ >>688
!== より === の方がタイプする労力が小さいから前者 結果は同じでもどちらに主軸をおくかによってニュアンスが変わる
例えばコンサート会場でチケットを持っている人は通し持ってない人は通さない場合
チケットを持っている人を通したいに主軸を置くと普通のスタッフを連想するが
チケットを持ってない人を通さないに主軸を置くと警備員のようなもっとお硬い物を連想する
$A===$Bを比較したいのか$A!==$Bを比較したいのか
自分が何をやりたいのかどこに主軸をおきたいのか考えれば自ずと答えは出るでしょう thenが通常処理、elseが異常(エラー)処理ってイメージ
通常処理がn種類(複数)あるって感じな場合は、二択だったとしてもswitchにしてる $var = getA();
if (!$var) {
$var = getB();
}
if (!$var) {
$var = getC();
}
if (!$var) {
$var = getD();
}
if (!$var) {
return false;
}
return $var;
こういうコードをもっとスッキリさせる書き方ってないですか? get($ident)的な関数作って
$var=false;で初期化して
["A", "B", "C", "D"]をぶん回して見つかれば$var上書きしてbreak 短絡評価でbooleanが返ってくる言語だからなぁ
return getA() ?? getB() ?? getC() ?? getD() ?? false;
でnullが返ってくると順次後ろに落ちていくようには出来る
falseが返ってくると打ち切られて結果もfalseになる みなさんレスありがとうございます
実際はもっとメソッド名が長く、引数が複数あり、一つ一つが若干重い処理なので
現状が一番スマートのような気がしてきました Cなら関数ポインタを配列にツッコんでぶん回す
危険かどうかは触れない メソッドに応じて引数も可変ならcall_user_func_array()使えばいいだけじゃない?
そんな大層な話しか?30秒で書けるがw
function hoge()
{
$methodArr = [
'A' => ['a', 'b'],
'B' => [],
'C' => ['c', 'd'],
];
foreach ($methodArr as $method => $params) {
if ($result = call_user_func_array($method, $params)) {
return $result;
}
}
return false;
} 行数的には>>693と大差ないが
$methodArrのところを定数にでもしておけば
動作に変更が入ってもそこの定義を変えるだけで済むわな
さすがに>>693はないわ
見ただけで頭がクラクラするw >>688みたいに
if(){
}else{
}
と詰めて書く人ってPSRなんか読んだ事ないんだろうな
if () {
} else {
}
と書きなさい >>700
>>693 の方がシンプルでスッキリしてて速くて分かりやすいコードだと思うよ。
>>699 の利点てなに? メソッドや引数が減ったり増えたり順序が変わったりした時に
699なら”コード”を触らず”定義”の修正だけで済むが
693だと”コード自体”を修正する必要があるな call_user_func_arrayなんてあったんだね。
じゃあこれ一択だわ。
理由は>703 >>703
hoge が呼び出す関数達の引数は hoge に渡された引数だったり別の変数だったりを含むんじゃないの。
それを事前に定義するって?
仮に定義できたとして、そんな内部のロジックに直結した定義を修正するのはコードを修正するのに加えてそんなに気安いことなの?
>>693 のコードを大体そのまま hoge.conf にでも書いて、
function hoge()
{
if(!@include_once 'hoge.conf') {
retur false;
}
return $var;
}
とでもする方がまだマシなんじゃね。 >>703
>>700に同じ事書いたんだけどなw
>>704
だよね
>>705
頭固いねw
理解できないならもういいわw >>706
定義と称してロジックを別の形で書いてるなら、ロジックをそのまま書けばいいだろう?
んで引数に変数はどうやって渡すの? これは絶対にこうだって話でも何でもなく、おおよそこれまでの経験に基づく好みの方がデカいと思うけど。
>>693の実際のコードや運用保守まで知り得ないから、絶対こうだと第三者が結論づけるのはナンセンスだと思う。
自分は実際にこのようなケース(Cで)楽にメンテできた実績があるからこっちを選ぶけど、
こういう方法もあるよってディスカッションならどんどんやればいい。 今更include_onceなんかを使ってるしむしろ693より悪化してるという
699みたいに動作定義を配列変数にしておけばその中に更に変数やメソッドの返り値を持たせることだってできるだろうに >>708
うん、方法としては知っていていいものだからどんどん上げればいいと思うが、>>700 この言い草だからな。 >>709
その変数やメソッドの返り値を定義した具体例を挙げてみてよ。 ■ このスレッドは過去ログ倉庫に格納されています