【PHP】質問スレッドpart20【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/08/06 15:44ID:paJ4kjjQ・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ等>>2-4
抜けているものがあったら補足願います
0414nobodyさん
04/08/15 09:51ID:???具体的にはinclude_pathに追加したい。
0415nobodyさん
04/08/15 10:02ID:???0416軟式PHP
04/08/15 11:53ID:???俺も410のように保守性を重視するよ。
0417nobodyさん
04/08/15 12:11ID:???<SELECT name="sex">
<OPTION value="女" selected>女</OPTION>
<OPTION value="男">男</OPTION>
</SELECT>
<INPUT type="submit" name="action" value="送信">
</FORM>
としてるんだが、変数が格納サレマセン。なぜでつか?
0418nobodyさん
04/08/15 12:16ID:???action="info.php"として info.phpの中身はphpinfo();のみ。
表示されたhtmlの中でセックルを探してみ
0419nobodyさん
04/08/15 12:23ID:???0421軟式PHP
04/08/15 12:44ID:???いやそのままと思うけど。既にヘッダーが出力されているから
header()は使えないってことだよ。header()周り見てみ。
何か出力してるところがあるはず。
0423419
04/08/15 12:55ID:???<?php
$action = $_REQUEST["action"];
$age1 = $_REQUEST["age1"];
$age2 = $_REQUEST["age2"];
$Region = $_REQUEST["Region"];
$sex = $_REQUEST["sex"];
$server = $_REQUEST["server"];
$cls = $_REQUEST["cls"];
$monster = $_REQUEST["monster"];
if ($action == "送信"){
$data = 'data.cgi';
$age = $age1.$age2;
$input = implode(",", array($age,$Region,$sex,$server,$cls,$monster));
$fp = fopen($data,"a");
flock($fp,LOCK_EX);
rewind($fp);
fputs($fp, "$input\n");
flock($fp,LOCK_UN);
fclose($fp);
$ok = 1;
}
header("Location:http://**********/index.php");
?>
0425412
04/08/15 13:18ID:???「private var $x;」と書いていたためでした。ばかです。
namespaceのほうはやっぱりエラーになります。
namespace Foo {
class Bar {
}
}
これだけなんだけどな。
0426nobodyさん
04/08/15 13:44ID:???RC2で消えたんじゃなかったん?
0429Imo ◆.jC7ANgFY.
04/08/15 15:10ID:???実際は「1.while 2.foreach 3.for」っぽい。
後半の二つはファイルを全部読み込むのはいいけど配列にするため
(explode&配列アクセス)の処理で時間を食っている様子。
forとforeachが違うのは、forが$i++や$i < count($data)とかを
毎回通しているためのロスみたい。
とはいってもテキトーにしか調べてない(というか差が誤差の範囲で
しかでない)から正確にはよくわからない。
whileはファイルを1回だけ読むのなら適当。
ただ、私は何度チェックしても無限ループが怖い。
forは添え字を自分で管理でき、
前とか後とかをすぐに参照できるという点で良い。
foreachは添え字が数値でなくても、
ちゃんとすべて処理できるという点で良い。
こんなところ。ただし、これは私の考えなだけ。
0430nobodyさん
04/08/15 15:43ID:???>>337のやり方で拡張子無しのファイルをPHPとして認識させるにはどうしたらいいですか?
または、別のやり方でできるのでしょうか?
0431nobodyさん
04/08/15 16:17ID:???$mode = $_REQUEST["mode"];
if ($mode != ""){
include "./page/$mode.php";
}else{
include "./page/main.php";
}
?>
もし、modeに「aiueo」が格納されているとして
「./page/aiueo.php」がない場合に他の処理を行いたいんだが・・・
どうすればよい?
0434nobodyさん
04/08/15 17:43ID:???<Files ~ "^[^\.]+$">
ForceType application/x-httpd-php
</Files>
0435nobodyさん
04/08/15 17:45ID:???$mode = $_REQUEST["mode"];
if ($mode != ""){
if (! file_exists(./page/$mode.php){
include "./page/$mode.php";
}else{
include "./page/404.php";
}
}else{
include "./page/main.php";
}
?>
これでいいのかな・・・・
0436nobodyさん
04/08/15 17:58ID:???よく見直した方がいい
0437nobodyさん
04/08/15 19:04ID:???is_fileの「filenameが存在して、かつそれが 通常ファイルであればTRUEを返します。」と
ありますが、この通常ファイルとはCGI以外という意味なのでしょうか?。
0438435
04/08/15 19:31ID:???0442nobodyさん
04/08/15 21:18ID:???parse error, unexpected '}' in
0444444
04/08/15 21:37ID:???$data = 'count.cgi';
$file = file($data);
$date = date(Ymd);
$host = getenv("REMOTE_HOST");
$addr = getenv("REMOTE_ADDR");
if($host == "" || $host ==$addr){
$host = gethostbyaddr($addr);
}
list($date1,$scount,$host2) = split( ",", $file[0]);
list($date2,$tcount,$tdate) = split( ",", $file[1]);
list($date3,$ycount,$ydate) = split( ",", $file[2]);
if ($host != $host2){
$scount++;
if ($date != $tdate){
$ydate = tdate;
$tdate = date;
$ycount = $tcount;
}
$tcount++;
$host2 = $host;
//書き込み
$data[0] = implode(",", array($date1,$scount,$host2));
$data[1] = implode(",", array($date2,$tcount,$tdate));
$data[2] = implode(",", array($date3,$ycount,$ydate));
$fp = fopen($data, "w");
flock($fp,LOCK_EX);
0445444
04/08/15 21:38ID:???rewind($fp);
fputs($fp, "$data[$i]\n");
}
flock($fp,LOCK_UN);
fclose($fp);
}else{}
print " <TABLE cellpadding=0 cellspacing=0>";
print " <TBODY>";
print " <TR>";
print " <TD align=right><FONT size=2>Total:</FONT></TD>";
print " <TD><FONT size=2>$scount</FONT></TD>";
print " </TR>";
print " <TR>";
print " <TD align=right><FONT size=2>To:</FONT></TD>";
print " <TD><FONT size=2>$tcount</FONT></TD>";
print " </TR>";
print " <TR>";
print " <TD align=right><FONT size=2>Yes:</FONT></TD>";
print " <TD><FONT size=2>$ycount</FONT></TD>";
print " </TR>";
print " </TBODY>";
print " </TABLE>";
?>
0446444
04/08/15 21:39ID:???これをincludeでページに貼ったのですが、
ページを表示して実行するとカウントされずに
ttynt.cgiというプログラムができます;;
なぜでしょうか?
0447nobodyさん
04/08/15 22:03ID:???0448nobodyさん
04/08/15 22:04ID:???なんかこう、、、夏真っ盛りだな・・・
このスレはクエリをそのまま変数に勝手に入ると思ってるのもいるし(?mode=xx→echo $mode)
もうね、アホかと
0451Imo ◆.jC7ANgFY.
04/08/15 22:21ID:???どっかのPHPのセキュリティーに関する書籍で
$mode = str_replace('../', '', $_GET['mode']);
にすればいい、とかかいてるダメなやつがあったな。
〜.php?mode=....//....//
ってどうなるんですかと問いたい。問い詰めたい。小一時間(ry
# と、愚痴をもらしてみる。
# そもそもそういうクエリを送ってくるやつははじくべきなんだよ。
0452軟式PHP
04/08/15 22:21ID:???まぁ、マルチはいくないな。
0453nobodyさん
04/08/15 22:23ID:???ああ、>>400 以降ね。
どうでもいいが、これから PHP やるヤシは何故そんな実装になってるのかよく考えてみれ。
特に変数のスコープや register_globals 関係。
例文だから考慮してないだけかも知れないが、ちょっと安易杉。
>>400 だって、ある機能に対して認証を飛ばしてアクセスが可能になるかも知れないワケで。
例えばユーザーのパスワード変更を chpasswd.inc.php に切り出して認証されたページ内から呼び出していたら
?mode=../../chpasswd.inc&new_passwd=hogehoge
とか突っ込まれる可能性もある。
>>443 も言いたいのはそれだろ。
0454nobodyさん
04/08/15 22:31ID:???> # そもそもそういうクエリを送ってくるやつははじくべきなんだよ。
ちょっと興味深い。
手軽な方法ある?
クラック目的で突っ込まれたコードが効果的に検知出来るなら、勉強のためにトラップしてログっときたい。
セキュリティを意識して欲しいだけで。バッドノウハウはびこりすぎなんで。
しっかりしたアプリケーションが書ければどこから何突っ込まれようと大体は大丈夫だ。
取り敢えず変数を区別しないのはマズい。
一つの変数を二つの意味で使うとか、由来を考えずに使うとか、ユーザーからの入力値を深度の限界無しに受け付けてるとか。
0455444,445,446
04/08/15 22:31ID:???0456nobodyさん
04/08/15 22:36ID:???0459Imo ◆.jC7ANgFY.
04/08/15 23:03ID:???preg_match('/[^\w]/', $_GET['mode']) and die('不正クエリ');
これくらいの勢いでもいいんじゃないかってこと。
どうしても"/"や"."がいるのだったら
strpos('../', $_GET['mode']) === false or die('不正クエリ');
$_GET['mode']{0} == '/' and die('不正クエリ');
とかいろいろ試してみるとよろし。その場その場にあった処理が必要だと。
# 上の例は上位ディレクトリを参照させないようにする処理
# 下の例は直接変数と使う場合以外はいらないが、絶対パスを防ぐ処理
それと、いろいろとやっかいなのが"\x00"の処理。
phpでは大丈夫(なはず)だけど気になるので、
$_GET = array_map(create_function('$a',
'return str_replace("\x00", "", $a);'), $_GET);
こんな感じであらかじめ省いておくと安全かもしれない。
# $_POSTや$_COOKIEの時も同様にしておくといい
# 場合によれば改行系列も省いた方がよい場合がある
0460nobodyさん
04/08/15 23:08ID:???0461nobodyさん
04/08/15 23:48ID:???参照先ディレクトリの制御に限った話でつか。
それは誤動作誘発に通じるルートを叩き潰すって発想で付加的な話。
基本はルートを掘られて利用されるような脆弱性をつくらない事なのでは。
という話も出しておきまつ。初心者が佃煮状態みたいなんで。
- safe_mode を使う
- ライブラリ単体で動作させない (require/include で結果を返すような書き方をしない)
- 外部ライブラリはそれ自体をセキュアな作りにする
とか。定石と普段からの意識とバッドノウハウの排除。
0462カポコン
04/08/16 00:33ID:???0463nobodyさん
04/08/16 02:30ID:vS77LDZvえと。
127.0.0.1/hoge/ で「hoge」ディレクトリーを作るのなら
mkdir(hoge,0777);で作れるけど、
例えば、127.0.0.1/hoge/hogehoge/hohoge/
でこの「hohoge」を作るにはまず上層の「hoge」と「hogehoge」を作らないといけないわけですが、
この作業を行うにはどんな書き方になるんですか?
毎回階層が決まっていれば問題はないけど、
決まってない場合がわからなくて。
よろしくお願いすます。
0464nobodyさん
04/08/16 02:38ID:???>決まってない場合がわからなくて。
↑がよく解らないんだけど、
必要なディレクトリ名を配列に入れて、その数だけループさせたら?
0465nobodyさん
04/08/16 02:40ID:???まぬあるにヒントが!
http://jp2.php.net/manual/ja/function.mkdir.php
0466nobodyさん
04/08/16 02:47ID:???今ファイルをアップする部分をつくってて
POSTされたアップロード先のアドレスが毎回違うだろうし、ってことです。
すでに作られたディレクトリー内に、1階層だけディレクトリーを作るのなら
mkdirを1度すればいいんだけど。。。
ヒントページみてみます〜〜
また分からなかったらまたきますw
よろしく!
0467466
04/08/16 04:38ID:???できました。
丸写しだけど・・・
$dir=split("/", $up_dir);
for ($i=0;$i<count($dir);$i++){
$path.=$dir[$i]."/";
if (!is_dir($path))
@mkdir($path,0777);
@chmod($path,0777);
}
if (is_dir($up_dir))
return 1;
間にいくつかif入れて目的の事は完成です。
お世話になりました!
0468nobodyさん
04/08/16 05:54ID:gbbwkQJr0469nobodyさん
04/08/16 06:33ID:???いや、まてよ・・・まさかと思うが、サーバに置いたPHPスクリプトから、
クライアント側の何かのファイルのパーミションを変更したいってわけじゃないよな?
0474nobodyさん
04/08/16 09:38ID:2LXrMV/7phpでラップ関数って作れるんでしょうか?
0475軟式PHP
04/08/16 09:42ID:???0476nobodyさん
04/08/16 10:25ID:???という文字列があって1つ目の@を(1)、2つ目の@を(2)という風に
置換したいのですが、良い方法があれば教えてもらえると助かります。
0477nobodyさん
04/08/16 10:37ID:go59Ftbg正規表現使えば?
0478nobodyさん
04/08/16 10:57ID:???何番目の@か取得する方法が分からないため、正規表現スレで聞いてこようと思います。
$1,$2の数値の部分を取る方法があるのだろうか…。
0479Imo ◆.jC7ANgFY.
04/08/16 11:03ID:???とりあえず、こんなこともできたりする。
$data = 'abcdef @ hijklmp @ aiueos.';
echo preg_replace_callback('/@/', create_function
('', 'static $a;$a++;return "($a)";'), $data);
0480nobodyさん
04/08/16 11:09ID:???まさにそれがやりたかったんです!ありがとうございます。
匿名関数を作って静的変数を使ってるあたりがテクニカルでいいっすね(>_<)
本当参考になりました。謝謝。
0481nobodyさん
04/08/16 12:11ID:???こんな感じでもいけそう。
$i = 0;
echo preg_replace('/@/e', '"(" . ++$i . ")"', $data);
0482nobodyさん
04/08/16 12:55ID:???その「うん」は >474 に対しての「うん」であるならば、
できれば具体的な内容を教えて頂きたいのですが・・・・
0483軟式PHP
04/08/16 13:12ID:???あなたの考えてる「ラップ」とは違うかもしれませんが↓教えておきます。
http://nx.eth.jp/php/manual/function.stream-wrapper-register.html
0484nobodyさん
04/08/16 14:56ID:???/[^\w]/ って /\W/ じゃダメなの?
create_functionって何回(というより何千回)も使うと遅くならね?
0485Imo ◆.jC7ANgFY.
04/08/16 15:22ID:???それでもいい、というよりかそっちのほうがいい。
create_functionは関数をつくっちゃってるからねぇ、
何回も使うのならば>481のようなものを使ったほうがいい。
そうしないと、なにをするにも遅いプログラムになってくる。
0486466
04/08/16 15:28ID:???お〜またまたレスありがと!
popenもやってみます!
mkpathの方は書き方が悪いのかうまく動かなかったです。
うむ。難しいですねー
0487nobodyさん
04/08/16 17:33ID:???array_filter を試してみましたが htmlspecialchars は使えない模様でつ。
0489nobodyさん
04/08/16 17:51ID:???でWebからの登録で自動的にディレクトリを割り当てたいと考えて
おります。
ディレクトリを作成すると所有者がapacheになりますが、その
ファイルの所有者を変更したいのです。chownはスーパーユーザで
ないと実行出来ませんとありますが、http://hoge.co.jp/でアクセスさせて
スーパーユーザーで動作させる事は可能なのでしょうか?。
apacheはapache権限です。
0491nobodyさん
04/08/16 19:39ID:???0492nobodyさん
04/08/16 20:07ID:???0493nobodyさん
04/08/16 20:29ID:???どうしたらいいんだー
マニュアルインストールなんて難しいことはわかりません。
ヘルプミーぷりーず orz
0494nobodyさん
04/08/16 21:00ID:???でつまつ使っただけで「厨だ」とかぬかすアホが。
0495nobodyさん
04/08/16 21:17ID:???そもそも、2ちゃんで礼儀などは期待していない
礼儀知らずが厨かどうかは知らないが、それに食いついてる
494が厨だとしか思えん
>>493
Windows?
0496493
04/08/16 21:21ID:???そうです。
0497nobodyさん
04/08/16 21:22ID:???条件を満たしていると思われ(厨)
0499nobodyさん
04/08/16 22:17ID:???0500nobodyさん
04/08/16 22:21ID:???installerはむりぽ
0501nobodyさん
04/08/16 22:29ID:???ミラーもダメだね
0502nobodyさん
04/08/16 22:34ID:???0503nobodyさん
04/08/16 23:01ID:???んじゃ、RingServerのミラーからでも。
http://www.dnsbalance.ring.gr.jp/archives/net/www/php/distributions/
php-4.x.x-installer.exe
0505nobodyさん
04/08/16 23:15ID:???インストーラパッケージは、ZIPパッケージに同梱されてる
各種DLL(mysql関数だとか、確かmbstring絡みも)が入ってない(足りない)から
殆どの場合、あとでZIPパッケージから足す必要があるよ。気をつけて
それとSJISでPHPのスクリプトを書くなら、
http://www.geocities.jp/rui_hirokawa/php/
じゃないと駄目。
0506nobodyさん
04/08/16 23:19ID:???って使えますか?
0508軟式PHP
04/08/17 00:35ID:???( ゚д゚)彡 サァ!!
⊂彡
0509nobodyさん
04/08/17 00:46ID:???0510nobodyさん
04/08/17 03:43ID:???PHPとjavascript間で値のやり取りをしたいのですがどうすればよいですか?
0511nobodyさん
04/08/17 05:54ID:???PHPが外部から受け取る変数は $_GET $_POST $_COOKIE である以上、
javascriptからそれらを操作するものを使う他あるまい?
0512軟式PHP
04/08/17 14:07ID:???( ゚д゚)彡 サァ!!
⊂彡
何か面白いもんつくりてーな。
0513nobodyさん
04/08/17 17:09ID:???ある PHP スクリプトが include/require 等で呼んでいるファイルを全部引っ張る方法って無いでしょうか。
fileA
include('fileB');
fileB
include('fileC'); include('fileD');
とあった場合、fileA が fileB, fileC, fileD を読み込んでいる事を fileA 側から確認出来ないか、といった具合です。
■ このスレッドは過去ログ倉庫に格納されています