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

【PHP】下らねぇ質問はここに書き込みやがれ Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/04/09(日) 01:31:18ID:???
PHPに関するくだらねぇ質問用スレです。
ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。

まず読め【PHP マニュアル】
http://www.php.net/manual/ja/

本スレ【PHP】質問スレッドpart33【php】
http://pc8.2ch.net/test/read.cgi/php/1140027592/

【PHP】下らねぇ質問はここに書き込みやがれpart18
http://pc8.2ch.net/test/read.cgi/php/1142417901/

過去スレは>>2-3あたり
0002nobodyさん2006/04/09(日) 01:31:41ID:???
・過去スレ
【PHP】くだらねぇ質問はここに書き込みやがれ
http://pc5.2ch.net/test/read.cgi/php/1099322141/
【PHP】くだらねぇ質問はここに書き込みやがれpart2
http://pc5.2ch.net/test/read.cgi/php/1105218084/
【PHP】くだらねぇ質問はここに書き込みやがれpart3
http://pc5.2ch.net/test/read.cgi/php/1107780435/
【PHP】くだらねぇ質問はここに書き込みやがれpart4
http://pc8.2ch.net/test/read.cgi/php/1110697712/
【PHP】くだらねぇ質問はここに書き込みやがれpart5
http://pc8.2ch.net/test/read.cgi/php/1114787573/
【PHP】くだらねぇ質問はここに書き込みやがれpart6
http://pc8.2ch.net/test/read.cgi/php/1117945031/
【PHP】くだらねぇ質問はここに書き込みやがれpart7
http://pc8.2ch.net/test/read.cgi/php/1121100429/
【PHP】くだらねぇ質問はここに書き込みやがれpart8
http://pc8.2ch.net/test/read.cgi/php/1123431535/
【PHP】くだらねぇ質問はここに書き込みやがれpart9
http://pc8.2ch.net/test/read.cgi/php/1125716012/
0003nobodyさん2006/04/09(日) 01:32:15ID:???
【PHP】下らねぇ質問はここに書き込みやがれpart10
http://pc8.2ch.net/test/read.cgi/php/1127581425/
【PHP】下らねぇ質問はここに書き込みやがれpart11
http://pc8.2ch.net/test/read.cgi/php/1129582431/
【PHP】下らねぇ質問はここに書き込みやがれpart12
http://pc8.2ch.net/test/read.cgi/php/1130835396/
【PHP】下らねぇ質問はここに書き込みやがれpart13
http://pc8.2ch.net/test/read.cgi/php/1132921016/
【PHP】下らねぇ質問はここに書き込みやがれpart14
http://pc8.2ch.net/test/read.cgi/php/1134868212/
【PHP】下らねぇ質問はここに書き込みやがれpart15
http://pc8.2ch.net/test/read.cgi/php/1137236771/
【PHP】下らねぇ質問はここに書き込みやがれpart16
http://pc8.2ch.net/test/read.cgi/php/1139146534/
【PHP】下らねぇ質問はここに書き込みやがれpart18
http://pc8.2ch.net/test/read.cgi/php/1142417901/
0004nobodyさん2006/04/09(日) 01:32:54ID:???
・part17よりテンプレ化

extractは極力使わないほうがいいと思います。
例えば、

hoge.php?_SESSION[user_pw]=hogehoge

って形で送られてきたとします。これを

extract($_GET)

しちゃうと、$_SESSION['user_pw']の値が、
"hogehoge"に変更されてしまいます。

もし事前にユーザのパスワードを、$_SESSION['user_pw']に
保持してたとしたら、勝手に書き換えられてしまうことになります。

それを避けるために

extract($_GET, EXTR_SKIP)

ってやって上書きを避けたとしても、
このままでは変数の初期化を忘れる危険性があります。

extract($_GET, EXTR_PREFIX_ALL, "get")

と、接頭辞をつけるのが一番安全な気はしますが、
それなら最初から
$hoge = $_GET['hoge'];
ってやるのと手間が変わらないと思いますし、可読性も増します。
確かにextractするのは楽だと思いますけど。
0005nobodyさん2006/04/09(日) 01:35:05ID:???
乙
0006nobodyさん2006/04/09(日) 01:35:33ID:???
前スレ1000、舐めてるなw
0007nobodyさん2006/04/09(日) 01:36:36ID:???
SQLインジェクションとは

全く心配は要りません。
昔と違い今は法律ができたおかげで安心して脆弱なプログラムが使えるらしいです。
0008nobodyさん2006/04/09(日) 01:47:32ID:???
PHPプログラマの心得その1

PHPに求められるものは1に開発の速さ、2に開発コストの安さです。
決してエラーチェックやセキュリティ対策を頑張ってはいけません。
それはコードの冗長化や複雑化を招き、テスト期間の長期化も招きます。
そのような堅牢なプログラムはJavaやC♯といった高性能言語に任せればいいのです。
0009nobodyさん2006/04/09(日) 01:48:32ID:???
前スレからの続き。
漏れの会社はデフォではチェックしないが
別料金でSQLインジェクションなどの対策オプションを作って依頼者にはちゃんとやってる。
XSS対策: +1000円
SQLインジェクション対策: 1500円
CSRF対策: +4000円
CSSXSS対策: 30000円

CSSXSSはWebアプリではなくInternetExporerの脆弱性であり対応が困難なので高価になっている。
0010nobodyさん2006/04/09(日) 01:52:39ID:???
・・・それは安すぎじゃないか?
0011nobodyさん2006/04/09(日) 01:53:04ID:qYTyFCRs
>>9
SQLインジェクション対策って、具体的になにしてるの?
外部から渡される値をSQLに埋める時にエスケープしてればそもそも何の心配もいらないと思うんだけど、
わざわざオプションにするような“対策”ってどんなの?
0012nobodyさん2006/04/09(日) 01:55:00ID:???
>>11
むしろ「エスケープ外せば1000円値引きできますよ」とかいうオプションにしか見えないw
0013nobodyさん2006/04/09(日) 01:56:57ID:???
>>10
mysql_escape_stringやhtmlspecialcharsをかますかどうかなんて
開発コストからしたら500円もしないもののような気がするが。
0014nobodyさん2006/04/09(日) 02:03:26ID:???
>>13
それを噛ますかどうか交渉する時間があるなら、最初からやった方が無駄が無いよな。
というか、エスケープなんてのは空気のようなもんで、あって当たり前だと思ってたよ。
エスケープしてなかったら入力にかなりの制限が付くはずだけど、エスケープしない人たちはその辺どうしてるのかな?
0015nobodyさん2006/04/09(日) 02:09:25ID:???
一言「運用でカバー」
0016nobodyさん2006/04/09(日) 02:11:50ID:???
>>14
交渉自体は営業や担当窓口でやるものだから無駄とか関係ないんじゃ?
で、料金一覧表に最初から明記してあって、発注時に選べばいいだけになってる気がする。
0017nobodyさん2006/04/09(日) 02:17:46ID:???
>>16
>>9 のオプション全部入れたって4万もしないようなもんだろ?
それをわざわざオプションを設けて作り分けるってのも、そもそも無駄な気がするけどなぁ
あヤベ、うっかり対策入りにしちまった、外さないと・・・ なんてことになったら目も当てられない

しかし、わざわざする“対策”の内容は興味あるな。
まさか単なるエスケープの有無じゃないよな?
0018nobodyさん2006/04/09(日) 02:18:12ID:???
大してデカい仕事やってるヤツいないんだな。

普通は、開発終了後は業務委託契約に切り替えて、
恒久的にバグなどの補填や、セキュリティバグなどの保証とする。
だから、もしそのセキュリティバグから何かの情報が漏れて、経済的負担が出れば、
受託したこっちにもいくらかの負担が発生する。
会社であれば、負担としては小さいかもしれないが、会社の信用が落ちる。
個人だったら、その負担だけでもう一生借金地獄もありうる。
それを極力無くす為に当然SQLインジェクションとか、XSSやらは実装は当然だろ。

100とかそんぐらいのしょぼい仕事してないで、
もうちょっと大きいクライアントとってくれば?井の中の蛙サン達。
0019nobodyさん2006/04/09(日) 02:31:34ID:???
一体どのレスに対してのレスなんだ。
0020nobodyさん2006/04/09(日) 02:38:00ID:???
PHPおもすれー

最近PHPばっかりだよ。もうintとか型を忘れそうだ・・・
0021nobodyさん2006/04/09(日) 02:43:15ID:???
RSSが更新されたらメールで知らせてくれるスクリプト公開してる
ところありませんかあ?
0022nobodyさん2006/04/09(日) 02:43:40ID:???
>>21
スクリプト探しはスレ違い
0023nobodyさん2006/04/09(日) 02:48:40ID:???
>>22
ごめんなさいです><
0024nobodyさん2006/04/09(日) 03:21:20ID:???
>>9はどう見ても釣りだろ。お前ら簡単に釣られ過ぎ。
プログラマとかオタクは本当に世間知らずが多いな。
3年くらい営業の仕事でもやってこいって感じだ。
0025nobodyさん2006/04/09(日) 03:27:07ID:???
>>24
> 3年くらい営業の仕事でもやってこいって感じだ。
> 3年くらい営業の仕事でもやってこいって感じだ。
> 3年くらい営業の仕事でもやってこいって感じだ。
コーディングが出来ないから営業に回されちゃったんですか^^;
かわいそうですね(´・ω・`)
002692006/04/09(日) 03:43:23ID:???
>>13
そんなことは無い。
print "名前: $name<br />年齢: $age"; というコードが、
print "名前: " . h($name) . "<br />年齢: " . h($age); のようになるわけで、
コードが汚くなる上、コード全体ではh関数を1000個近く入力するわけだ。
ヒアドキュメント内で使うときには別の変数への置き換えなどもいるからね。
これはかなりの手間。
それが、たった1000円とはお得だ。

顧客としては、セキュリティ対策が行われているか不安なわけで、あえて別料金にしたほうが安心感が出る。
「当社ではXSS対策、SQLインジェクション対策は標準で行ってます。」よりは、心理的にセキュリティ対策のチェックオプションを選ぶ方が安心できるわけだ。

営業の人によれば、たった1500円であの価格comのクラックの原因のSQLインジェクション対策ができるなんて!! って感激してたクラもいたそうだ。
クラは知識が無い人が多い。

ちなみに、CSSXSS、CSRFについては最近では「正しい情報」が公開されていて次のようなサイトで誰でも観覧できる。
http://www.jumperz.net/texts/csrf.htm
http://www.oiwa.jp/~yutaka/tdiary/20060330.html
http://bakera.jp/hatomaru.aspx/glossary/0043005300520046
http://bakera.jp/hatomaru.aspx/glossary/30bb30c330b730e730f356fa5b9a653b6483
http://takagi-hiromitsu.jp/diary/20050427.html
http://slashdot.jp/developers/06/04/01/2145235.shtml
http://tdiary.ishinao.net/20060331.html
http://d.hatena.ne.jp/hoshikuzu/20051204#P2005204MATANGILLON
http://kaede.to/~canada/doc/csrf-warning
http://kaede.to/~canada/doc/csrf-todo

しかし、つい1年前にはまともな情報は公開されておらず、Webからえられる情報は間違った情報、不十分な対策ばかりだった。
mixiでの被害でやっと世間に知れ渡ったって感じだったね。
Webから情報がえられないから会社で独自に対策を研究したため、CSRF関係はだいぶコスト(人件費)がかかったよ。
0027nobodyさん2006/04/09(日) 03:55:54ID:???
出力部分をまとめとけばいいじゃない
0028nobodyさん2006/04/09(日) 04:02:53ID:???
個人でやっているならそれもありだろうけど、そのコストに
1000円や1500円の代価しかつかない、付けられないってもなんだ
かなぁ。
0029nobodyさん2006/04/09(日) 04:12:05ID:???
>>27
例えば、$error という変数にはプログラム側でのエラーメッセージ(タグ含む)が入ってるかも知れんし、
全ての変数をエスケープ処理していいわけはない。
そして、前の段階でチェックをすれば、チェック漏れが生じる可能性があるため、
「出力前」の時点でエスケープ処理をするのが一番確実かと。
0030nobodyさん2006/04/09(日) 04:19:18ID:???
print "名前: $name<br />年齢: $age"; の例だと、

h ("名前: $name");
echo ("<br />");
h ("年齢: $age");

これのがチェック漏れはおきないんじゃ
0031nobodyさん2006/04/09(日) 05:34:12ID:???
うちは
function disp_xxxx($data) {
  $data = array_may('htmlspecialchars', $data);
?>
名前: $d[name]<br />
年齢: $d[age]<br />
<?
みたいな。HTMLのとこは実際は別ファイルだけど。
テンプレートライブラリ使ってることも似たような感じじゃないの?
いまどき、print "年齢: $name<br />"なんつーコードは書かんだろ。

> $error という変数にはプログラム側でのエラーメッセージ(タグ含む)が入ってるかも知れん
まぁ、エラー表示とかシステム表示系の関数はまた独自のルールで作るもんだよな。
それ以外の通常のHTML表示に関しては、HTMLを書いてる部分(デザイナーが編集してる部分)以外で
変なタグ入れられても困るので変数にタグ入れるのは絶対禁止にしてる。
0032nobodyさん2006/04/09(日) 05:34:59ID:???
あ、$d[name]じゃなくて$data[name]だったか。
0033nobodyさん2006/04/09(日) 05:40:16ID:8VHURzhD
漏れはエスケープしなくても
echo "名前: ", $name, "<br />年齢: ", $age;
って書くなぁ。ヒアドキュメントも?>〜<?phpも汚くなるので使わない。
この辺は考え方の違いとかあるんだろうけど。


>>前スレ993
http://pc8.2ch.net/test/read.cgi/php/1142417901/993
>検索結果の2ページ目以降が、フォームで受け取った値を保持しません。
>どうしたらよいでしょうか?
2ページ目以降にもフォームで受け取った値を渡すようにする。
0034nobodyさん2006/04/09(日) 05:45:23ID:???
>>31-32
興味ある。
いまいちよくわからんだけど、
$data[name] って何?
0035342006/04/09(日) 05:52:04ID:???
ようするに、予め $data をエスケープしたやつを $d['data'] のように配列に変換しちゃうってことかなるほどねー。
それだと確かに、

print "名前: $d['name']<br />年齢: $d['age']";

とかける。

0036nobodyさん2006/04/09(日) 06:19:30ID:???
>>33
考え方の違いが結構ありそうだなぁ。
俺は "名前: ", $name とか"名前" . $name ってのは、関数を通す必要が
あるとかの場合以外は極力使わないようにしてる。(関数使う場合も可能な限り事前変換)
出力内容が . とか , とかで大量に分断されてると、その文中にさらに , . " ' を含む場合に
ミスがあっても一目で判断することが至難の業になるからね。

>>31の?>HTML<?php 形式ってのは実際には別ファイルのHTMLをincludeで読み込んでるから
微妙に違う話だったりもするんだけど、ちっこいプログラムなんかでは?>HTML<?phpも使う。
理由は対応エディタなら識別してHTMLタグを色分け表示してくれたり、
<DIV>→</DIV>などの閉じタグ間で括弧とかと同様に一発ジャンプできるようになるから。
0037nobodyさん2006/04/09(日) 09:01:25ID:???
つーかさ、クラック対策とか以前に入力されたものをエスケープもしないで出力しちゃうっていうのは、使用上の大きな制限が付くわけだろ?
コードが綺麗とか汚い云々言う前に、きちんと動くものを作らなくちゃって思わないの?
たかだか < とか > とか " とか入力されただけで表示や機能が破綻してしまうわけだよ?
マニュアルにそういう入力で画面が崩れるのは仕様ですとか書いちゃうわけ?
プロがやる仕事として恥ずかしいとか思わない?

ちなみにおれは、画面表示HTMLは別ファイルにしておいて、そこでエスケープやら埋め込みやらするよ。
こんなかんじ。

(コード hoge.php)
$keyword=ほにゃらら;
$records=検索($keyword);
include 'hoge.tpl';

(別ファイル hoge.tpl)
<form>
<input type="text" name="keyword" value="<?=esc1($keyword);?>"><br />
<input type="submit" name="search" value="検索"><br />
</form>
検索結果<br />
<? if(empty($records)) { ?>
該当レコードはありません<br />
<? } else { ?>
<table>
<tr><td>名前</td><td>年齢</td></tr>
<? foreach($records as $r) { ?>
<tr><td><?=esc2($r['name']);?></td><td><?=esc2($r['age']);?></td></tr>
<? } ?>
</table>
<? } ?>
0038nobodyさん2006/04/09(日) 09:05:07ID:???
SmartyとかMojaviで、PHPファイル名に「class」という文字列を
挟むのを良く見るのですが、どんな意味があるのでしょうか?
(例えば、Smarty.class.phpとかController.class.phpとか)
そんな命名規約ってありましたっけ?
0039nobodyさん2006/04/09(日) 09:18:09ID:???
SmartyやMojaviを作った人の趣味じゃねーの?
0040nobodyさん2006/04/09(日) 10:52:26ID:???
php覚えれば2chみたいな掲示板作れますか?
0041nobodyさん2006/04/09(日) 11:11:04ID:???
はい
0042nobodyさん2006/04/09(日) 11:41:43ID:2atGm5L3
セッションの為の文字列を生成しようと思っているのですが、
一般的にハッシュが使われるのはなぜでしょうか?
mt_randを使おうと思っているのですが、何か問題があるのでしょうか?
0043nobodyさん2006/04/09(日) 12:14:58ID:???
推測が不可能(に近い)って意味じゃ対して変わらんかも知れんが、
mt_randの方は RAND_MAXの制限を受けるし、
セッションの方は md5(128bits)かSHA-1(160bits)になるから、
まぁ強度が違うって感じかと。
0044nobodyさん2006/04/09(日) 13:16:37ID:???
>>42
セッションのための文字列?? セッションIDのこと?
それはPHPが勝手に発行してくれるんでは・・・
0045nobodyさん2006/04/09(日) 13:49:02ID:???
[notice] Parent: child process exited with status 3221225477 -- Restarting.
[notice] Parent: Created child process 5420
[notice] Child 5420: Child process is running
[notice] Child 5420: Acquired the start mutex.
[notice] Child 5420: Starting 250 worker threads.

Apacheがこのようなエラーを吐いて強制終了してしまうのですが、
PHPコード上、どのような不具合が生じているのでしょうか?
パースエラー等が出るわけでもなく、一度は正常に表示されて、
リロードするとこのようなエラーが発生することが多いです。
OSはWinXPです。
■ このスレッドは過去ログ倉庫に格納されています