【PHP】下らねぇ質問はID出して書き込みやがれ 77
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/12/08(月) 01:27:39ID:???過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 76
http://pc11.2ch.net/test/read.cgi/php/1226517332/
◆質問用テンプレ
【OS名】vine linux
【PHPのバージョン】php5.26
【連携ソフトウェア】mysql
【質問内容】
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0755nobodyさん
2008/12/22(月) 06:24:37ID:???0756nobodyさん
2008/12/22(月) 06:31:15ID:???はてなにでも池
0757nobodyさん
2008/12/22(月) 08:53:52ID:Cwv0g3tMPECL::PDOのことなの?
0758nobodyさん
2008/12/22(月) 08:59:25ID:Cwv0g3tMmysqliと、
pear::DBと、
PEAR::MDB2と、
PECL::PDOと、
どれを使えばいいの?
0759nobodyさん
2008/12/22(月) 09:04:29ID:Cwv0g3tMmysqliと、
pear::DBと、
PEAR::MDBと
PEAR::MDB2と、
PECL::PDOと、
どれを使えばいいの?
0760nobodyさん
2008/12/22(月) 09:15:50ID:???使いやすさや開発の効率など機能の利便さを求めるならライブラリ
0761nobodyさん
2008/12/22(月) 09:20:53ID:Cwv0g3tMPDO一択かな
でもそれだと、mysqliが使えないんだけど、
みんな使ってないの?
0762nobodyさん
2008/12/22(月) 09:25:01ID:???0763nobodyさん
2008/12/22(月) 09:41:19ID:Cwv0g3tMmysql_real_escape_string でエスケープしなければ
いけないのか、それとも、しなくていいのか、という議論ですが、
http://labs.cybozu.co.jp/blog/hata/archives/2005-10-04-1.html
このページを読む限りだと、
(1)
PDO::query() でいきなりSQL文を実行する場合
↓
SQLインジェクションの可能性があるので、
自分でmysql_real_escape_stringしなければならない
(2)
prepare()して、execute()する場合、
↓
SQLインジェクション対策を自動的にしてくれる
↓
mysql_real_escape_string 不要
=--------------------------
この理解で合ってますか?
0764nobodyさん
2008/12/22(月) 09:57:12ID:???0765nobodyさん
2008/12/22(月) 09:57:50ID:Cwv0g3tMhtmlentitiesを使ってエスケープする」
という記事を読んだことがあるのですが、
これってマユツバですか?
0766nobodyさん
2008/12/22(月) 10:00:35ID:???あってる。というか、可能な時はいつでもprepareを使え。
DB接続のパフォーマンスがどうしても問題になる場合のみ、しぶしぶmysql関数。
それ以外の場合はPECL::PDO(現在はPECLではなく標準ライブラリ)。
きちんとクラス構成ができていれば、書き換えはそれほど手間ではないので、迷ったらとりあえずPDOで書く。
0767nobodyさん
2008/12/22(月) 10:14:36ID:???その本を燃やせ。というか、出版社を燃やせ。あり得ない。
「エスケープは、出力先に応じて適切なものを選ぶ」のが基本。
出力先はSQLなのだから、SQLとして安全になるようなエスケープを選ぶ必要がある。
DBに応じたエスケープ関数があるはずだからそれを使え。
たとえばMySQLならmysql_real_escape_string。SQLiteならsqlite_escape_string。
ttp://jp2.php.net/manual/ja/refs.database.php
とりあえずそれだと、'NULL OR TRUE'という入力には確実に無防備になる。
WHERE ID = $id
というプログラムに上記文字列がぶち込まれた時にどう動作するか考えてみるといい。
DROPやDELETE、UPDATEと組み合わせた文も上手くやれば発行可能かもしれん。
HTMLの実体参照はよりによってセミコロンを多用するしな。
ユーザー管理テーブルが書き換えられ、RDBMSのroot権限を奪取される事もじゅうぶんあり得る。
0768nobodyさん
2008/12/22(月) 10:15:12ID:???目的がSQLインジェクション対策でないからしなくていい
DBには生のデータを入れるのが基本
XSS等を意識するのは取り出す時
取り出す時に忘れるかもしれないから入れる時にエスケープする人もいるが
取り出す時にエスケープするのは当たり前なので
穴を防ぐ目的としてはいいかもしれないが根本的な解決にはなってない
0770nobodyさん
2008/12/22(月) 10:20:58ID:???0771nobodyさん
2008/12/22(月) 11:27:37ID:YHC8UPCZ画像キャプチャによるフォームの認証のセキュリティについて
画像キャプチャの下にhiddenでその画像キャプチャの値を設定し
認証の時にユーザが記述した値とhiddenの値を照らし合わせるという
やり方はセキュリティー的に問題がありますか?
以前どこかのサイトで
生成された画像キャプチャの値とidを一度データベースに書き込み
hiddenには値ではなくIDを設定、
認証時にそのIDからデータベース検索を行い認証するやり方
を目にし上のやり方はセキュリティ的に問題あるのかなと
ずっと気になっています。
わかりにくい説明ですいませんがアドバイスよろしくお願いします。
0772nobodyさん
2008/12/22(月) 11:29:20ID:???http://gimpo.2ch.net/test/read.cgi/wildplus/1229912492/
0773nobodyさん
2008/12/22(月) 11:31:17ID:???hiddenの値はHTMLのソース見れば
誰でも見れるよね。
つまり、スクリプト等でhiddenの値を
自動的に読み取るようにして、その値を
連続でぶちこまれたら、アカウント10万個とか
取られてしまうのではないかな?
0774nobodyさん
2008/12/22(月) 11:33:23ID:???金庫に鍵をさしっぱなしで一緒に置いておいても
問題がないならいいんじゃないの?
俺ならhiddenにいれずに簡易に済ませるならセッションに入れる
0775nobodyさん
2008/12/22(月) 11:37:46ID:???クッキーにも書き込んでるよね。
クッキーの値はクライアント側から読めるわけで、
もしアタッカーが、クッキーの値を読み取って、
自動的に連続入力するスクリプトをrubyで書いたら
やっぱりアカウント10万個とか取られてしまう。のでは?
0777nobodyさん
2008/12/22(月) 11:46:49ID:???すまん、高度すぎて言ってる意味が分らん
クッキーに入ってるのはセッションIDだろ?
画像チャプタってたいがい都度生成だろうからその都度ID変わるし
都度セッションに値セットするなら仮に違うセッションID使われたとしても
セッションの参照先に値が無いからとおらないだろ
0778nobodyさん
2008/12/22(月) 11:52:47ID:???だから安全性に問題があるとは書いている
0779nobodyさん
2008/12/22(月) 11:57:34ID:???0780771
2008/12/22(月) 12:01:59ID:???>>774
たくさんのアドバイスありがとうございます!
今独学でPHPを勉強してるんですが
アプリケーション作成時にXXSやSQLインジェクション、XSRFなど
どんな時にセキュリティを施せばいいかがすごい難しかったりします。
もう少し頑張って勉強してみます。
本当にありがとうございました!
0781nobodyさん
2008/12/22(月) 12:04:39ID:???ユーザーが手で入力すべき値と
同一なの?
0782nobodyさん
2008/12/22(月) 12:11:23ID:e1MSnnKM上記のエラーが、”たまに”出ます。
70行目は、クラス変数(配列)を宣言している場所です。
var $prefs = array(
'北海道', '青森県', '秋田県', …
:
:
… '宮崎県', '鹿児島県', '沖縄県'
);
といった感じです。
一体なぜでしょうか?
毎回出るわけじゃなく、アクセスすると条件不明でたまに出るのです。
0783nobodyさん
2008/12/22(月) 12:15:33ID:???配列の要素を1万個に増やして
F5しまくって実験
0784nobodyさん
2008/12/22(月) 12:17:34ID:???hiddenに入れる値(以下、キー)に「12345」としたら何の意味もない。これは論外。
じゃあ、推測困難な計算方法で「12345」が導けるようなキーはどうだろう。
たとえば「23456」とか(これだと推測容易なんで、実際はもっと難しい計算を使うべき)。これは悪くない。
これを発展させて、crypt($salt . '12345')とかをキーにする。これも悪くない。まず破られないだろう。
ベストは、キーには「12345」とはまったく無関係の値を入れておき、キーと「12345」の関連付けはDBなどで行なう方法。
これだとDBのデータを知らないと絶対に両者を関連付けられない。
セッション・キーを発行しているなら、もうキーにできる値はあるので、新規に発行する意味もない。
キーとしてセッション・キーを使い、CAPTCHA生成時に「12345」をセッション変数としてサーバーに保存しておけばいいわけだ。
0785nobodyさん
2008/12/22(月) 12:21:03ID:???> これを発展させて、crypt($salt . '12345')とかをキーにする
この場合、キーから'12345'は算出不能になる。
答え合わせは、ユーザーの入力した「12345」を同じ方法でcryptして、両者が一致するかで行なう。
0786nobodyさん
2008/12/22(月) 12:26:46ID:???Shift_JISでプログラムを書くな。
0788nobodyさん
2008/12/22(月) 12:38:02ID:e1MSnnKMUTF-8ですよ
0789nobodyさん
2008/12/22(月) 12:50:13ID:Cwv0g3tM<?php
$user="root";
$pass="abcde";
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
print $dbh;
?>
って書いて実行したら、
Catchable fatal error: Object of class PDO could not be converted to string in
ってエラーが出るのですが、
これを出力するにはどんな関数を使えばいいですか?
自分の予想だと1か0で返ってくるかと思ったのですが。
0790nobodyさん
2008/12/22(月) 12:53:25ID:???0791nobodyさん
2008/12/22(月) 12:56:27ID:Cwv0g3tMやってみたら、
object(PDO)#1 (0) { }
って返ってきました。これって、(0)の部分を
見ればいいの?0ってことは失敗してる?
0793nobodyさん
2008/12/22(月) 13:07:26ID:???データベースへの接続に成功すると、PDO クラスのインスタンスが スクリプトに返されます。
この PDO オブジェクトが存在する間、 接続がアクティブであり続けます。
パスワードわざと間違えたのを入れて、もいちど var_dump($dbh);
0794771
2008/12/22(月) 13:29:14ID:???そう考えてました。
掲示板の新規登録のところを作ってたんですが
個人情報を扱う場所じゃないから
そこまで厳しくしないでいいかなと思ってました・・
明らかに無知ですよね・・
もう少ししっかり勉強します。
>>784
丁寧な説明本当にありがとうございます!
色んな方法があるんですね。
アプリケーションでも様々な物があり
個人情報を登録してもらうフォームや掲示板の新規登録のフォームなど
各々でどこまでのセキュリティを施すべきかの判断が
本当に難しく感じます。
しっかり勉強しようと思います。
0795nobodyさん
2008/12/22(月) 13:30:26ID:???0796771
2008/12/22(月) 13:48:07ID:???先日PHPサイバーテロの技法という本を買って
今それを読みながらwebで一つ一つを調べています。
XSSにしてもXSRFにしても言葉と意味はなんとなく理解できたんですが
ただどんな状況下でそういった事が起こりえるのかが
理解できにくく苦労しています。
私自身以前はwebデザイン関係で働いてましたので
情報漏えいに対する危機感は理解しているつもりです。
それで今いい勉強の仕方を考えているんですがなかなか難しいですね。
私事ですいません。
0797nobodyさん
2008/12/22(月) 14:10:18ID:???ここのサイトなのですが壁紙は全て同じ色なのに
一部分だけ明るくなってます。
どうやってそれをやっているのでしょうか?
自分も真似をしたくて質問させてもらいました。
0803nobodyさん
2008/12/22(月) 14:23:24ID:???精神に障害かかえてるのなら、病院行けよ。
0804nobodyさん
2008/12/22(月) 14:23:44ID:???0805nobodyさん
2008/12/22(月) 15:09:22ID:???PHP5.2.6→PHP5.2.8と久々に更新したくて
↓ここのサイト参考に作業したんですがapacheが走ってくれません
ttp://2php.jp/php/install_php_windows.html#download
落としてきたPHPをフォルダ改名して現PHPフォルダに上書きが良くなかったのでしょうか
C:ドライブ直下に置いたphpフォルダ直下にあるphp5apache2.dllを読み込んでくれません
apacheのhttp.confには表記したのですが↓
LoadModule php5_module "C:/php/php5apache2.dll"
ttp://127.0.0.1/に繋ぐと"It Works!"と表示されます
0806nobodyさん
2008/12/22(月) 15:16:15ID:???大人しく本を買って来て読めw
0807nobodyさん
2008/12/22(月) 15:18:38ID:???だったら動いてるんじゃないの?
0808nobodyさん
2008/12/22(月) 15:24:51ID:???apacheスタートさせるとThe requested operation has failed!って言われます
とりあえず全部削除してもっかいやってみます、なんか使用変更とかで
やらなくて良い手順とか出てきたのかと思って聞いてみました、どうもです
0810nobodyさん
2008/12/22(月) 15:29:24ID:AQe0W6WJちなみにxpのsp3です
0811nobodyさん
2008/12/22(月) 15:29:52ID:???原因究明に必要な事はすべてそこに書いてある。
0812nobodyさん
2008/12/22(月) 15:29:56ID:???0813nobodyさん
2008/12/22(月) 15:30:15ID:???0815nobodyさん
2008/12/22(月) 15:59:34ID:???0818nobodyさん
2008/12/22(月) 16:46:37ID:???接続に失敗したら PDOException を投げるのでそれを掴まえる
ちなみに件のエラーは「オブジェクトを文字列に変換できねぇよバーヤ」って事
http://www.php.net/manual/ja/pdo.construct.php
> try {
> $dbh = new PDO($dsn, $user, $password);
> } catch (PDOException $e) {
> echo 'Connection failed: ' . $e->getMessage();
> }
0820nobodyさん
2008/12/22(月) 16:59:44ID:???・MySQLのテーブル等の文字セットは utf8_general_ci
・phpMyAdminを通して見ると化けていない
・mbstring系の設定は
mbstring.http_input:auto
mbstring.http_output:pass
mbstring.internal_encoding:UTF-8
mbstring.language:Japanese
スクリプト側から SET NAMES 系を発行するのはよくないと聞いています。
では何を使って解決すればいいのでしょうか。
よろしくお願いします。
0821nobodyさん
2008/12/22(月) 17:09:03ID:Cwv0g3tMskip-character-set-client-handshake
0822nobodyさん
2008/12/22(月) 17:10:31ID:Cwv0g3tM0824820
2008/12/22(月) 17:41:45ID:mD1ma74F出し忘れてました。すみません。
>>821-822
ローカルではその方法で可能なのですが、本番のサーバーはレンタルなので、権限がないのです。
query メソッドで SET NAMES 系を発行する場合はやはり、プリペアドステートメントを使わないと問題ありますか?
データ検索のアプリケーションのため、SQLの条件節がリクエストされてからでないと確定せず、使いにくそうなのですが。
0825nobodyさん
2008/12/22(月) 17:46:42ID:???0826nobodyさん
2008/12/22(月) 17:47:27ID:???0827820
2008/12/22(月) 17:48:25ID:mD1ma74Fはい。
my.cnf は通常のレンタルサーバーでは書き換えできないですよね。
0828nobodyさん
2008/12/22(月) 17:49:44ID:???0829nobodyさん
2008/12/22(月) 17:52:00ID:???0830820
2008/12/22(月) 17:54:35ID:mD1ma74F調べてみたのですが、どうも、mysql_connect();でオープンする必要があるみたいです。
PDOを捨てる or query()を使わずにプリペアドステートメントを使うか、の二択でしょうかね。
0831820
2008/12/22(月) 18:05:57ID:mD1ma74F以降のクエリの発行はすべて、プレペアドステートメントを使ってどうにかすることにします。
答えてくださった方、ありがとうございました。
0834820
2008/12/22(月) 18:38:27ID:mD1ma74FSET NAMES 使っちゃうと、もしかしてプレペアドステートメントも使えませんか?
そうなると、mysql_set_charsetを使うためにmysql_* で自作クラスを組むしかないのでしょうか。
0836nobodyさん
2008/12/22(月) 21:21:32ID:b0EzUWObmb_eregにおける全角スラッシュの扱いがおかしい気がする。これバグ?
具体的には
mb_ereg('<a>(.+?)</a>(.+)','<a>abc</a>xyz',$reg);
は期待した値が$regに格納されてるけど、
mb_ereg('<a>(.+?)</a>(.+)','<a>abc</a>xyz',$reg);
にしたらダメ。どーなのこれ。
0837nobodyさん
2008/12/22(月) 21:24:27ID:???ereg関数はマルチバイトに対応していない。
つうか、pregが完璧に上位互換だからpreg使え。eregはPHP6で標準関数から削除される(PECLへ格下げ)。
0838nobodyさん
2008/12/22(月) 21:25:07ID:???0839836
2008/12/22(月) 21:27:41ID:b0EzUWObローカルルールがよく分からんけど、まだage続けたほうがいいのかな?
そちらでは正常に動きますかい?
0840nobodyさん
2008/12/22(月) 21:28:49ID:???0841836
2008/12/22(月) 21:32:29ID:???PHP5.2.6@CentOS5.2で全く同じソース↓を動かしたらまともに動きやがった。
windowsだとtrue1,false2がしゅつりょくされて、centOSだとtrue1,true2が表示される。ナニコレ
if(mb_ereg('<a>(.+?)</a>(.+)','<a>abc</a>xyz'))
echo "true1\n";
else
echo "false1\n";
if(mb_ereg('<a>(.+?)</a>(.+)','<a>abc</a>xyz'))
echo "true2\n";
else
echo "false2\n";
php-windowsのバグか?
>>840
そうかwww
0842820
2008/12/22(月) 21:40:42ID:???いろいろ調べました。
結果、PDOには文字セットの変更は伝わらない、伝える手段がないようです。
(SET NAMES しちゃダメってこと……だと思う)。
おとなしく、mysql_* なり mysqli 系にします。
お騒がせしました。
0843nobodyさん
2008/12/22(月) 21:42:41ID:UijRZ2Ey初心者です。10日ほど前に圧縮ファイルをダウンロードさせる方法について聞いた者です。
http://www.phppro.jp/phpmanual/php/ref.zip.html
このページにあるZIPファイル関数というので、
ローカルでは完ぺきにできました。
が、サーバーでは動きません(php4)
エラーは
Parse error: syntax error, unexpected ')', expecting '(' in /〜〜〜〜.php on line 135
135行目は
if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
これは、php4では動かないと理解したらいいのでしょうか?
php4でやる場合、フォルダを圧縮するのと、透過的書込みというのを
やる方法はあるのでしょうか?
あるいは、サーバーをphp5のところに引っ越したほうがいいのでしょうか?
0844nobodyさん
2008/12/22(月) 21:54:52ID:???そこのカッコの数があってたら、前の部分でカッコの数があってない
0845nobodyさん
2008/12/22(月) 22:12:22ID:UijRZ2Eyローカルでは動いているので、カッコは合っていると思うのですが。
それなのにエラーが出るのは、
php4ではダメという意味かなと推測しましたが、勘違いでしょうか?
0846nobodyさん
2008/12/22(月) 22:17:40ID:???そこのカッコの数があってたら、前の部分でカッコの数があってない
0847nobodyさん
2008/12/22(月) 22:18:49ID:???勘違いも何も、まったく関係ないエラーメッセージが出てるのに「PHP4ではダメなのかな」っていう発想がずれてる。
出るとしたら Undefined function 〜 とかだよ。
0848nobodyさん
2008/12/22(月) 22:27:31ID:UijRZ2Ey135行目の数行前に
$zip = new ZipArchive();
これがありますが、これが悪いのでしょうか?
0849nobodyさん
2008/12/22(月) 22:28:42ID:???0850nobodyさん
2008/12/22(月) 22:29:52ID:???0851nobodyさん
2008/12/22(月) 22:32:53ID:UijRZ2Eyその前に、圧縮ファイルの中に書き込むデータを記述するところがあって、
そこが悪いことがわかりました。
$data = <<<MESSAGE
なんたらHTML
MESSAGE
この表記に何か問題あるでしょうか?
0853nobodyさん
2008/12/22(月) 22:36:40ID:UijRZ2Ey$data = <<<MESSAGE
なんたらHTML
MESSAGE
の中に、変数を入れているのが悪いのではと推測しますが、
HTMLのなかに変数を入れる場合、変数を""で囲むのでしょうか?
初心者ですみません
Perlでは囲まないような気が
0855nobodyさん
2008/12/22(月) 22:40:02ID:???Parse error: syntax error, unexpected ')', expecting '(' in /〜〜〜〜.php on line 135
'('があるべき場所に予期せぬ')'があります。
■ このスレッドは過去ログ倉庫に格納されています