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

くだすれPHP(超初心者用)5

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/11/22(土) 06:36:02ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
PHP使いが優しくコメントを返しますが、
お礼はPHPの布教と初心者の救済をお願いします。

PHP Home Page
http://www.php.net/
http://jp.php.net/



くだすれPHP(超初心者用)4
http://pc11.2ch.net/test/read.cgi/php/1213356756/

適当に関連スレ(マルチはだめぽ)
【PHP】下らねぇ質問はここに書き込みやがれ 69
http://pc11.2ch.net/test/read.cgi/php/1211879073/
0724nobodyさん2009/02/11(水) 12:21:22ID:???
htmlの<base>のようにユーザのトップディレクトリを指定したいんですが、
ユーザのトップディレクトリを調べる方法はありますか?
0725nobodyさん2009/02/11(水) 13:56:50ID:???
環境は?OSとか
0726nobodyさん2009/02/11(水) 14:12:44ID:???
>>725
ああすみません。
開発環境はPHP5.2.6でOSXなんですがWebサーバはまだ借りてないのでどうなるかはわかりません。
PHP5でApachサーバのところを借りようとは思ってます。
なので開発環境との違いや引っ越し時のことを考えて汎用的な関数がないかと質問しました。
一応マニュアルのファイルシステム関数は目を通したんですが…
0727nobodyさん2009/02/11(水) 14:24:23ID:???
exit()ってスクリプト終了のために多用してもいいのでしょうか?
たとえばエラーチェック時にdieの代わりに自作関数呼び出して終了みたいな場合など

function return_json($flag, $data){
 if($flag == true)
  $result = $data;
 else
  $result = "ERR:".$data;
 $res = array(
  "status" => $flag,
  "result" => $result );
 print(json_encode($res));
 exit();
}

if(エラーチェック1) return_json(false,"エラー1です"); //エラーなら終了

if(エラーチェック2) return_json(false,"エラー2です"); //エラーなら終了

//最後に
return_json(true,"成功です。");
0728nobodyさん2009/02/11(水) 14:33:34ID:???
別にいいんでは?
0729nobodyさん2009/02/11(水) 15:13:35ID:???
関数はあくまで何かを返すだけにして、制御を握っているのは「メインのルーチン」ひとつにした方がいい。
あちこちの関数で好き勝手に処理を中断したり画面出力してたりすると、そのうち管理しきれなくなる。
同じ理由で、printするよりは文字列を返す(printは「メインのルーチン」で行なう)方がいいと思う。

俺ならreturn_json()はjsonを返すだけ(exitもprintもしない)にして
function generare_json(){
 if(isError1()){
  return return_json(false,"エラー1です");
 }
 if(isError2()){
  return return_json(false,"エラー2です");
 }
 return return_json(true,"成功です。");
}
とし、echo generate_json()を最後に呼び出す。
exit()はスクリプトの末尾のみ、出力はこの文のみになる。
0730nobodyさん2009/02/11(水) 15:20:37ID:???
つうか、正しいjson出力とエラー出力を別の関数にするかな。
boolを渡すより、return_error_json()の方が分かりやすい。
0731nobodyさん2009/02/11(水) 15:23:03ID:???
>>719
ヒントをサンクス。

>>723
詳しいありがとうございます。
参考にさせて頂きます。
0732nobodyさん2009/02/11(水) 17:07:46ID:???
>>726
ああもしかして、http://〜/~user/ の部分の実ディレクトリが知りたいってこと?
0733nobodyさん2009/02/11(水) 17:30:07ID:???
実ディレクトリでいいのかな?ローカルでいえば
/Applications/MAMP/htdocs/
となります。
実行ファイルがトップにあるわけではないので相対パスでのファイル指定より
基点からの絶対パスのほうがわかりやすいかなと。
0734724,7332009/02/11(水) 17:31:27ID:???
>>732
アンカーわすれてたので念のため
0735nobodyさん2009/02/11(水) 17:45:24ID:???
>>733
dirname(__FILE__) とか getcwd() とか

そういうこと?
0736nobodyさん2009/02/11(水) 17:47:36ID:???
>>733
$_SERVER['DOCUMENT_ROOT']
0737nobodyさん2009/02/11(水) 18:00:00ID:???
ユーザー関係ないじゃんw
0738724,7332009/02/11(水) 19:15:46ID:???
>>735,736
$_SERVER['DOCUMENT_ROOT']で希望のパスを得ることができました。
ありがとうございました。
07397272009/02/12(木) 16:10:42ID:rITuikA6
>>729
それだとプログラム毎にgenerare_json()を書き換えるって事ですよね
(エラーチェックは入力値が対象なのでプログラム毎に変わるから)
if〜elseのネスト地獄に陥りたくないので、if文でエラーなら残りをすっ飛ばしたいだけなのです。
それとメインルーチンのほとんどがgenerare_json()内に入ってしまうような・・・

他の方法(関数内でprintもexitもなし)だと
1.エラー時、gotoでメインルーチン末尾に飛んでprint実行
2.フラグを用意し初期値true、エラー時falseにして、if(!フラグ && isError2())と毎回チェックする
3.例外処理
が思い浮かんだんですが、gotoはv5.3からだし、2は毎回チェックが煩わしい(スマートじゃない)、
3の入力値チェックのエラーは例外とは違う気がしたり・・・

それとも例外として処理してもいいのかな・・・?
チェック用自作関数は真偽を返すのでif文でエラーならthrowとか
07407272009/02/12(木) 18:57:04ID:???
連投ですみません。
色々調べたら入力値チェックで期待しない値は異常なエラーとして例外処理してもよい、
みたいに書いてあったので例外処理することにしました。

function throw_except($msg){
 throw new Exception($msg);
}

try {
 if( isError1() ) throw_except('エラー1');
 if( isError2() ) throw_except('エラー2');
 return_json( $xxx );
} catch ( Exception $e ) {
 return_err_json( $e->getMessage() );
}

例外処理になったからreturn_xxx関数内でprintさせてます(exitは削除)
print文を関数外に出した方がいいのかもしれませんが
0741nobodyさん2009/02/12(木) 19:05:55ID:???
なんで「throw_except」←関数化してんの?
0742nobodyさん2009/02/12(木) 19:11:40ID:???
毎回throw new Exception($msg);と書くのがめんどくさいので
0743nobodyさん2009/02/12(木) 20:08:20ID:???
isError1()とisError2()側でthrowしろよ(まぁ関数名おかしくなるから変えて)
try {
isError1();
isError2();
return;
} catch (isError1Excetion $e) {
} catch (isError2Exception $e2) {
}
0744nobodyさん2009/02/12(木) 21:20:57ID:???
isErrorをtryはせんだろうw
07457292009/02/12(木) 23:45:53ID:???
>739
if else地獄?>729のコードにはelseが一行も出てないだろ。これは偶然そうしたんじゃなくて、意識してそうデザインしたんだ。
適切な規模で関数を切って、returnでエラーを通知可能にすればelseは削れるし、多くの場合throwは不要になる。

すぐthrowを使いたがる奴は、GOTO時代と脳の構造が一緒の、OOPどころか関数指向にすらなれない原始人。
ぱっと思いつく欠点挙げてやろうか。throwだと妥当性検証エラーの結果を最初のひとつしか出力に反映できない。
他にも、どこまで処理が継続するのか、どこからの処理はすっ飛ばされうるのかを判定しにくいのも例外の欠点。
ロックファイルを作って、ファイルに書き出して、さあ安心と思ったら変なところから例外が飛んできて、ロックファイル削除せずに終了、とかな。
例外は、複数の呼び出し階層をぶっ飛ばして上位層にエラーをダイレクトに通知したい場合に使うものであって、GOTO代わりに使うものじゃない。

>729のコードの完成版 ttp://gist.github.com/62642
isError1とisError2の中身を替えれば、チェックする内容はそのまま置き換わる。
両者をまとめて関数化してしまえば追加も可能。generate_jsonはノータッチでいける。

入力値検証らしい構造に書き直した版 ttp://gist.github.com/62643
入力値チェックの内容が変わる場合、validate関数を差し替える。処理内容が複雑ならisError1みたいな関数を書いてvalidateから呼んでもいい。
07467392009/02/13(金) 00:56:29ID:???
ヒートさせてしまって&作例してもらって申し訳ないm(_ _)m

if else地獄というのは>>729のコードではなく(>>727の)自作関数内でexitしない場合のこと。
(一応自分でも>>727>>740で意図してelse使わないようにしてます)

ただ作例だとisError1,isError2,validate,build_responceなど関数自体を毎回書き直す羽目になるし、
メインルーチンがほぼ丸ごと関数化(build_responce)してるのもどうも・・・

関数は一度作ったら修正したくない、極力同じような文を書きたくない、ってのが元々の理由なので。

今作ってるのは妥当性エラーは1つ(というか「入力値が間違ってる」だけ)でいいのですっ飛ばしてます。
通常の入力ではなく意図的に変更してる場合しかありえないので。

確かに原始人と思いますが、GOTOも上手く適度に使えばいいんじゃないんでしょうか?
反GOTO教信者ではないし。

まあバリデーションにthrowの使うのは>>739にも書いたけど微妙だとは思いますが↓のようにあったので使ってみました
http://takagi-hiromitsu.jp/diary/20051227.html
>>パス名を受け取ることを想定したパラメタに「../」や「..\」が含まれていたら、削除とか変換をするのではなく、
>>エラーとして例外処理して終了するというのが、本来のそのプログラムの正しい動作だろう*5。

クライアント側でもチェックしてるのでそれをわざわざ変更して送ってくるのは上記にあてはまるかと。
0747nobodyさん2009/02/13(金) 01:41:35ID:???
初心者相手なんで一応言っておくと、後者のコードは検証ルールが変わっただけなら書き換えないといけない関数はひとつ(validate)。
グローバル空間の処理や他の関数は一切触れなくて平気。
グローバル空間の処理を書き換える方が、関数を書き換えるより簡単だって言い張るならもう何も言わん。ダイクストラ以前の時代に帰れ。

「メインルーチンがほぼ丸ごと関数化してる」のは、確かに設計としては甘い。
本来は、「100%すべてを関数化すべき」だしな。
07487462009/02/13(金) 02:05:40ID:???
あー、でもとりあえず作例他ありがとです。
参考にして勉強させていただきます。
0749nobodyさん2009/02/13(金) 11:16:46ID:???
質問です。
現在、PHP4を使って携帯サイトを作っています。
新規登録してログインして日記みたいなのを登録するシステムなんですが、
ログインした後の日記登録の部分は問題なく動作します。
ところが新規登録のところで動作がおかしい部分があるのです。

動作確認はdocomo,au,softbankの実機とPC上のエミュで行っています。
現象はsoftbankの実機のみで起こるのですが、スクリプトでは
header("Location:xxxxxx.php?id=xxxxx")でページを飛ばすところで問題が起きます。
docomo,au実機、PC上の3キャリアのエミュでは問題なく動作、ところがsoftbankの実機のみ
ページが飛ばずに「このページは開けません」みたいなエラーが出ます。
ソースレベルでは、その他の日記登録などとほぼ同じなのですが・・・。
softbank携帯だけ、何か仕様が違うのでしょうか?ちなみにセッションを使っています。
0750nobodyさん2009/02/13(金) 11:18:06ID:???
↑に追記です。
飛び先のphpスクリプトにダイレクトに接続した場合、問題なく動作する事は確認済みです。
0751nobodyさん2009/02/13(金) 11:24:03ID:???
さらに追記です。うざくてすいません・・・
header Locationで飛ばさずに、aタグを使って間にワンクッション置く(クリックさせる)と正常に動作します。
どのみち、その先でまたheaderで飛ばすところで駄目なんですが・・・。
0752nobodyさん2009/02/13(金) 11:45:37ID:???
>>749-751
> softbankの実機のみページが飛ばずに「このページは開けません」みたいなエラーが出ます。

このときの、サーバーに残るアクセスログは?

んで、Locationで指定しているURLはドメイン込のフルパスで書いてるよね?
0753nobodyさん2009/02/13(金) 11:52:57ID:???
サーバーのアクセスログは見る権限がないので、ちょっと頼んで調べてみます。
Locationには絶対ではなく、相対アドレスで指定しています。
0754nobodyさん2009/02/13(金) 12:03:26ID:???
人力検索(笑)
http://www2.developers.softbankmobile.co.jp/dp/tool_dl/download.php?docid=119
これの、143ページ
0755nobodyさん2009/02/13(金) 12:05:58ID:???
サーバーのログを見ると、302が返ってきているようです。
要求しているURLは、変ではなくアクセス出来るURLでした。
0756nobodyさん2009/02/13(金) 12:09:54ID:???
302はLocationヘッダーを飛ばした時のログでしょう。
その直後に正しいリクエストが来てるかどうか。
0757nobodyさん2009/02/13(金) 13:01:14ID:???
同じリクエストを数回繰り返しているだけでした。
0758nobodyさん2009/02/13(金) 13:46:02ID:???
>754
PDFの資料、大変役に立ちました。
locationで指定しているアドレスを相対から絶対にしたところ、動作しました。
ありがとうございました。
でも、他の部分では相対にもかかわらず正常動作しているんですけどね・・・。
やはり携帯サイトは難しいです。
0759nobodyさん2009/02/14(土) 13:18:20ID:???
RFCだと絶対URL(absoluteURI)になってますね

rfc2616の14.30 Location
原文
http://tools.ietf.org/html/rfc2616
和訳
http://www5b.biglobe.ne.jp/~type-aya/rfc/rfc2616j.txt
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec14.30

ソフバンの方が厳密に仕様に沿っているんでしょう
0760nobodyさん2009/02/18(水) 18:43:17ID:???
URLでファイル名やディレクトリを暗号(?)のようにするのはどうやって
いるのでしょうか?
例えば、認証するサイトでパスワード変更の時、応答メールで、
ttp://hoge.co.jp/mail/CSDFG365
へアクセスをすれば作業完了という場合の、CSDFG365や
ダウンローダーでttp://hoge.co.jp/download/CSDFG365にアクセス
すると、別名のファイル名が保存できる機能が、どう実装されているのか
知りたいのです。検索キーワードが悪いのか、ファイルの暗号化ソフト
ばかりヒットして解らずにいます。
どなたか教えてください。
0761nobodyさん2009/02/18(水) 19:28:28ID:???
それをキーにしてどっかから引っ張ってきてるのでは?
0762nobodyさん2009/02/18(水) 19:45:41ID:???
>>760
暗号ではなくユニークキー
0763nobodyさん2009/02/18(水) 23:18:25ID:???
前者は
アカウント情報とそのキーを一緒にDBかなんかに突っ込んでおく
アクセスがあったらアカウントを有効にしてそのキーを削除する

とやってるだけ。
その文字列とあなたのアカウントIDやメールアドレスに直接の関係(例えば、メールアドレスを「暗号化」するとその文字列になるとか)
はないと思うし、むしろあったら設計として不味い。

後者も、文字列と実際のファイル名なりデータなりを関連付けるDBを保持しているだけ。
ダウンロードさせるファイルの名前はヘッダで指定できる。Content-Dispositionでぐぐれ。
0764nobodyさん2009/02/18(水) 23:18:58ID:???
質問です。

皆さん、日記やブログを作るときどのような感じでスクリプトを組んでいますか?
例えばhtml文字をエスケープして、マジッククォートを取り除いて…といった形で教えてくださるといいんですが。
0765nobodyさん2009/02/18(水) 23:38:29ID:???
ぐぐれよ
0766nobodyさん2009/02/19(木) 11:06:34ID:???
>760
mod_rewriteを使ってるんだろうね。
0767nobodyさん2009/02/19(木) 12:40:19ID:???
それのどこにmod_rewriteが必要なんだよw
0768nobodyさん2009/02/19(木) 18:38:41ID:???
いや、hoge.co.jp/mail/CSDFG365 ←このアドレスの事をいったんだ。
暗号云々ではない。ズレてしまって申し訳ない。
07697602009/02/19(木) 22:42:44ID:???
みなさんありがとうございます。
パラメータをディレクトリとしていたんですね。
mod_rewriteを使って解釈しないといけないので、ズレていないと思いますよ。
使わずにすむ方法は思いつかないんですが・・・。
助かりました。ありがとうございました。
07707602009/02/19(木) 22:50:42ID:???
連続ですみません。もう一つ関連(?)でわからないことがありまして。
ダウンローダーとか、宅ファイル便とかだとファイルの公開日というのが
指定できるのですが、その指定した日時まで公開というのはどう実装するので
しょうか。ユニークキーと期日を保存して、その期日にユニークキーを
削除すると思うのですが、「その期日」に動作される方法が解らないのです。
教えて君ですみませんが、どなたかアドバイスください。お願いします。
07717602009/02/19(木) 22:54:01ID:???
すみません。
×「その期日」に動作される方法
○「その期日」に動作させる方法
でした。何卒よろしくお願いします。
0772nobodyさん2009/02/19(木) 22:56:59ID:???
クラックとかでもなければDB内の改竄はできない気もするんですが
データを信用するなとのことなので出力時にhtmlspecialcharsを挟んでます
しかし装飾系のタグが使いたいので以下のようにしてみました
問題ありますか?

$str = "@<b@>強調@</b@>@<span class=@”red@”@>赤色@</span@>"; //DBから取得したデータ
echo str_replace(array("@<","@>","@”"), array("<",">","\""), htmlspecialchars( $str, ENT_QUOTES, "UTF-8" ));
検索文字はすべて全角、上はあくまでサンプルで実際の検索文字は違います
0773nobodyさん2009/02/19(木) 23:52:31ID:???
>>770
ファイルそのものを削除するならcronなんかを走らせておくのでしょうが、
ファイルを直接DLではなくCGI/PHP経由でのみDL許可にすれば
期日後はユニークIDをDBから取り出せなくするだけで実現できるのでは?
0774nobodyさん2009/02/20(金) 04:23:24ID:???
>>772
閉じタグ打たなかったら、ページの最後まで
適用されてしまうんでない?

<h1>おはよう


↑こんなの。ひろゆきがあめぞうを
つぶしたときに、「スタイルシート破壊攻撃」というのを
使ったのだ。「あめぞうウイルス」でググるとわかる。
07757602009/02/20(金) 08:00:28ID:???
>>773
アドバイスありがとうございます。
その期日後にPHPを起動(?)させる方法を知りたいのです。
だれもその期日(後)にPHPにアクセスしなければ、PHPは動作しないので。
あっ誰かがアクセスする時に、期限のチェックをすれば済む話ですね。
なんか自動的に削除処理しなきゃと思い込んでました。
超初心者ということで許してください。ありがとうございました。
0776nobodyさん2009/02/20(金) 08:15:05ID:???
cronでPHP起動できるやろ
PHP内でcrontabを書き換えられるかどうかは知らんけど。
0777nobodyさん2009/02/20(金) 15:07:58ID:???
自動削除は1時間毎や1日毎みたく定期的にcron動かせばいいんじゃないのかな
0778nobodyさん2009/02/21(土) 00:09:46ID:???
>772
scriptタグを埋め込まれると、ページ内の全表示内容、クッキーを外部のURLに送信される可能性がある。
onloadなどのJavaScriptを実行されるものは全て同じ。
多くのシステムがタグを回避するのはこの脆弱性対策のため。
imageタグによる画像貼り付けや、objectタグによるFlash貼り付けなど、考慮しないといけない事は山のようにある。

脆弱性対策ってのは、猿真似してりゃいいってもんじゃない。
「何故」HTMLタグに警戒しないといけないのかを理解し、適切な対策を自分で考える必要がある。
勘違いするといけないのではっきり言うが、その処理を挟んでもセキュリティは一切向上しない。無駄だ。
0779nobodyさん2009/02/21(土) 06:29:21ID:wFQNH034
perlで300行程度の規模のプログラムを外注で打ってもらったらいくら取られますか?
0780nobodyさん2009/02/21(土) 06:30:12ID:wFQNH034
書き間違いました

perl X 
PHP ○
0781nobodyさん2009/02/21(土) 07:16:06ID:???
500円
0782nobodyさん2009/02/21(土) 07:51:36ID:???
うちなら400円で良いよ
07837792009/02/21(土) 10:59:46ID:???
おぉぉそんなものなの?作ってください!!!
ブラウザーアドベンチャーゲームなんだけど。

300行分を10本ね 

連絡先 adobentya@hotmail.com
0784nobodyさん2009/02/21(土) 11:05:48ID:???
コメント行3万行入れて4万円上乗せするけどいいか?
07857792009/02/21(土) 11:11:58ID:???
だめぽorz
0786nobodyさん2009/02/21(土) 11:20:40ID:???
すみませんが質問させてください。
入場者名と退場者名を同じ1ページ内で、上下のスパン(上半分が入場者名、下半分が退場者名)
にしてPDF出力したいと考えています。
プログラムはそれぞれ"nyuujyou.php"、"taijyou.php"が用意されています。
このように別々のプログラムの結果を、同じページ内でPDFで同時に表示させることはできますか?
共通の変数は日付$ymdだけです。
0787nobodyさん2009/02/21(土) 11:54:46ID:???
>786
入場.php、退場.phpを、出力結果をechoするのではなく、出力結果を文字列として返す関数に書き直すのが正しい道。
こういう事は非常によくあるので、「出力結果を組み立てる」部分と「書き出す」部分は明確に分けたほうがいい。
「入場者名や属性の配列をDBから取ってくる部分」→「それを使ってHTML文字列を組み立てる部分」→「それを受け取って書き出す部分」
の三段階に分けると使い回しが効く。ロジックの殆どは最初の部分に来て、変更が多いのは簡単な後半だからな。
例えばCSVでファイルに書き出したい場合、最初の難しい部分にはノータッチで後ろの2つだけ書き換えればよくなる。
前から順に「モデル」「ビュー」「コントロール(の一部だが)」層と呼ぶ。

で、レシピだが。
<?php
$ymd = '2009/02/21';
ob_start();
require_once("入場.php");
$result1 = ob_get_flush();

ob_start();
require_once("退場.php");
$result2 = ob_get_flush();

でresult1、$result2に両phpの実行結果が文字列として入る。PDF変換はライブラリを自分で漁れ。
07887862009/02/21(土) 11:59:35ID:???
>787
わかりました、丁寧にありがとうございました。
0789nobodyさん2009/02/21(土) 12:59:33ID:???
>>778
厳しいご意見どうも
前段に関してはセキュリティ関連のサイトとか見てるんで
scriptを仕込まれてとかはまあ理解してます(というかこんなことがあると把握してる程度というか)。
その上で>>772が全くの無駄となるとhtmlspecialcharsが意味を成さないんでしょうか
それとも関数の後に置換をしてるからダメになるんでしょうか。
これで100%対策してるとはもともと思ってませんが、htmlspecialcharsで
ある程度の対策になるという考えは間違ってるでしょうか。
>>772も置換パターンが読まれたらアウトですが、どういった部分がだめなのか1例だけでも
教えてもらえないでしょうか。
0790nobodyさん2009/02/21(土) 14:46:55ID:???
@<b onmouseover=@"怪しい処理@" @>ボールドだよ@</b@>

自信ないけど、こんなの入れたらどうなるでしょうか。
0791nobodyさん2009/02/21(土) 15:18:21ID:???
>>790
つまり789の最後に言ってるように@<が<に変換されるのが
ばれているということが前提ですか?
ならば置換を行わずにhtmlspecialcharsのみなら問題ないということでしょうか。
当初の一部タグを有効にしたいというのはとりあえず置いときますが。
0792nobodyさん2009/02/21(土) 15:38:10ID:???
>>791
一部のタグだけ有効にしたいというのならstrip_tagsでいいでしょ
0793nobodyさん2009/02/21(土) 15:51:07ID:???
出力時に htmlspecialchars を挟むのは間違えてない。
万一、SQLインジェクションされて、不正なデータを注入されても htmlspecialchars が出力時に噛ませてあればほんの少しダメージを軽減できる。
# まぁ、SQLインジェクションが起こった時点でいろいろ見直すべきだと思うけど。

装飾のタグが使えるのは素敵な機能だと思うけど、自力で組むのは難しいんじゃなかろうか。
自分ではどんなに完全だ、と思ってても意外なところに穴があったりするし。
ここで「大丈夫でしょうか?」って聞くくらいならば、そんなものは実装しないのが一番。
少なくとも str_replace() とかの単純な手法で実装できるような機能ではないと思う。

置換パターンが読まれてなければ云々については、
攻撃するときは攻撃者はいろんなパターンの文字列をスクリプトに投げてみて、置換や変換のルールを推測した上で攻撃するんだろうから、
あんまり考える意味がない。
0794nobodyさん2009/02/21(土) 15:54:51ID:???
strip_tags
ttp://phpspot.net/php/man/php/function.strip-tags.html

この関数は、allowable_tagsで許可した全てのタグ の属性を修整しません。
これには、style お よび onmouseover属性が含まれており、悪意のあるユーザが他のユーザに見せるようなテキストを投稿する際に危険な行為を行う可能性があります。
07957912009/02/21(土) 16:08:04ID:???
ありがとうございます。
ちょっと忙しくなったので夜に反応します。
0796nobodyさん2009/02/21(土) 19:23:46ID:???
>>783
設計はすでにできていてあとはコードを書くだけ?
それなら設計の読み方わかるニートがやってくれるかもね
普通の人に頼むならまぁ無理だと思ったほうがいいわ
時給換算して300行400円はわりにあわない
10分で300行かけるような超人がいたとしたら
人の○倍仕事量こなすから○倍よこせってなるのでますます無理
設計書くなら値段は跳ね上がるから設計書いらないっていうのが
PHPクライアントなわけだけど
それだとお金にならないからスルーするというのが業界の流れ
0797nobodyさん2009/02/21(土) 21:09:34ID:1h/i9qY8
これだと1回で20数全部でます。1回1数でかぶらずに20回出したいです。
<?php
$numbers = range(1, 20);
shuffle($numbers);
for($i = 0; $i < 20; $i++) {
echo $numbers[$i]."<br>\n";
}
?>
0798nobodyさん2009/02/21(土) 21:19:21ID:???
<?php
$CountLogFile = "カウントログへのファイルパスを指定";
session_save_path("セッション情報を記録するディレクトリパスを指定");

session_start();
if(!file_exists($CountLogFile))
{
touch($CountLogFile);
}
$File = fopen($CountLogFile , "r+" ) or exit("FileOpenError...");
flock($File , 2);
if(empty($_SESSION["Count"]))
{
$_SESSION["Count"] = "1";
$Count = fgets($File , 16);
$Count = $Count + $_SESSION["Count"];
}
else
{
$Count = fgets($File , 16);
}
rewind($File);
fwrite($File , $Count);
flock($File , 3);
fclose($File);
?>

<?php echo "AccessCount : $Count"; ?>
0799nobodyさん2009/02/21(土) 21:19:50ID:???
マルチは地獄に落ちろ
0800nobodyさん2009/02/21(土) 21:35:22ID:???
はわわ
08017722009/02/21(土) 21:58:27ID:???
strip_tagsは>>794なので自分で有効なタグのみ出力するよう考えてみたんですが難しいようですね。
wiki風なキーワード+対象文字っていうのも考えてたんですけど、それはそれで抜き出しのための正規表現とかで
>>793でも言われているどんな抜けがあるかが想像つかないものでして。
とりあえず今回はあきらめることにします。ありがとうございました。
0802nobodyさん2009/02/21(土) 22:35:15ID:???
>>794
万一、SQLインジェクションされて、不正なデータを注入されても htmlspecialchars が出力時に噛ませてあればほんの少しダメージを軽減できる。

お前、いろいろと混同してないか?
0803nobodyさん2009/02/21(土) 22:42:59ID:q8fBHhcW
test.html

<?php
if( $_POST['insert'] == 'insert' ) {
echo "インサート";
}
?>

・・・

<form action="test.html">
<input type="text" name="text">
<input type="submit" value="送信">
<input type="hidden" name="insert" value="insert">
</form>


送信を押したときにだけ、インサートを表示するようにしたいのですが、リロードした場合も表示されてしまいます。

POSTされた中身が保持されているからだと思うのですが、

送信を押したときにだけ表示するにはどうしたらよいでしょうか?
0804nobodyさん2009/02/21(土) 22:45:45ID:???
リロードした時に「再送信しますか?」って聞かれてるだろ?
つまり、そういう事だ。
0805nobodyさん2009/02/21(土) 23:01:17ID:???
>>802
不正に注入されたデータがJSとかのスクリプトを含むもので、html..を噛ませてなかったら、出力時に実行されてScriptInsertionにならない?
そこで、データの出力時にhtml..を噛ませてあれば、JSの実行は防げるから多少は軽減できる、って意味。
別にSQLInjectionが防げるっていう意味のつもりじゃないよ。
0806nobodyさん2009/02/21(土) 23:42:58ID:???
質問です。

file_get_contents()って第一引数にファイル名を指定しなければならないと聞きましたが、ファイル名を変数に代入してそれを指定しても動きますでしょうか?
0807nobodyさん2009/02/21(土) 23:48:15ID:???
動く
0808nobodyさん2009/02/22(日) 00:00:11ID:???
>>803
解決法のひとつは、getにする。
0809nobodyさん2009/02/22(日) 00:11:37ID:???
>>805
いやそこでSQLインジェクションが出てくるのがおかしいよ。
意図したとおりのSQLが実行されて、意図したとおりDBに保存されるんでしょ?

文字型のカラムに入るデータがHTMLだろうとJavaScriptだろうと
DB的にはなにも問題ない。

それを取り出して表示するときにHTMLならHTML用の処理が必要ってこと。


。。。ほかのとこにいた人?
0810nobodyさん2009/02/22(日) 00:15:33ID:???
>>803
二重送信防止とかでぐぐれば結構出てくるよ
0811nobodyさん2009/02/22(日) 00:23:28ID:???
>>809
インジェクションが万一、起こってしまった場合の話。
html..が対策になるなんて思ってないよ。

データベースから引っ張ったデータでも信用せずに、出力時にhtml..をかけておけば万が一、JSとかの意図しないデータを混入させられても少しは安全になるだろう。

って言いたかった。
間違えたこと言ってたらすまない。
08128112009/02/22(日) 00:34:57ID:???
なんかわかりにくくなってる。

言いたいことは>>809と同じのつもりなんだけど……。
ぐちゃぐちゃにしてしまった、申し訳ない。

IDスレのほうも似た話題になってるけど別の人です。
失礼しました。
0813nobodyさん2009/02/22(日) 00:39:28ID:???
むしろ809が何に食いついてるのかがわからん
俺に読解力がないんだろうか
0814nobodyさん2009/02/22(日) 00:43:08ID:???
質問です。
配列の値をカンマで繋げたいんですがそういった関数はないでしょうか。
配列関数のところにはなさそうなんですがforeachでループさせるぐらいしかないんでしょうか。
0815nobodyさん2009/02/22(日) 01:09:34ID:???
implode
0816nobodyさん2009/02/22(日) 01:23:04ID:???
implode,explodeは覚えておいて損はない
0817nobodyさん2009/02/22(日) 01:23:45ID:???
>>815
ああstring関数でしたか。
ありがとうございます。
0818nobodyさん2009/02/22(日) 01:28:17ID:???
>>816
はい、しかと覚えました。

ていうか今回はこちらの調べ方不足だったけど
関数多すぎでいまいちマニュアルから探しづらい・・・
0819nobodyさん2009/02/22(日) 01:32:17ID:???
何でも自分以外の物のせいにする奴は駄目な子になるぞ
0820nobodyさん2009/02/22(日) 01:37:18ID:???
>>818
「php 関数 配列 つなげる」でぐぐったらすぐ出てきたぞ
0821nobodyさん2009/02/22(日) 01:50:01ID:???
キーワード
php 配列 値 繋げる

今回は悪かったって
たいていググルで見つかるけどマニュアル内検索でヒットしたらいいんだけどね
とまた転嫁
0822nobodyさん2009/02/22(日) 02:26:36ID:???
PHPの関数は6500個あるから
マニュアル全部読みとか無理
0823nobodyさん2009/02/22(日) 02:57:10ID:???
>>822
6500とかすげーなw
数えたお前もすげーよ
■ このスレッドは過去ログ倉庫に格納されています