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

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

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

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

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

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

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0242nobodyさん2010/10/16(土) 00:39:04ID:???
あ・・・<?
0243nobodyさん2010/10/16(土) 00:45:46ID:YK7HI7ry
ありがとうございます!
やっと完成しました。
0244nobodyさん2010/10/16(土) 01:08:54ID:gWKvdlCe
1〜10文字の、ひらがな、漢字、全角カタカナ、全角英数字 という
チェックをかけるため、下記の正規表現をぐぐりながら書いてみた
のですが、どうも正常に動作しません。

if(!(preg_match('/[ぁ-んァ-ヴーa-zA-Z0-9]{1,10}/u', $_REQUEST['text']))){
  errot();
}

恐れ入りますが、ご教示いただけますと、幸いです。
もし他に何か方法があればそちらを教えていただけますと幸いです。
0245nobodyさん2010/10/16(土) 01:09:42ID:???
utf-8
0246nobodyさん2010/10/16(土) 01:11:27ID:???
> errot();
何だかエロいなw
02472442010/10/16(土) 01:15:53ID:gWKvdlCe
>>245
1つ上で
$_REQUEST['text'] = mb_convert_encoding($_REQUEST['text'], "UTF-8", "SJIS-win");
をしていて、ソースがUTF-8のため/uオプションをつけているのですが、
これがいけないのでしょうか。
すみませんがご教示ください。

>>246
すみません、、errorでしたね。。
0248nobodyさん2010/10/16(土) 01:27:40ID:???
>>247
「正常に動作しません」とは具体的に何がうまくいかないのかな。
うまくいく文字列、うまくいかない文字列があれば例示すべし。
ちなみに>>244のままだと文字列の一部に全角文字が含まれてれば通過するんじゃないかな。
0249nobodyさん2010/10/16(土) 01:59:46ID:???
「全角」をTRUEとするなら
!preg_match('/[a-zA-Z0-9]{1,10}/u',
じゃ、ダメなん?
0250nobodyさん2010/10/16(土) 02:04:46ID:???
>>238
>>228は同じテーブルっぽくない?

>>243
>>241の書き方はXSSという攻撃の対象になり得るので、下の用にしましょう。

<php?
$url = htmlspecialchars($_POST['abcde'], ENT_QUOTES);
?>
<form action="<?php echo $url; ?> " method="post">
0251nobodyさん2010/10/16(土) 02:07:57ID:???
<php?
0252nobodyさん2010/10/16(土) 02:10:02ID:???
>>249
それだと{1,10}が意味をなさねぇだろ
0253nobodyさん2010/10/16(土) 02:10:43ID:???
>>241=251
0254nobodyさん2010/10/16(土) 02:14:10ID:???
?>
0255nobodyさん2010/10/16(土) 02:19:25ID:???
>>250
XSS理解してんの?
0256nobodyさん2010/10/16(土) 02:50:29ID:???
>>250
htmlspecialchars使えば万事OKではない
htmlspecialcharsのデフォルトの文字コードはISO-8859-1、php.iniの文字コードとスクリプトの文字コードが食い違うとXSS可能
なのでちゃんと第三引数まで指定すること

あと、>>234の場合だと2バイト文字を含まないのでctype_printで先にチェックしておく
2バイト文字を含むならmb_check_encodingでチェック、これもちゃんと第二引数まで指定する
0257nobodyさん2010/10/16(土) 03:10:26ID:???
つーか、それ以前に$_POST['abcde']で得たURLを
直接<from action="〜">に再投入することが問題。
0258nobodyさん2010/10/16(土) 03:15:03ID:???
そういう場合もあるだろうさ
そのときにどうセキュリティ対策するかという話
0259nobodyさん2010/10/16(土) 03:21:54ID:???
であればセキュリティ対策のしようがない。
htmlspecialchars掛けたって偽装URLは排除しようがない。

>>234のようにあらかじめURLの選択肢が決まっているのであれば
そのURLを直接送信せずに選択肢番号のみを送信し、受け取った 2.php 内で
その番号に応じたURLを埋め込むような仕様にすべき。
0260nobodyさん2010/10/16(土) 03:45:00ID:???
POSTなら問題にはならない
他人にはURLとして誘導できないからな
0261nobodyさん2010/10/16(土) 04:16:38ID:???
ならhtmlspecialcharsだって意味が無い。
クリックした本人にしか影響がないわけだからな。
XSSを考慮するなら、偽のindex.phpを用意して本物の 2.php にPOSTするような
攻撃方法も考慮すべき。
0262nobodyさん2010/10/16(土) 04:18:40ID:???
間違えた。
前半2行は無視してくれ。
0263nobodyさん2010/10/16(土) 04:31:25ID:???
>>260
POSTもGETも関係ない、htmlが置けるスペースがあればPOSTで任意のデータを他人に送らせれる
0264nobodyさん2010/10/16(土) 04:37:03ID:???
「ら」抜き言葉は止めろ
0265nobodyさん2010/10/16(土) 07:22:06ID:YK7HI7ry
度々すみません。

攻撃されるって誰からですか?
0266nobodyさん2010/10/16(土) 10:41:23ID:???
>>265
いたずらっ子。
0267nobodyさん2010/10/16(土) 13:34:00ID:???
え?影響あるのは自分だけでは?他人に送らせるってどういうこと?
0268nobodyさん2010/10/16(土) 13:41:34ID:I74M7hiK
POSTは外部から送ることもできるだろ
0269nobodyさん2010/10/16(土) 13:42:42ID:???
送って、それはどこに表示されるの?
0270nobodyさん2010/10/16(土) 13:47:14ID:???
え?
0271nobodyさん2010/10/16(土) 14:12:49ID:???
259 nobodyさん sage 2010/10/16(土) 03:21:54 ID:???

>>234のようにあらかじめURLの選択肢が決まっているのであれば
そのURLを直接送信せずに選択肢番号のみを送信し、受け取った 2.php 内で
その番号に応じたURLを埋め込むような仕様にすべき。

これに興味あり。なんで?
0272nobodyさん2010/10/16(土) 14:36:37ID:???
>>271
HTMLなんか書き換えられるんだから、変なURL突っ込むことも可能だろ
あらかじめ数字か何かで決めておけば、変なのが来ても弾ける
0273nobodyさん2010/10/16(土) 15:08:04ID:???
>>267

<script>
window.onload = function(){
  document.frm.submit();
}
</script>
<form action="http://example.com/" name="frm">
<input type="hidden" name="abcde" value="http://example.org/" />
</form>
0274nobodyさん2010/10/16(土) 15:11:31ID:???
2.phpで個人情報等を入力させるっていう前提?
0275nobodyさん2010/10/16(土) 15:49:36ID:???
2.php の目的によってはURLをそのままPOSTしても問題はあまりないかも
でも一般的なプログラミングとしては>>259のようにしたほうがいい
もちろん 2.php 内でPOSTされた数値の正当性もチェックする
0276nobodyさん2010/10/16(土) 20:03:39ID:avUbsZ6o
ファイルの文字コードを取得したいと思い、

$text = file_get_contents('text.csv');
echo mb_detect_encoding($text);

としたのですが、文字コードが取得できません。
どうすればいいのでしょうか?
0277nobodyさん2010/10/16(土) 20:17:42ID:???
コードにおかしいところはないと思う。
どんなエラーメッセージが表示される?
0278nobodyさん2010/10/16(土) 20:34:01ID:???
>>276
$textの内容をechoして確認せよ
0279nobodyさん2010/10/16(土) 20:44:46ID:avUbsZ6o
>>277-278
echo してもなにも表示されない状態です。
0280nobodyさん2010/10/16(土) 20:45:51ID:avUbsZ6o
あ、$textをechoしたら普通にファイルの中身が表示されます。
0281nobodyさん2010/10/16(土) 20:49:25ID:???
echo mb_detect_encoding($text);
の結果がFALSEだとしたら検出に失敗している
ちなみにmb_detect_encodingは必ずしも検出できるとは限らない(対象文字列による)し、
文字列によっては誤検出する場合もある。
0282nobodyさん2010/10/16(土) 21:15:41ID:avUbsZ6o
それでは検出する方法はないのでしょうか?
検出したいのはファイルの文字コードで
ファイルの文字コードがUTF-8以外の場合は、
mb_convert_encondigでUTF-8に変更するというのが目的です。
その為に、ファイルの文字コードを知る必要があると思いました。
0283nobodyさん2010/10/16(土) 21:25:46ID:???
日本語の文字コード認識を完全に自動で行うのは困難。
mb_convert_encodingの第3引数を"auto"にして自動変換する場合も同様。
"mb_convert_encoding UTF-8" あたりでググるとよい
0284nobodyさん2010/10/17(日) 00:28:12ID:???
>>255
受け取ったURIを使うような方法はもちろん自分ではやらないよ。
>>255の質問の意図は何?
0285nobodyさん2010/10/17(日) 01:29:32ID:???
>>284
>>250で「下の用にしましょう」として「受け取ったURIを使うような方法」を示してんじゃん。
0286nobodyさん2010/10/17(日) 02:04:43ID:???
> ○○○の部分ににindex.phpの三択で指定したURLを自動的に取得できるようにしたいのですが

これに対する回答だからじゃないの?
0287nobodyさん2010/10/17(日) 02:40:23ID:N98scqjc
皆さんはphp.iniで
error_reporting = E_ALL & ~E_NOTICE
の設定にして、全てのエラーや警告が出ないように作ってますか?
そこまでする必要はあるのでしょうか?
お仕事でPHPを使っている人は、やっぱりそのへん厳密にやってるんでしょうか…。
0288nobodyさん2010/10/17(日) 03:52:16ID:???
>>287
http://www.php.net/manual/ja/security.errors.php
想定外のアクセスやアタックがあった際にエラーの内容からプログラムの構造を推察されないように
したいのならエラーを抑制すればいい。
独自のエラーハンドラ関数を作成してエラーを表示しない代わりにログに記録することもある。
0289nobodyさん2010/10/17(日) 04:38:13ID:???
>>287
開発用とリリース用で違う
0290nobodyさん2010/10/17(日) 10:47:44ID:???
厳密っていうかでないのが当たり前っていう思考だからなんとも
正しい書き方を身につければそんなこと考えもしないよ
0291nobodyさん2010/10/17(日) 11:00:19ID:GEOHnAz9
mdb2のwhereのことなんですが、
たとえば、dataのカラムにabcを含む場合、だったら

where `data` like '%abc%'

となりますが、どのカラムでもいいのでとにかくどこかにabcが含まれている場合、だったらどうなりますか?

where `*` like '%abc%'

と書いたら、undefined method ってエラーがでました
0292nobodyさん2010/10/17(日) 11:31:46ID:???
>>291
それPHPの質問じゃないけどちゃんとageてるので答えると
テーブルごとにやるしかないよ
0293nobodyさん2010/10/17(日) 12:05:33ID:???
>>287
それだとNOTICEでないよね?
うちはNOTICEは全てでないようにしないと品質保証部のの許可が下りない
0294nobodyさん2010/10/17(日) 14:12:52ID:???
品質保証部って運用テストのバイトの人?
0295nobodyさん2010/10/17(日) 14:24:49ID:???
>>292
回答ありがとうございます
テーブルごとにやるとしても、カラムもカラムごとでしょうか?
0296nobodyさん2010/10/17(日) 15:13:27ID:???
WebでもQAエンジニア雇うところはあるよ
0297nobodyさん2010/10/17(日) 15:25:41ID:???
>>295
ごめんテーブルじゃなくてカラムだった
0298nobodyさん2010/10/17(日) 16:06:41ID:???
全部連結して、比較は1つ、でもいいけどね。
まあ連結するとき間にセパレーター置かないと誤判定するか
0299nobodyさん2010/10/17(日) 17:10:20ID:???
>>297-298
ありがとうございます
無理なんですね
いろいろ代案考えます
0300nobodyさん2010/10/17(日) 17:22:16ID:???
どこから考えるのかわからんけど、そもそも複数カラムに対して同じものを比較する時点で
設計に問題があるかも
0301nobodyさん2010/10/17(日) 17:37:18ID:???
>>290
そうなんですか。
undefined indexっていうwarningが出ないようにしていくのが
とても大変で・・。
0302nobodyさん2010/10/17(日) 17:39:50ID:???
>>300
簡単にいうとモンスターリストがありまして、
抽出で、生息地や全長などで絞り込めるんですが、
「フリーワード抽出」の項目を設けて、「○○の文字をどこかに含むもの」でも絞れるようにしたいのです
現状だと、カラムすべてに対して書いてるんですが、簡略化できるんではないかと思い立ちましてお尋ねした次第です
0303nobodyさん2010/10/17(日) 18:23:32ID:???
>>302
全カラムを取得してループでクエリを組みたてれば「記述するのは」楽になる。
実行速度的(スケーラビリティ的)には仮に*が使えたとしても列挙したのと大して変わらない。
カラムが100項目もあるとかいうなら考える余地はあるけど、そこに拘ってもあまり得はない。気持ちの問題。
業務システムじゃむしろ列挙しなきゃだめなんじゃないかね。
あとageてね・・・。
0304nobodyさん2010/10/17(日) 18:28:05ID:???
>>303
そうですね
楽しようというのが主旨でしたが、これくらいちゃんと書けって話ですね
目が覚めましたありがとうございます
03052872010/10/17(日) 21:34:04ID:???
オープンソースのものを自分の環境で動かしてみたら、Warningは一つも出ませんでした。
やっぱり熟練者は正しい書き方ができてるんですね。

>>293
NOTICEは出さないようにしてます。
そこまでするべきでしょうか?
0306nobodyさん2010/10/17(日) 21:40:07ID:???
>>305
出さないようにできてるならそれでいいのでは?
0307nobodyさん2010/10/17(日) 22:56:51ID:5JoLPq4l
readfileとクッキーについてお聞かせください。

ヘッダ、フッタなどサイト上の多くのページで同一のHTMLがある場合これを別のファイルにして
各ページからreadfileで読み込むようにしています。

readfile("inc/header.inc");//ヘッダを読み込む
といった具合です。

同時にこのページでクッキーも利用したいと考えているのですが、
readfileはクッキーを無効にしてしまうようで正常に動作してくれませんでした。
各所でreadfileの説明を読んでみても無効にする、といった説明はないのですが常識的なことなのでしょうか。

またこの場合includeなどを用いるべきなのでしょうか。
御指南よろしくお願いいたします。
0308nobodyさん2010/10/17(日) 22:57:03ID:???
>>306
必死に出ないように書いてるんです。
>>290さんの言われているように、慣れれば当たり前のように正しい書き方ができるのかもしれませんが、
今はすぐに警告や注意が出るのでとても疲れます。
0309nobodyさん2010/10/17(日) 23:02:11ID:???
>>308
仕事じゃないんでしょ?
自分でテストして問題無いと思えば無視すれば?

仕事なら規約次第だけど、小さいとこだとNOTICE無視は結構ある
ようはテストして動けば良いという考え
03103072010/10/17(日) 23:06:35ID:5JoLPq4l
readfileをする前に、というよりHTTPヘッダを送信する前にクッキー操作を行うようにしたらうまくいきました…
HTTPヘッダ送信以前にクッキー操作をするのは常識でしたね…
お恥ずかしい限りです…

スレ汚し申し訳ありませんでした…
0311nobodyさん2010/10/17(日) 23:19:38ID:???
>>309
そうですね。割り切ることにします。
あと、変数の前に@を付けると回避できることがわかったので、使ってみます。
ありがとうございました。
0312nobodyさん2010/10/18(月) 01:07:02ID:???
ちょw
0313nobodyさん2010/10/18(月) 01:19:08ID:???
>>312
ちょ?
0314nobodyさん2010/10/18(月) 06:29:04ID:Ea5b1l3E
$fooには数字、$barには文字列が入っていて、
$list[] = $foo.' :'.$bar;
arsort($list);
foreach ($list as $value){
echo $value."<br>";
}
とやると、

7 :hoge
61 :hogehoge
5 :hogehoge3

って感じで頭の数字一桁分だけでソートされてしまうんですが、
これを$fooで入れた数字の大きさでソートさせるようにするにはどうしたらいいでしょうか
0315nobodyさん2010/10/18(月) 06:53:23ID:???
>>314
$list[] = sprintf("%02d",$foo).' :'.$bar;
0316nobodyさん2010/10/18(月) 07:02:11ID:???
>>314
natsort() を使う
0317nobodyさん2010/10/18(月) 07:12:35ID:???
>>315
ありがとうございます
3桁になると上位二桁のみで判定されるのでだめでした

>>316
ありがとうございます
これ使います
0318nobodyさん2010/10/18(月) 08:14:10ID:GNgSoasg
決してCGIユーザーの煽り目的とかではないのですが、質問です
phpで調べてみると脆弱性とか修正できない問題が結構多いのですがphpの将来性ってどうなんでしょうか?
なんだか致命的な欠点が多いのでその内自分の学んでるphpの知識が無駄になってしまうのでは?と思ったりしてるのですが
0319nobodyさん2010/10/18(月) 08:35:47ID:???
>>318
無駄になる可能性のない言語なんてあるの?
0320nobodyさん2010/10/18(月) 08:45:26ID:???
>>319
ブルーレイと東芝のDVDみたいなモンだろ。どっちのレコーダー買えばいいかみたいな
そりゃ欠陥ばっかりのモノより将来性のある方選んだほうがいい

俺はまだphpは未成熟で可能性としては未知数と思ってる
perlと比べると長ったらしくなるコードがphpだと物凄い短くなるし
0321nobodyさん2010/10/18(月) 09:43:13ID:???
>phpで調べてみると脆弱性とか修正できない問題が結構多いのですが
PHPが深刻な脆弱性を多々抱えてるわけではない
ではなぜそういうことが言われてるかというと
プログラムする人のコーディングミスによるセキュリティーホールが
PHPだと発生しやすいからだ
PHPに脆弱性があるんじゃなくて
作成したWebアプリケーションに脆弱性を発生させ易いのがPHPということ
ここらへんがPHPは初心者向けであって初心者向けでないと言われる所以
PHPが本当は内部処理で適切にコーディング内容を処理すればいいんだけど
ユーザ任せになってるところが問題なだけ
熟練者にもミスはつきものだが熟練者にとってはラピッド開発できる優秀な言語でもある
0322nobodyさん2010/10/18(月) 09:49:08ID:???
まずPHP自体が結構多く持つ脆弱性とか修正できない問題を知りたいのだが
0323nobodyさん2010/10/18(月) 09:49:25ID:fqdWguE4
現在、借りている鯖のPHPバージョンが5.1Xで、5.2を使いたいのですが
シェルログインに対応していません。
FTP等から、PHPのバージョンアップをしたりすることは可能でしょうか?
0324nobodyさん2010/10/18(月) 10:10:04ID:???
root権限じゃないと無理でしょ
鯖管にメールしてバージョン上げられるか交渉してみなよ
そこのレン鯖の新しいサーバで5.2に対応してるならそっちに引越しさせてもらうとか
0325nobodyさん2010/10/18(月) 11:56:56ID:???
PHPの脆弱性?
また小飼弾ちゃんが大騒ぎしてんのか?
0326nobodyさん2010/10/18(月) 12:23:33ID:???
そこはIPAだろ
0327nobodyさん2010/10/18(月) 12:24:00ID:???
自分の知識が足りないから起こるミスを言語のせいにしてるような情報は信じたらアカンよ
0328nobodyさん2010/10/18(月) 12:54:13ID:GNgSoasg
>>321
>>327
なるほど、そうなんでしたか
なんか調べてみると色んなところで言われてたので
0329nobodyさん2010/10/18(月) 12:59:10ID:???
どうやら調べた結果内容を教えてくれる気はなさそうだね
0330nobodyさん2010/10/18(月) 13:10:00ID:???
結構 php 脆弱性 でググると出てくるよ
個人のブログが多いけど
0331nobodyさん2010/10/18(月) 13:22:31ID:???
php 脆弱性でググった中から、
「これはユーザー(プログラマ)側ではどうしようもできねー、PHPという言語自体の問題だ」
というのを上げて欲しいですね。
0332nobodyさん2010/10/18(月) 13:47:45ID:???
>>331
さすがにそのレベルので放置はしないだろ。注意してないと引っかかる落とし穴レベルだと思う。

でも例えばぐぐって一番上に出てきた

ttp://wiki.ohgaki.net/index.php?PHP%2F%E8%84%86%E5%BC%B1%E6%80%A7%E3%83%AA%E3%82%B9%E3%83%88%2F%E3%83%A1%E3%83%A2

を見た感じでは知ってれば避けるのは簡単で、Cのバッファオーバーランみたいに知ってても
うっかりはまりそうというほど危険なレベルではないと思うな。
0333nobodyさん2010/10/18(月) 13:58:02ID:???
良い意味でも悪い意味でも
セキュリティ意識を高めて学ぶならPHPは最適ってことか
0334nobodyさん2010/10/18(月) 17:05:01ID:???
>>332
言語自体の脆弱性に分類されるようなものはこのリストに無いな・・全部使う側の問題
0335nobodyさん2010/10/18(月) 17:21:30ID:d6HCmNn9
docomoの携帯の種類によってはPCに接続する事で
PCからe-mobileのデータ端末を使用した場合と同様にネットを
する事が出来るという事なのですが、

仮にdocomo携帯でネットに接続した状態で
WEBサイトにアクセスした場合にサーバ側で取得したホストは、
(例えば2chに書込みを行った場合)

下記の様に通常のdocomo携帯からのアクセスと
同じ様になるのでしょうか?

proxy20077.docomo.ne.jp
DoCoMo/2.0 D903i(c100;TB;W23H16)
HOge0QoU

0336nobodyさん2010/10/18(月) 17:25:49ID:???
>>335
PHPと何の関係が?
0337nobodyさん2010/10/18(月) 17:27:49ID:d6HCmNn9
>>336
phpよりホスト等を取得するからです。
0338nobodyさん2010/10/18(月) 17:38:43ID:???
>>335
PCつかうとUserAgentはFirefoxとかIEになるけど
UserAgentやヘッダ(端末ID等)なんてPC使えばいくらでも偽造できる(成りすまし)からあまり当てにしないほうがいい
0339nobodyさん2010/10/18(月) 17:42:58ID:???
>>335
>下記の様に通常のdocomo携帯からのアクセスと
>同じ様になるのでしょうか?

結論からいうと、なりません。

一部のdocomoの携帯(スマートフォン)をPCに繋いでネットすることはできるけど、
その場合はmoperaに契約して繋ぐことになるのでホストはmoperaになります。
0340nobodyさん2010/10/18(月) 17:54:17ID:???
ソフトバンクは携帯ゲートウェイに接続できるよ
http://ke-tai.org/blog/2009/08/04/softbankgwpc/
0341nobodyさん2010/10/18(月) 18:06:51ID:???
>>338
docomoIDの事を知りたかったのです。

>>339
どうもありがとうございます。
疑問が解けました。

>>340
???という事は、PCを使用して携帯電話を操作する事が可能なのですね。
■ このスレッドは過去ログ倉庫に格納されています