【PHP】下らねぇ質問はここに書き込みやがれ 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/03/18(日) 20:37:21ID:???PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 41
http://pc11.2ch.net/test/read.cgi/php/1173163186/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ http://pc10.2ch.net/php/subback.html
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで http://pc10.2ch.net/db/subback.html
0011nobodyさん
2007/03/18(日) 21:27:39ID:???引用元のサイトでは
$row[’id’] is 7 times faster than $row[id]
なのに
$row["id"] は $row[id] より7倍速い
としている時点でそこの訳はすごく怪しいから
やめれ
0013nobodyさん
2007/03/18(日) 21:40:45ID:RB9GZY4V実際にPOSTで受け取る時に以下のようにしています。
$hoge = htmlspecialchars(stripslashes ($_POST['hoge']));
<とか>がHTMLエンティティになってしまっているんです。
0015nobodyさん
2007/03/18(日) 21:43:07ID:???htmlspecialcharsは確認画面で表示するときだけ行うべきもの。
データそのものを変換しちゃいかん。
001710
2007/03/18(日) 21:45:47ID:LjKDzSM6今のところ(、もといこれからもずっと)一人です。
0021nobodyさん
2007/03/18(日) 21:49:31ID:???0022nobodyさん
2007/03/18(日) 21:52:38ID:???ひとりで使う分にはどっかの設定書き換えなんて自分しかしないんだからrootでいいよ。
なんでわざわざ作る意味があるのか教えてもらいたい。
なんのためにユーザーを作るのか理解したほうがいいよ。
002310
2007/03/18(日) 21:53:32ID:LjKDzSM6スレ違いなのに、教えてくれるなんて...ありがたすぎる。
これからは安心してrootで開発します。ありがとうございましたm(__)m
00258=13
2007/03/18(日) 21:54:23ID:RB9GZY4Vありがとうございます。
では、入力値は $hoge = stripslashes ($_POST['hoge']); で受け取って、
確認画面のECHO直前で $hoge_ = htmlspecialchars($hoge); とすれば問題ないでしょうか?
セキュリティ的にも入力値をそのまま受け取るということは問題ないのでしょうか?(勉強不足ですみません)
0026nobodyさん
2007/03/18(日) 21:55:31ID:???ttp://www.moskalyuk.com/blog/php-optimization-tips/1272
12 PHP optimization tips
Nov 5, 2006 in Programming, Optimization, PHP
Ilia Alshanetsky’s PHP performance talk given last week at the Zend conference is
pretty useful as far as getting small tips for tweaking PHP code.
1. If a method can be static, declare it static. Speed improvement is by a factor of 4.
2. Avoid magic like __get, __set, __autoload
3. require_once() is expensive
4. Use full paths in includes and requires, less time spent on resolving the OS paths.
5. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time()
6. See if you can use strncasecmp, strpbrk and stripos instead of regex
7. preg_replace is faster than str_replace, but strtr is faster than preg_replace by a factor of 4
8. If the function, such as string replacement function, accepts both arrays and single characters as arguments,
and if your argument list is not too long, consider writing a few redundant replacement statements,
passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.
9. Error suppression with @ is very slow.
10. $row[’id’] is 7 times faster than $row[id]
11. Error messages are expensive
12. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.
For templating, are you using Smarty? This is probably the fastest way to ensure the frequently viewed pages of the site are cached.
002710
2007/03/18(日) 21:56:04ID:LjKDzSM6すいません。時間差でお礼がおくれました。ありがとうございます。
今度図書館にいってLinuxの本借りて調べてみます。言語の勉強ばっかりに集中して
開発環境を気にしていませんでした。
0029nobodyさん
2007/03/18(日) 21:59:52ID:???クローズドなら気にしないでオケ
0030nobodyさん
2007/03/18(日) 22:00:01ID:???入力値の無害化処理はその入力値を何に用いるかによって方法が変わる。
HTML上に表示するならhtmlspecialcharsだが、DBに記録するときや
コマンドラインで用いる場合などにはそれぞれ違った方法になる。
「htmlspecialchars=サニタイジング」という誤った覚え方自体を改めた方がいい。
> 確認画面のECHO直前で $hoge_ = htmlspecialchars($hoge); とすれば問題ないでしょうか?
問題ない。
> セキュリティ的にも入力値をそのまま受け取るということは問題ないのでしょうか?(勉強不足ですみません)
メール送信をどのように行うかによって決まる。
0031nobodyさん
2007/03/18(日) 22:01:47ID:???シングルとダブルではほとんど変わらんよ。
ベンチマークで確認してみ。
PHPはシングルクォートだからって特に最適化されてないから。
0032nobodyさん
2007/03/18(日) 22:03:50ID:???ここのサイトに書いてあることでいいんじゃない?
0033nobodyさん
2007/03/18(日) 22:04:31ID:???003410
2007/03/18(日) 22:06:10ID:LjKDzSM6クローズドなので気にしないことにします.....
うーんと、開発は全部rootでやって、公開用サーバはroot以外でログインして
httpdなりmysqldなりを起動すればいいのかな?その辺も今度本で調べます。
ありがとうございました。
0036nobodyさん
2007/03/18(日) 22:08:04ID:e2ODLPUZif (isset($_SESSION["user_login"])){
}else{
header("Location:index.php");
}
みたいにして、ログイン情報のセッション値(例えば、md5で生成した暗号キーなど)
を持たないユーザはログインさせないようにしていました。
しかし、これは登録されているか否かを調べてはいませんので、
上記ではなく、DBなどにアクセスして登録されているかどうかを調べ、
それで登録されていないセッション値なら、ログインさせないようにした方が
いいのかな?とも思います。
どちらもあまりセキュリティ的に変わらないのなら前者を選択しますが、
ご意見・ご指摘いただければと思います。
0037nobodyさん
2007/03/18(日) 22:08:56ID:oX9m5Cxa今回UTF-8で作成を試みようと考えてます。
日本人オンリーなので多言語化のメリットについては興味ないのですが、
以外にUTF-8を導入するメリットを教えてください。
自分が知っているのはxhtmlの一行目にドクタイプを省略することでバージョンの違い
によるギャップを埋める。
xmlで便利。
ぐらいですが、もし間違った箇所がございましたらご教授ねがいます。
0038nobodyさん
2007/03/18(日) 22:14:43ID:???セッションIDならともかくセッションの値はサーバー側でしか
生成しないし記録もしてないんだから、それが最初のログイン時に
DBから生成したデータなら何度もチェックするのは全く無意味。
0039nobodyさん
2007/03/18(日) 22:17:01ID:???■最適化にまつわる神話
1. コメントをなくすと速くなる
2. ダブルクォート(”)はシングルクォート(’)より速い
3. 参照渡しの方がコードが速くなる
4. オブジェクトを使う方が速くなる
5. タナリ($a = 1 ? $b = $a : $b = 0;)はif(){}else{より速い
これらは全部嘘。
00418=13
2007/03/18(日) 22:27:55ID:RB9GZY4Vありがとうございました。
たしかに教えていただいているとおり、サニタイジングの1つの手段でしかないのですね。
続けて勉強していこうと思います。
今回は、特に問題がありそうな<script>などを別処理ではじくようにしておいて、
後は教えていただいたとおり、画面に表示させる時だけ直前にhtmlspecialcharsをしようと思います。
0043nobodyさん
2007/03/18(日) 23:49:57ID:???>3. 参照渡しの方がコードが速くなる
コードが速いってどんな状態なんだよ!
という突っ込みはともかく、参照渡しも値渡しも違いがないんだね
0045nobodyさん
2007/03/19(月) 00:32:47ID:???http://pc11.2ch.net/test/read.cgi/php/1173163186/
0046nobodyさん
2007/03/19(月) 09:39:47ID:CGcaHKgbWarning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at E:\Web\IMG\WEB2\index.html:1) in E:\Web\IMG\WEB2\index.html on line 2
とエラーが出てしまうのですが、何が原因なのでしょうか?
ちなみに、session_start()の上は何も記述していません
0048nobodyさん
2007/03/19(月) 09:53:17ID:CGcaHKgbsession_start();
・・・・
?>
こんな感じです
0049nobodyさん
2007/03/19(月) 09:54:39ID:???php.iniのセッションの項目をみなおせ。
0050nobodyさん
2007/03/19(月) 09:57:28ID:CGcaHKgbSession Support enabled
Registered save handlers files user
Registered serializer handlers php php_binary wddx
です。
0051nobodyさん
2007/03/19(月) 10:00:48ID:???0052nobodyさん
2007/03/19(月) 10:01:15ID:???function bufferTest(){
$test="こんにちわ";
return $test;
}
ob_start("bufferTest");
というソースがあったら、「ob_flushをするまで出力しない」ということでは
無いのでしょうか?上記のソースでは普通に「こんにちわ」が出力されます。
0055nobodyさん
2007/03/19(月) 10:35:18ID:CGcaHKgbいえ、ないです
1:<?
2:session_start();
0057nobodyさん
2007/03/19(月) 12:45:20ID:+go1AKUH最近海外からウィルスURLがはられるので、
2chのime.nuのように、ワンクッションで確認画面を入れたいのですが、
その画面でXSSを出さないようにするにはどうしたらいいかわかりません。
掲示板側でrowurlencodeをしたURLが送られてくるのですが、
$url = $_GET['url'];
if (preg_match("/(https?:\/\/)/", urldecode($url)) {
$patterns = array('/%3B/', '/%2F/', '/%3F/', '/%3A/', '/%40/', '/%3D/', '/%26/', '/%24/', '/%2B/', '/%21/', '/%2A/', '/%27/', '/%28/', '/%29/', '/%2C/');
$replacement = array(';', '/', '?', ':', '@', '=', '&', '$', '+', '!', '*', "'", '(', ')', ',');
$url = preg_replace($patterns, $replacement, htmlspecialchars(urlencode($url)));
}
return $url;
とりあえずこんな感じにしたのですが、おかしい箇所ありますでしょうか?
(urlの正規表現はしょぼいので後でもっといいのを見つけてきます)
マルチバイト文字のXSSなんてのもあるらしいので、
内部エンコードがUTF-8なのですが、
$patternsの前に、$url = mb_convert_encoding($url, 'UTF-8', 'UTF-8');
とかにしてみたですが、余計なものも削除されてしまってうまくいきません。
あとURLに直接日本語をうった場合、urlencodeされたURLが出るのですが、
あいうえおとうったのに、decodeしてみると??????とかになってしまうのは
なぜでしょうか?
0060nobodyさん
2007/03/19(月) 13:32:19ID:???DependencyDB.phpというものならありましたがこれは別物っですよね。
↓のサイトを参考にインストールしました
ttp://www.y2sunlight.com/ground/?PHP5.0%2F6.PEAR%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB
展開方法が間違っているのでしょうか?
0061nobodyさん
2007/03/19(月) 14:05:46ID:???イマイチBOMの仕組みが良く分からない。
0062nobodyさん
2007/03/19(月) 15:58:09ID:???0063nobodyさん
2007/03/19(月) 15:59:09ID:???この場合、0/24の範囲が分かりません
0〜24ということでしょうか?
0066nobodyさん
2007/03/19(月) 16:09:22ID:???左から数えて24bit
11010011 10100001 00000000 00000000
↑24bit目
サブネットマスクでググレ
0067nobodyさん
2007/03/19(月) 16:22:55ID:???なければ、取ってくればいい
pear instal DB
これで無理だったら、何か問題あるとは思うが
原因を調べたくなかったら、直接
http://pear.php.net/package/DB
にから取ってきて、pear のディレクトリに
展開すればいい
0070nobodyさん
2007/03/19(月) 18:19:11ID:XfpTEzt6文字列ならmbstringで一発なんですが,ファイルとなると見つからなくて・・・.
PHPのみじゃもしかして出来ない??
環境 : Windows XP SP2 + Apache 2 + MySQL 5.0 + PHP 4.4.4
よろしくお願いいたします.
#Linuxならnkfをsystem関数あたりで呼び出せば一発なのになぁ.
007270
2007/03/19(月) 18:32:28ID:XfpTEzt6fgetで読み込んで,mbstringで変換,fputで書き込むって感じですか・・・
007470
2007/03/19(月) 18:50:02ID:XfpTEzt6確かにそれはそうなんですが,そういう関数かなにか用意されてるかなーとか期待してました(笑).
ありがとうございました.
007670
2007/03/19(月) 19:00:20ID:XfpTEzt6Linuxならnkfを呼び出して一発なんでしょうけど,今回はWindows環境なので・・・.
nkfのWin移植版を使うのはちょっとアレな気がしますし.
0077nobodyさん
2007/03/19(月) 19:07:17ID:???別にnkfのwin移植版試してみればいいかと。
どうしてもWinじゃなきゃいけないならだけど・・。
008070
2007/03/19(月) 20:28:55ID:XfpTEzt6・・・俺が?(笑)
っていうかそういうクラス,どこかにありそーですよね.
>>79
そうなのかなぁ.
CSVアップロードさせて,load data infileなんかでDBに書き込む・・・みたいな処理だと,必要になると思うんですけど.
0081nobodyさん
2007/03/19(月) 20:42:05ID:???0082nobodyさん
2007/03/19(月) 21:22:01ID:CGcaHKgbすみません、BOMとは何でしょうか?
良ければ詳しく教えていただけないでしょうか?
0083nobodyさん
2007/03/19(月) 21:38:53ID:???0084nobodyさん
2007/03/19(月) 21:44:16ID:CGcaHKgbwikiで見てみましたが、session_start()とどう関連するのかが分からない状態です。
<?の上に余分な文字が入ってしまうということなのでしょうか?
0085nobodyさん
2007/03/19(月) 22:00:01ID:???そのとおり。俺もよく知らんが対応してるエディタで開いて消すしかないんじゃない?
こんなもんPHPが早く対応しろよって思うけどね。
0086nobodyさん
2007/03/19(月) 22:00:55ID:CGcaHKgb0087nobodyさん
2007/03/19(月) 22:49:58ID:hHq7NEThあらかじめ登録されたIDとパスが入力された場合、
次のページに飛ばしセッションをでそれぞれの登録情報を呼び出します
しかし、セッション変数はサーバー内に保存されるので、
仮に複数の人が同時にログインした場合、どのユーザーがどのセッション変数かどうかというのは区別できないのでしょうか?
そういった場合はクッキーを使うべきだとは思いますが、クッキーを使わないで解決する手段はありますか?
008887
2007/03/19(月) 23:05:36ID:hHq7NETh-------------
ログイン画面(login.php)
//フォームでidとpassを入力してもらい、登録されていない場合、パス違いなどの場合はエラーをだす
//エラーがない場合、↓のように、idとpassをそれぞれセッション変数に入れ、登録内容表示画面へジャンプさせる
if (!count($error_message)) {
session_start();
$_SESSION["id"] = $id;
$_SESSION["pass"] = $pass;
header("Location: naiyou.php");
exit;
}
--------------------------------------
登録内容表示画面(naiyou.php)
//セッション変数に格納されたIDがなければログイン画面へ飛ばす
if (!isset($_SESSION["id"])) {
header("Location: login.php");
exit;
}
if (isset($_SESSION["id"])) {
$id = $_SESSION["id"];
・・・・IDに対応した登録情報をデータベースから呼び出す・・・
---------------
これでは、複数の人が同時にログインしたとき、セッション変数が同一のものになってしまい、
おなじ内容が表示されてしまうのでしょうか?
0089nobodyさん
2007/03/19(月) 23:18:58ID:???lヽ ノ l l l l ヽ ヽ
)'ーーノ( | | | 、 / l| l ハヽ |ー‐''"l
/ B | | |/| ハ / / ,/ /|ノ /l / l l l| l B ヽ
l ・ i´ | ヽ、| |r|| | //--‐'" `'メ、_lノ| / ・ /
| O l トー-トヽ| |ノ ''"´` rー-/// | O |
| ・ |/ | l ||、 ''""" j ""''/ | |ヽl ・ |
| M | | l | ヽ, ― / | | l M |
| !! | / | | | ` ー-‐ ' ´|| ,ノ| | | !! |
ノー‐---、,| / │l、l |レ' ,ノノ ノハ、_ノヽ
/ / ノ⌒ヾ、 ヽ ノハ, |
,/ ,イーf'´ /´ \ | ,/´ |ヽl |
/-ト、| ┼―- 、_ヽメr' , -=l''"ハ | l
,/ | ヽ \ _,ノーf' ´ ノノ ヽ | |
、_ _ ‐''l `ー‐―''" ⌒'ー--‐'´`ヽ、_ _,ノ ノ
 ̄ ̄ | /  ̄
0090nobodyさん
2007/03/19(月) 23:22:13ID:???セッション確立時にランダムでSIDを付加するので好きなだけsession_name()
を吐き出して調べてみてください。
009187
2007/03/19(月) 23:26:52ID:hHq7NEThということは、このままでも、それぞれのユーザーごとにセッション変数が一緒になることはないということでしょうか?
session_name()を調べて試してみます
ありがとうございます
0092nobodyさん
2007/03/19(月) 23:34:41ID:hHq7NEThランダムでSIDを付加するということは、やはり被ることはない・・
ということですよね?
0093nobodyさん
2007/03/19(月) 23:38:33ID:???0094nobodyさん
2007/03/20(火) 00:01:21ID:w0ATLs0w0095nobodyさん
2007/03/20(火) 00:07:29ID:w0ATLs0w0096nobodyさん
2007/03/20(火) 00:18:28ID:???これをクリアする場合、
$buffer = "";にするのと、
unset($buffer);して新たに$buffer = "";を作成するのと、
何か違いはありますか?
特にメモリの開放?とかで
0098nobodyさん
2007/03/20(火) 04:18:11ID:???後者はデータの格納領域と変数の管理領域の両方をクリアして再取得するから、
無駄に遅くなってメモリの分断化(さほど気にする必要ないけど)を招くだけだと思う。
前者で十分。でもどっちでも大して気にするほどじゃない。
0099nobodyさん
2007/03/20(火) 08:35:57ID:???PHPは初心者でも簡単だけど、大規模なモノになるとぎゃくに難しいよ。あと再利用性も低いんだぜ
これって事実なんでしょうか
あと再利用性というのはどういう事なんですか?
0101虚弱PHP
2007/03/20(火) 09:14:08ID:???大規模とか再利用性とかは、殆ど作り方次第。
言語的な制限で言えばオブジェクトの生存期間とか、
マルチスレッドとかの方が問題じゃないかな。
あ、これは大規模に関係するか。
0102nobodyさん
2007/03/20(火) 09:15:21ID:???すか?
0103虚弱PHP
2007/03/20(火) 09:23:37ID:???セッションIDは普通Cookieに入れるもんだけど。
(というかPHPがCookieに入れてくれる)
セッション情報をCookieに入れたくないって意味だよね??
セッションIDは普通は被らない。
本題とは関係ないけど、
セッション情報にIDとかpassとか入れるのはやめた方がいいと思う。
0106nobodyさん
2007/03/20(火) 09:56:14ID:???0107nobodyさん
2007/03/20(火) 10:28:43ID:???idやpassそのものがもれるわけではないでしょ
0108nobodyさん
2007/03/20(火) 10:39:04ID:???0109nobodyさん
2007/03/20(火) 10:40:23ID:???0110nobodyさん
2007/03/20(火) 10:46:05ID:???■ このスレッドは過去ログ倉庫に格納されています