トップページphp
1001コメント321KB

【PHP】下らねぇ質問はID出して書き込みやがれ 113

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/11/29(火) 19:55:27.17ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 112
http://hibari.2ch.net/test/read.cgi/php/1320005469/

◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0083662011/12/03(土) 17:05:05.70ID:???
>>67-71
どうにも難しいみたいですね。
\を\自体と\xの2パターンあるのが難しい理由みたいです。

結局、最初にAAの様なキーを作って
改行→AA1、タブ→AA2・・としました。
もちろん、最初に変換対象の文字にAAは無い事を調べた上で。
全パターンのキーがあってキーの作成が出来なかったら破綻しますけど・・・
0084nobodyさん2011/12/03(土) 17:22:33.21ID:???
>>82
$string 内にあるアクセント付きアルファベット($diac) を
アクセントの無いアルファベット('AAAAAA〜')に strtr して、strtolower してる
0085nobodyさん2011/12/03(土) 17:30:37.82ID:UqIE+ehV

 =& ってどういう意味ですか?
0086nobodyさん2011/12/03(土) 18:18:59.34ID:50KGadHw
>>84
これは自分たちのような日本語を使う場合でも必要な処理でしょうか?
外国だから必要なのかなと思いまして
見たことがなかったので
0087nobodyさん2011/12/03(土) 21:52:27.47ID:AR407ZHO
phpをfastcgiのように、常に起動させる為のコマンドオプションとか
知っていらっしゃる方がいたら教えてほしいです。


0088nobodyさん2011/12/03(土) 21:59:06.19ID:zvnHXPsG
1024サイズのモニタで作成したHPは27インチワイドとかの
モニタではどのように表示されるのでしょうか?
0089nobodyさん2011/12/03(土) 23:36:02.97ID:???
>>88
作り方次第。PHP関係ない

>>87
検索して調べられないなら知らなくていいんだと思う。

>>86
いらない

>>85
http://jp2.php.net/manual/ja/language.references.whatdo.php

>>83
えー
0090662011/12/03(土) 23:53:42.79ID:???
ファイルロックに関してです。
2つのプロセスを走らせて、プロセスAで
$fp=fopen("A.txt","r+");
flock($fp,LOCK_SH);
ftruncate($fp,0);//←ここでファイルサイズが0になる
fseek($fp,0);
fwrite($fp,"あいうえお");
fclose($fp);
と言う処理をusleep(200000);で0.2秒sleepさせながら実行し
もう片方のプロセスBは
$fp=fopen("A.txt","r+");
fgets($fp);
fclose($fp);
という普通のファイル読取処理を0.1秒間隔で実行し、fopenが成功したか、fgetsが成功したかを順次表示させています
clearstatcacheは毎回しています。

プロセスAだけであればあいうえおという文章が書き込まれるのですが
プロセスBを同時に走らせるとプロセスAのfwriteで0が返ってきて書き込みに失敗し、ファイルサイズが0になってしまいます。
この原因も知りたいのですが、ファイルロックについて詳しく知りたいです。

LOCK_SH、LOCK_EXそれぞれの場合、そのロックを行い
別プロセスでfopen、fgets、fclose、filesizeの様なファイルに関係有る処理を行った場合、どうなるのが仕様なのでしょうか。
ロックされているファイルに対してプロセスBでfopenを行った場合、プロセスAでロックが解除されるまでプロセスBは待機されるのかと思ったのですが
そうはなりませんでした。
0091nobodyさん2011/12/03(土) 23:54:04.67ID:???
名前欄は特に関係ないです
0092nobodyさん2011/12/04(日) 00:03:25.67ID:???
>>90
http://php.net/manual/ja/function.flock.php
まず、正しい使い方と注意事項読んでね。

でも、いろいろ検索するとこれじゃ駄目だって分かると思うよ。
0093nobodyさん2011/12/04(日) 00:59:35.07ID:zQYW8hqE
PHPで数式を扱いたいのですが、教えて下さい
例えば、簡単な例で言えば高校数学の組み合わせで出てくるコンビネーション(C)等を表すPHP関数はマニュアルを見てもないようです
他にも、Σや微分・積分など(まぁ、微分・積分は自分は必要はないですが)

これらのような方程式などを扱うためのライブラリとか、アルゴリズムの載ったサイトとかありましたら教えていただきたいのですが

ある数式をPHPで・・・と思ったのですが、その最初の数式の方程式の所で分からなくなりまして
0094nobodyさん2011/12/04(日) 01:15:52.07ID:???
Cなんか、自分で作っても一瞬でしょうに。
ここで聞くなら、その数式を書かなきゃ。
0095nobodyさん2011/12/04(日) 01:45:19.41ID:???
>>94
同意
必要ななのか、CやらPやらの作り方を書くだけでも答えてくれるかもよ
0096nobodyさん2011/12/04(日) 01:48:20.62ID:zQYW8hqE
>>94
まぁ、コンビネーションなどは確かにすぐではありますが、数式の例がパッと浮かびませんでして上記のようなものを適当に書いてみました
すみません

自分のやりたい数式は統計、分析系でしてΣ、条件付確率を多用します
一からそういった数式のアルゴリズムを学習して、何度の高いものに挑戦しようかと思いまして
ライブラリに関しましても、そのまま利用するよりも中身をハックしようと考えていました


単純ベイズとか、ピアソンの相関係数とかやってみたいと思っています
0097nobodyさん2011/12/04(日) 01:50:51.85ID:???
>>92
なるほど、flockはflockにのみ影響を与えるのか。
つかめてきました。ありがとう
0098nobodyさん2011/12/04(日) 01:56:44.95ID:???
>>96
PHPよりCのほうがいろいろ揃ってる気がする
0099nobodyさん2011/12/04(日) 02:39:44.21ID:???
>>83
単に前からなめてけばいいだろ
0100nobodyさん2011/12/04(日) 02:41:43.64ID:???
ぺろぺろ
0101nobodyさん2011/12/04(日) 03:05:45.07ID:UvLgiAdt
【OS名】CentOS
【PHPのバージョン】5.2
Digest認証をしてるディレクトリ内にあるPHPスクリプトから、
同じディレクトリ内のページにfile_get_contentsすると失敗する。
file_get_contentsで認証できませんか?
0102nobodyさん2011/12/04(日) 11:16:41.58ID:ZwuGc3Sg
【OS名】Linux系(詳細不明)
【PHPのバージョン】5.3.5
【連携ソフトウェア】MySQL
【質問内容】
海外サーバ(ローカルタイムは米国西海岸)を使っていて、
MySQLに時刻データ(日本時間)を保存するとき、どの方法がスマートですか?
データ更新時刻を保存します。

1. CURRENT_TIMESTAMPで西海岸時間を保存して、表示で日本時間を作る
2. time()でUNIX時間をINTで保存して、表示で日本時間をつくる
3. 日本時間を作ってDATETIME形式で保存
4. その他

今は3で日本時間を作ってDATETIME形式で保存するように書いてみたのですが、
UNIX時間の方が処理しやすいことが多いかと思います。
DATETIME形式だとSELECTすればそのまま読めるので便利なのは間違いないですが。
皆さんはどのようにしていますか?
0103nobodyさん2011/12/04(日) 14:00:17.69ID:???
>>102
素直にサーバー内の時間変えたら?
0104nobodyさん2011/12/04(日) 14:00:18.40ID:uNIlr6eZ
switch文についてですが、
case 1:
 処理
case 1:
case 2:
 処理
 break;
・・・

の処理で、下の処理を先にしなければならないとき、
case 1:
case 2:
 処理
case 1:
 処理
 break;
・・・

にすると、case2は最後まで条件文をたどることになりますよね?
回避策としては、
case 1:
case 2:
 処理
case 2:
 break;
case 1:
 処理
 break;
・・・

ぐらいしか思い浮かばないのですが、冗長な気もします。
何か良いアドバイスをください。
0105nobodyさん2011/12/04(日) 14:04:59.47ID:???
>>104
???
0106nobodyさん2011/12/04(日) 14:26:45.63ID:ZwuGc3Sg
>>103
MySQLに接続のたびにタイムゾーンを変更する必要があるので、
変更をし忘れると時刻の整合性がとれず、えらいことになるので
それは避けたいところです。
0107nobodyさん2011/12/04(日) 15:25:26.81ID:DlY6x1ss
Y!ニュースのコメ欄を取得したいです。
↓JSON形式?がうまく変換できません、誰か教えて!

<?php

$url = "http://capi1.cpf.yahoo.co.jp/camp/v1/list/?prop=1&uri=http%3A%2F%2Fheadlines.yahoo.co.jp%2Fhl%3Fa%3D20111203-00000051-jij-soci";
$file = file_get_contents($url);
echo json_decode($file);

?>
0108nobodyさん2011/12/04(日) 15:30:49.25ID:???
JSONPみたいだから
先頭の「listhandler(」と末尾の「)」を削ってからjson_decode()に渡してみては?
0109nobodyさん2011/12/04(日) 16:16:27.90ID:DlY6x1ss
>>108 できました!ありがとうございます^^
0110nobodyさん2011/12/04(日) 16:20:58.73ID:f63/zsl+
PDOでの接続に日本語を含むパスは使えませんか。
オープンできないんですが。Windowsです。
0111nobodyさん2011/12/04(日) 16:24:32.79ID:f63/zsl+
こんなのみつけました。読み込み方法はありますか。



ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
PHPのデータベース・アクセス・ライブラリPDOは、DB接続時の文字エンコーディング指定ができないため、文字エンコーディングの選択によっては、プレースホルダを使っていてもSQLインジェクション脆弱性が発生します。
http://www.tokumaru.org/d/20100701.html


phpファイルはUTF-8で保存して、設置パスに日本語が含まれないように注意(DBファイルが開けない)。
http://www.tumblr.com/tagged/pdo?before=1321315724
0112nobodyさん2011/12/04(日) 16:47:23.36ID:???
>>111
1個目は関係ないよ
0113nobodyさん2011/12/04(日) 17:12:55.32ID:???
>>102
TIMESTAMPもDATEも現地時間で保存なんかしない
タイムゾーンを設定するのはクライアント側の仕事
接続する度に SET time_zone = '+9:00'; なり発行しなさい
01141042011/12/04(日) 17:17:45.05ID:???
PHPだけの話じゃないので他で聞いてきます
スレ汚しすみません
0115nobodyさん2011/12/04(日) 18:07:39.98ID:???
>>114
いや、ここでもいいんだけど、何がしたいかがわからん
0116nobodyさん2011/12/04(日) 18:09:00.78ID:???
各処理に処理A、処理Bとか書いてないからわけわからんね
0117nobodyさん2011/12/04(日) 22:01:35.78ID:???
ほんと読解力ないな。

case 1:
 処理A
 処理B
 break;
case 2:
 処理A
 break;

を無理やりフォールスルーで何とかしたいって話だろ。
アドバイスとしては「やめてください」。
0118nobodyさん2011/12/04(日) 22:02:39.93ID:???
やめてくださいで終わりだけどさ。
部下がこれどうしますって言ってきたらやめろで終わりだけどさ。
0119nobodyさん2011/12/04(日) 22:46:22.38ID:???
処理をfunction化するか、switch文を分割するか、が妥当な方法だと思うけど
既存のコードをあまり変えたくないなら>>104でもいいんでないの
0120nobodyさん2011/12/05(月) 01:33:15.00ID:???
>>114
【MySQL】下らねぇ質問はID出して書き込みやがれ 2
http://hibari.2ch.net/test/read.cgi/db/1322402682/

DB板にココをパクッたのがあったwww
0121nobodyさん2011/12/05(月) 02:49:55.96ID:???
http://hibari.2ch.net/test/read.cgi/tech/1322981274/10-
0122nobodyさん2011/12/05(月) 03:36:31.20ID:???
相手にされてなくてワロタ
0123nobodyさん2011/12/05(月) 04:13:37.79ID:PhZ7RtX8
クラスに存在しないメソッドを呼び出された時の処理ですが、$this->obj->{$name}の引数を決め打ちにしてます。
これをエレガントにする方法ってありますか?

function __call( $name, $arguments ) {
if( method_exists( $this->obj, $name ) ){
return $this->obj->{$name}( @$arguments[0], @$arguments[1], @$arguments[2], @$arguments[3], @$arguments[4]);
}else{
parent::__call( $name, $arguments );
}
}
0124nobodyさん2011/12/05(月) 05:20:52.70ID:???
>>123
呼び出すときにそのobjがどんなメソッドと引数を持っているか
推測しないといけない設計はあまり好まず…そこは素直にクラス作りんしゃいに一票。
0125nobodyさん2011/12/05(月) 05:52:43.56ID:Df4UWWf4
質問です。
ネット上のオセロの対戦サイトっぽいの作ろうと思っています。
そこで、通信のやり方が分かりません。
不特定多数の人がそのサイトにログインするまではいいのですが、対戦は1対1なので、
対戦が始まったらその二人の間でのみ通信が行われないといけないのですが、
そのような通信は一体どうやればいいのでしょうか?
オセロのプログラム、描画はJavaScriptで書いています。
0126nobodyさん2011/12/05(月) 06:04:21.68ID:???
対戦が始まってもサーバーのphp介さないとできないよ
0127nobodyさん2011/12/05(月) 06:08:30.42ID:4I6BeXxu
PDOプリペアドステートメントについて質問です。

ソートに使用するorder byやdescやascを、
バインドしてもうまく働きません。

$sort_by = "hoge"; //実際は外部から取る値
$is_desc = true; //外部から指定

$stmt=$dbh->prepare("select * from t where 1 order by :sort :which");
$stmt->bindValue(":sort", $sort_by);
if ($is_desc) {
 $stmt->bindValue(":which", "desc");
} else {
 $stmt->bindValue(":which", "asc");
}
$stmt->execute();

これは内部で
select * from t where 1 order by hoge desc
ではなく、
select * from t where 1 order by "hoge" "desc"
となってるからなのは分かるのですが、
こういうケースの場合はどうしたらいいのでしょうか?

よろしくお願いします。
0128nobodyさん2011/12/05(月) 06:10:49.64ID:???
>>126
はい、そこで、PHPで、どうやって対局者二人にだけ通信処理を行うようにするのか
知りたいのです。
0129nobodyさん2011/12/05(月) 06:25:04.96ID:???
対戦中の2人が数秒置きにリクエストを送ってサーバに問い合わせる
サーバは送られてきたクッキーとセッションを照合しながら二人を追う
現在のゲームの進行状況をクライアント(2人)に返す
返した結果によってクライアント画面に反映する
この繰り返し

片方側からのリクエストが途絶えて
片方からのリクエストを3回連続で受け取った場合
もう片方はゲームを途中でやめた判定する

いわゆるポーリングという技法
実装が簡単だがよりリアルタイムに近づけるにはインターバルを1秒未満にしなくてはならず
ゲーム中はF5アタックをしてるようなものなのでレンタルサーバではやってはいけない
0130nobodyさん2011/12/05(月) 06:39:35.66ID:???
>>129
成る程、分かりやすいです。
送られてくるクッキーとセッションで送信者が識別できるのなら実現できそうです。
やっぱりいろいろと問題もあって、難しそうですね。
レンタルサーバーでもやり方次第でなんとかなると思ったので、いろいろ試して
みようと思います。
とにかく簡単なプロトタイプを作って動かすまではやってみます。
01311272011/12/05(月) 07:25:44.75ID:4I6BeXxu
order by句を指定せずソートをプログラム側で行うか、
プリペアドステートメントは使わず、PDO::query()+PDO::quote()で行うしかないんでしょうか?
なんかベストな解決方法を知っていたらお願いします。
0132nobodyさん2011/12/05(月) 13:11:31.92ID:???
>>123
call_user_func_array(array($this->obj, $name), $arguments);

>>131
ORDER BY句は自力で組み立てて
そっから PDO#prepare() に渡す
ちなみにバインドできるのはリテラル値だけ
0133nobodyさん2011/12/05(月) 14:23:18.46ID:???
>>132
http://stackoverflow.com/questions/8343399/calling-a-function-with-explicit-parameters-vs-call-user-func-array

横からだけど
引数が5つ以上になると call_user_func_array のほうが早くなるんだな…
それより短い場合は短ければ短いほど不利で
引数が一つだけ取るようなケースだと、二倍くらい遅くなると。勉強になりました感謝。
0134nobodyさん2011/12/05(月) 16:17:45.57ID:uI9LFaIu
質問させてください!
まずはソースを貼ります。
$_query =
"select F.seq_user, U.seq, COUNT(F.seq_user) AS total
FROM tbFavorites AS F
LEFT JOIN tbUser AS U ON F.seq_user = U.seq
    group by F.seq_user
order by total desc limit 25";
if ($result = $mysqli->query($_query)) {
if ($result->num_rows > 0) {
$userranking = array();
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
$userranking[] = $row;
}
$result->close();
}
}
for($i=0;$i<25; $i++){
$_query =
"select COUNT(F.seq_user) AS total
FROM tbFavorites2 AS F
WHERE F.seq_user = ".$userranking[$i]['seq']."
limit 1";
if ($result = $mysqli->query($_query)) {
if ($result->num_rows > 0) {
$row = $result->fetch_array(MYSQLI_ASSOC);
$userranking[$i]['total']= $userranking[$i]['total'] + $row['total'];
$result->close();
}
}
}
$smarty->assign('userranking', $userranking);
0135nobodyさん2011/12/05(月) 16:24:09.16ID:uI9LFaIu
134のソースの解説です。
tbFavorites(商品ジャンルA)、tbFavorites2(商品ジャンルB)はユーザが二つの種類の商品をお気に入り
に登録するためのtableです。

今どのユーザがたくさんお気に入り登録したかをランキング形式で出そうとしています。
しかし134のソースではジャンルAでまずランキング上位25人を出してしまっています。

本当ならジャンルAとジャンルBの合計値を出したあとに上位25人を出したいのですが
うまいやり方が思いつきません。どなたかお知恵をお貸しください。
0136nobodyさん2011/12/05(月) 16:54:20.79ID:???
合計値で25件とれるSQLにするか、
全件とって自分でがんばるかどっちか

0137nobodyさん2011/12/05(月) 16:56:30.82ID:uI9LFaIu
合計値で25件とれるSQLを作りたいのですが
うまくいきません。JOINとUNIONで試してみたのですが
全然期待通りの値にならないのです。。。
0138nobodyさん2011/12/05(月) 17:43:15.14ID:???
UNIONしたやつをGROUP BYでどう?
テーブル構造は?
DB板のが答え速そうだな
0139nobodyさん2011/12/05(月) 18:24:42.35ID:???
>>134
UNIONでできなかったってのが、UNION ALLでダメだったのかどうかにもよるけど。

select count(seq_user) as total from (
select seq_user from tbFavorites
union all
select seq_user from tbFavorites2
)
group by seq_user
order by total desc limit 25

あと、tbUserと結合する意味がなさそう。
0140nobodyさん2011/12/05(月) 18:25:52.85ID:???
って、ユーザ情報出したいからか。ごめんごめん。
0141nobodyさん2011/12/05(月) 19:07:21.50ID:wb46KamG
phpで外部リソースを取得する関数って
セキュリティ的に問題ないんですか?負荷も掛かるだろうし。
0142nobodyさん2011/12/05(月) 19:08:59.07ID:???
スクレイピング全般に対する懸念?
0143nobodyさん2011/12/05(月) 21:33:08.80ID:???
踏み台にされんように注意はせんとね
0144nobodyさん2011/12/05(月) 21:48:37.75ID:FlRxYHcs
PHPってR言語対応のモジュールとかライブラリ、関数とかありますでしょうか?
マニュアル見たところ無いようなのですが
statsは全然まとめられていないながらも、あるようですが
0145nobodyさん2011/12/05(月) 23:53:12.26ID:???
たまに¥マークがついてるコードみるけど
¥マークはどういう時に使うのでしょうか?


class Model_Crud extends \Model implements \Iterator
0146nobodyさん2011/12/05(月) 23:56:49.45ID:???
>>145
スレタイを声に出して読みましょう
0147nobodyさん2011/12/06(火) 00:12:06.88ID:???
志村〜
0148nobodyさん2011/12/06(火) 00:23:22.19ID:???
http://www.php.net/manual/ja/language.namespaces.faq.php
0149nobodyさん2011/12/06(火) 00:29:20.77ID:???
>>148
ありがとうございます。
0150nobodyさん2011/12/06(火) 12:02:11.48ID:bGnivCFj
質問させてください
携帯で、あるページにアクセスした時、その携帯のメーラーを立ち上げることってできるでしょうか?
どうやったらいいでしょうか
PHP5を使っています
0151nobodyさん2011/12/06(火) 12:02:28.57ID:OdBx5Qxg
>>138,139
ありがとうございます。おかげさまでできました。
お礼が遅くなりました><
原因はgroup byがちゃんと使えてませんでした。
0152nobodyさん2011/12/06(火) 12:51:16.74ID:???
>>150
メアド踏めばそうなるけど、そういうことじゃなくて?
0153nobodyさん2011/12/06(火) 13:09:00.01ID:???
mailtoストームみたいなことやりたいんじゃね
01541502011/12/06(火) 13:09:11.32ID:bGnivCFj
>>152
レスどうもです。そういうことではないんですよ
1)リンクを踏む
2)ページAに遷移してDB処理、終わったらページBにリダイレクト
3)ページBに移動したら自動的にメーラーが立ち上がる
というのをイメージしています

ページBにリダイレクトしなくても、ページAでのDB処理が終わったあとに
何らかの方法でメーラ起動できればそれでいいんですが…
header関数とかの問題かなと思ったんですが、ヒントが見つからない状況です
01551502011/12/06(火) 13:10:07.14ID:bGnivCFj
>>153
そんなことやりませんよw
0156nobodyさん2011/12/06(火) 13:32:46.53ID:???
>>154
header('Location: mailto:test@example.com');
0157nobodyさん2011/12/06(火) 13:38:57.60ID:???
やったことないけど、メアドに302するとどうなんの
0158nobodyさん2011/12/06(火) 13:39:18.56ID:???
って同じことがかかれてたw
0159nobodyさん2011/12/06(火) 13:56:53.94ID:???
普通にリンクなりボタンなりをクリックさせた方がいいんじゃないの?
メーラーが勝手に開くのは怖いしウザい
0160nobodyさん2011/12/06(火) 14:10:13.41ID:???
気持ち悪がられて客を逃す
避けるべき実装
0161nobodyさん2011/12/06(火) 14:12:49.28ID:16sWocHt
>>159
メーラーが勝手に開くリンクからメール送ったことってほとんどないな。
01621502011/12/06(火) 14:19:00.41ID:bGnivCFj
>>156
こんな簡単なんですか
すみませんでした、試してみます。ありがとうございました

>>159-161
ご意見どうもです
説明不足でしたが>>154の「1)リンクを踏む」のリンクに「メールを送る」と書くつもりです
多分大丈夫かと…
ありがとうございました
0163nobodyさん2011/12/06(火) 15:06:42.60ID:???
>>161
携帯だと空メ登録よくあるからいいんでないの
0164nobodyさん2011/12/06(火) 16:56:44.79ID:???
>>162
gmail しか使ってなかったり linux のクライアントだとメーラー設定してなかったり
あるのでテキスト直書きで、テキスト@hoge.com 件名は○○○で送ってください
とか併記しておいて欲しいと思う吉宗であった…
0165nobodyさん2011/12/06(火) 20:56:46.07ID:16sWocHt
フォームにデータを入力すると画面が切り替わるようなサイトで、
URLはhoge.phpのまま変わらないというのがありますが、
これはPOSTメソッドで同じURLにPOSTして、ifなどで条件分岐して
表示を変えているんでしょうか?

この手法は一般的ですか?
トークンによるCSRF対策も問題なく動作しますか?
0166nobodyさん2011/12/06(火) 20:58:56.71ID:???
>>165
問題ないよ
0167nobodyさん2011/12/06(火) 21:00:57.91ID:16sWocHt
>>166
ありがとうございました。

cart1.php
 ↓
cart2.php
 ↓
cart3.php
とか書いていたのですが、ダサイので書き直します。
0168nobodyさん2011/12/06(火) 22:44:11.20ID:QHQ8UGsv
【OS名】CentOS 
【PHPのバージョン】5.3 

お世話になります。セッションについて勉強中です。

[A]というサイト上にあるログイン用のプログラムで
session_name(セッション名);
セッション名を設定した上でセッション利用
cookieにはランダム文字列のセッションIDが記録されます。

このあと、全く別サーバー・別ドメイン上にあるPHPで
echo $_COOKIE["セッション名"];
と書いてアクセスすると
[A]サイトのセッションID(ランダム文字列)が丸見えになっています。

1.悪意のある人が$_COOKIE["セッション名"];でセッションIDを抜き出す
2.偽装した上ですぐさま[A]サイトにアクセス
3.ログイン状態

となってしまうのではと想像しているのですが
何か良い対策は無いでしょうか?

セッションに対する自分の認識自体が間違っていたら面目ございません。
0169nobodyさん2011/12/06(火) 23:16:25.33ID:???
>>168
セッション名とセッションのキーを混同してないか
0170nobodyさん2011/12/06(火) 23:28:44.00ID:???
>>168
BサイトにAサイトのクッキーを差し出すUAがいるってことか
0171nobodyさん2011/12/07(水) 14:57:17.18ID:???
>>168
とりあえず、青木ヶ原かどこかへ行った方が良い
ここでは君のような池沼は扱っていない
0172nobodyさん2011/12/07(水) 14:57:42.29ID:???
そうなってませんで終わりだろが。
0173nobodyさん2011/12/07(水) 16:15:10.80ID:wyHjvonw
ブラウザを閉じたらセッションは終了すると聞きました。
その場合、端末側のcookieは自動的に削除されますか?

端末側から一定時間操作をしないとセッションが終了しましたと
表示されるサイトがありますが、これはどのようなコードを
書いているのでしょうか?

セッションスタート時に、その時刻をセッション変数に記録する
次のセッションスタート時に、前回記録した時刻と現在時刻を比較して
一定以上経過していると、ログインページに案内する
こういう仕組みでいいのでしょうか。

それともsession.gc_maxlifetimeをいじればいいのでしょうか。
0174nobodyさん2011/12/07(水) 16:27:58.44ID:???
ブラウザを閉じたらセッションが終了するわけではありません。閉じようがずっと続くようにも出来ます。

セッションは、時間で消され たり します。
session.gc_maxlifetime などが関係ありそうです。

また、それとは別にセッション時間を記録するのも、それでなにをしようと自由です。
そのときは、セッションを自分で消さなくちゃいけません。
0175nobodyさん2011/12/07(水) 16:40:10.05ID:wyHjvonw
>>174
>閉じようがずっと続くようにも出来ます。
逆に、ブラウザを閉じたらセッション終了するにはどうすればいいでしょうか。
0176nobodyさん2011/12/07(水) 16:42:40.64ID:???
>>175
ブラウザを閉じたことをサーバ側が知ることはできません
01771732011/12/07(水) 16:49:16.54ID:wyHjvonw
>>176
ということは、
セッションが開始されると端末側にcookieができる(許可する場合)
サーバ側はそのcookieでセッションが継続していると判断する
ブラウザを閉じても、cookieがあって、セッションの有効期間中なら
セッションは継続される
ということですか?

別件ですが、セッションIDをURLに埋め込む場合、
どのようなセキュリティ対策が必要ですか?

1. http→httpsに移行するときにセッションIDを変更する
2. セッションIDが無効なときは、トップに転送
を考えていますが、セッションIDが無効かどうかはどのように判断できますか?
0178nobodyさん2011/12/07(水) 16:53:00.73ID:???
cookieでセッションが継続していると判断するというのが若干違うのかなぁ。
セッションを継続したり保持してるのはサーバーで
cookieに入れるのはその名前というかキーだな。 cookieがあったとしても
セッションがあるかどうかは別。
0179nobodyさん2011/12/07(水) 17:01:38.88ID:???
>>177
そのセッションIDつきのURLをほかの人が使ったときに、セッションの乗っ取りができないようにする対策が必要です
01801732011/12/07(水) 17:16:59.06ID:wyHjvonw
>>178-179
ありがとうございます。

たとえば、
アリスがセッション 111 をスタート
セッション111は失効または手続完了でdestroyされる
あとで、アリスまたはボブがセッション111をスタートしても、
前回の続きを表示せず、別の正当なセッションID 123 を発行する。

チャーリーが存在しないセッション 222 を指定したときは、
そのIDを無効として受け付けず、代わりに正当なセッションID 234 を
発行する。

このようなことができればいいと思っています。
0181nobodyさん2011/12/07(水) 17:19:13.21ID:???
>>180
上と下は同じこと言ってるの分かる?
01821732011/12/07(水) 17:21:57.43ID:wyHjvonw
>>181
セッション111がガーベージコレクトされていなければ、
サーバ側にまだ情報は残っているので、セッション111を
指定すれば取り出すことはできないですか?

そういう意味で最初から存在しないものと区別したつもりだったのですが。
■ このスレッドは過去ログ倉庫に格納されています