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

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

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

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

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

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

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

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

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0118nobodyさん2010/06/03(木) 07:37:57ID:???
>>117
変換してんじゃないの?
0119nobodyさん2010/06/03(木) 08:12:37ID:LdZGbuVn
>>118

mb_convert_encoding autoとかででしょうか?
0120nobodyさん2010/06/03(木) 08:26:57ID:???
PHP でやってるとしたらそうじゃね? auto は微妙だけど
0121nobodyさん2010/06/03(木) 10:56:12ID:???
>>109
>>110
>>111
>>113
ありがとうございました。
おかげさまで完全に理解できました!!
0122nobodyさん2010/06/03(木) 12:10:17ID:???
>>121
おめ。

どうやって勉強してるかわからないけど、
今の知識だとセキュリティ対策が十分にできないと思うから
本とか読んで学んだほうがいいよ。
0123nobodyさん2010/06/03(木) 15:18:39ID:???
>>89 >>108
元の質問者とは別人ですが、便乗して質問させてください

$_SERVER['PHP_SELF']より$_SERVER['SCRIPT_NAME']のほうが安全ということですが、
$_SERVER['SCRIPT_NAME']を使ってもエスケープは必要なんでしょうか?
0124nobodyさん2010/06/03(木) 16:24:14ID:???
>>123
確かにそちらの方が安全だが、アンカーの先にはそれについて言及していない。
誰にレスをしたんだ?
0125nobodyさん2010/06/03(木) 16:51:43ID:???
>>123
なぜ危険/安全なのか理解してる?
「php_self script_name」で検索すれば比較してるサイトがいっぱいでてくるよ
0126nobodyさん2010/06/03(木) 16:55:55ID:???
ttp://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/003.html
>第1章 総論
>より良いWebアプリケーション設計のヒント
>(1) プログラミング言語の選択
>1) 例えば、PHPを避ける
0127nobodyさん2010/06/03(木) 17:15:09ID:???
>>124
> 誰にレスをしたんだ?

主に>>108の「ちゃんとエスケープもしろよ」へのレスです。

>>125
はい、$_SERVER['PHP_SELF']のほうをそのまま出力すると
JavaScriptを仕込まれてしまう可能性があるということですよね?
なので、エスケープする理由はわかります。

お尋ねしたいのは、_SERVER['SCRIPT_NAME']でもエスケープする必要があるのかということです。
SCRIPT_NAMEにはPHP_SELFのようなXSSの脆弱性はないと思ってたんですが、
何か特殊な方法による攻撃の対象になることがあるんでしょうか?
0128nobodyさん2010/06/03(木) 17:55:31ID:???
>>127
http://www.php.net/manual/ja/reserved.variables.server.php
'PHP_SELF'
現在実行しているスクリプトのファイル名です。
ドキュメントルートから取得されます。
例えば、http://example.com/test.php/foo.bar というアドレス上にあるスクリプトでは
$_SERVER['PHP_SELF'] は /test.php/foo.bar となります。

'SCRIPT_FILENAME'
現在実行されているスクリプトの絶対パス
0129nobodyさん2010/06/03(木) 17:57:58ID:OUHRb8my
CentOS5.3でPHP5.1を使っています。

クライアントにバイナリデータを送るときに
fopenとfreadをとechoを使ってるんですが、
クライアント側からはバイナリデータが壊れていると
言われたりしています。
freadってバイナリセーフな関数なんですよね?

何か他に注意すべきところがありますか?
0130nobodyさん2010/06/03(木) 18:08:47ID:???
>>129
fopenでmodeにbフラグ付けてる?
0131nobodyさん2010/06/03(木) 18:13:58ID:iSHgRF9v
requireとかrequire_onceする静的?なモジュールと
.soをextension_dirで登録する動的?タイプのモジュール。
後者はコンパイルなんかのコスト分遅いっていう認識はあってますか?


0132nobodyさん2010/06/03(木) 18:15:38ID:iSHgRF9v
ごめんなさい文末一行
○前者はコンパイルなんかのコスト分遅いっていう認識はあってますか?
×後者はコンパイルなんかのコスト分遅いっていう認識はあってますか?
0133nobodyさん2010/06/03(木) 18:19:41ID:???
>>130
はい。読み込み専用で開けばよいので
パラメータは'rb'をつけています。

0134nobodyさん2010/06/03(木) 19:59:49ID:???
>>133
file_get_contentsやreadfileは試してみた?
0135nobodyさん2010/06/03(木) 20:02:16ID:???
>>131
requireやincludeは外部ファイルのスクリプトを読み込むもの。
extension_dirなどの拡張モジュールは、
Cなどの低級言語で書かれているのでPHPより高速で、当然にコンパイルされているので速い。
0136nobodyさん2010/06/03(木) 20:22:42ID:???
>>129
PHPスクリプトにBOMが付いてないかい
こういう問題はHTTPをモニタリングするツールを入れて
実際に送られたヘッダとデータを確認するのがいいんだが
0137nobodyさん2010/06/03(木) 21:00:55ID:???
>>133 >>136

先ほど自己解決しました。
おそらく・・なんですが。
サーバ側のファイルとクライアントでダウンロードしたファイルを
比較したところ、クライアント側には行頭に改行コードが入ってました。

そのせいでファイルサイズも1バイト分差異がありました。

対策としてサーバ側のスクリプトファイルの
不要な改行コードを削除しました。

<?
--色々なロジック--
?>
 ←この辺りの不要な改行コードを削除。


そうしたところ、こちらが意図するとおりにファイルを
送ることが出来ました。

どうもありがとうございました。
0138nobodyさん2010/06/03(木) 21:02:06ID:???
137ですが、
>>133ではなく、>>134でした。

申し訳ありません。
0139nobodyさん2010/06/03(木) 21:30:19ID:???
SAPIのCGIを見ると、「PHP5.3まで」とあるんですが、PHP5.4以降はどうなってしまうのでしょうか?

ttp://jp2.php.net/manual/ja/function.php-sapi-name.php
0140nobodyさん2010/06/03(木) 21:56:52ID:???
>>137
XML吐く時に同じ事食らったよ
以来終了タグ ?> は書かなくなった
zend framework のコーディング規約でも書くなってなってる
0141nobodyさん2010/06/03(木) 22:36:01ID:???
>>140
バカよけのための規約で、結構前からあるにはある
0142nobodyさん2010/06/04(金) 02:08:52ID:???
PHPをプログラミングするのにお薦めの最適な開発ツール(エディタ)って何になりますか?

コード補完してくれて,定義済みのうユーザー定義関数もアシストしてくれるような定番があれば是非知りたいです
MySQLのクエリも同時に書くのでそれも補完アシストしてくれたりしたら最高ですがそんなのってあるんでしょうか?

開発効率が格段にあがるのでしたら有料でも全然かまいませんので お願いします
ちなみに今は秀丸で書いてます
0143nobodyさん2010/06/04(金) 02:19:59ID:???
NetBeans Eclise
0144nobodyさん2010/06/04(金) 02:26:29ID:???
vim emacs
0145nobodyさん2010/06/04(金) 02:36:38ID:???
プログラマならvimとかemacsみたいな自分でカスタムできるエディタを
早いうちから使っといた方がいいよ

秀丸でもマクロで多少のカスタムはできるんじゃなかったっけ
使ったことないから知らないけど
0146nobodyさん2010/06/04(金) 02:51:45ID:???
ちょっとした編集 gvim/vim
デバッグまでする場合 netbeans
0147nobodyさん2010/06/04(金) 03:35:38ID:???
Eclipseは導入までがちょっと面倒なんだよな、NetBeansは簡単なのに
0148nobodyさん2010/06/04(金) 05:42:14ID:???
>>135
やっぱりそうでしたが、ありがとうございました。
0149nobodyさん2010/06/04(金) 10:31:22ID:???
>>140 >>141

たしかにzend frameworkには?>が書かれていないですね。
規約だったとは・・・。

ということは、皆さんの開発現場でも
?>は書かないようにされているのでしょうか?

?>を書かないことでのデメリットはないのでしょうか?
もしデメリットがあればそれを認識した上で
私も活用したいと考えておりますので
教えていただけないでしょうか。

0150nobodyさん2010/06/04(金) 10:48:26ID:???
>>149
書いてはいけない理由はこのあたりを参考に
http://d.hatena.ne.jp/fbis/20090716/1247714151
http://d.hatena.ne.jp/Kiske/20100128/1264643384
0151nobodyさん2010/06/04(金) 10:53:50ID:???
>>150
ありがとうございます。
拝見いたしました。

色々と危険があるようですね。
今回私もそれで苦労したので、
ひとまず、?>は削除したいと思います。


0152nobodyさん2010/06/04(金) 10:55:12ID:???
閉じタグっていうか、 ?>がパースしない直出力への開始みたいなもんだと思ってます。
0153nobodyさん2010/06/04(金) 11:06:10ID:???
【OS名】Windows
【PHPのバージョン】5.2

クラスの静的メンバに設定ファイル(xml)を読み込みたいのですが、
Javaでいう static句 みたいなものってあるのでしょうか?

静的関数にして初回時に読み込むみたいな処理にすれば
実現はできるなーと思っているのですが。

よろしくお願いします。
0154nobodyさん2010/06/04(金) 14:21:33ID:???
>>146

NetBeans6.9 Betaを導入してみました
ですが、これまで作っていたPHPファイルの
日本語によるコメント部分がすべて文字化けします。
NetBeans上で文字を打ち直して保存して、
それを今度テキストエディタで開くと、
今度はテキストエディタの表示が文字化けしているという状態です。

PHPの文字コードは
UTF-8のBOM無し
で開発したらいいのでしょうか。
根本的なところでミスってますか?
0155nobodyさん2010/06/04(金) 14:38:19ID:???
>>153
スタティックなメンバは「PHP static」とかでググればすぐ見つかるはずだけど、
初回時ってどういうこと?
コンストラクタを使うのとは意味が違うの?

あとスレタイ読んでね。
0156nobodyさん2010/06/04(金) 14:39:12ID:???
>>143
EclipseよりスタンドアロンのAptanaのほうが軽いと聞いた
0157nobodyさん2010/06/04(金) 14:54:59ID:???
>>154
PHPはBOM付きはダメだと俺は認識してた。
BOM付きのスクリプトでHTMLを出力すると崩れたりすると思う。
BOMを消したらNetBeans 6.9 Betaの文字化けしないかどうかは知らないけど。

それより、6.9はひと月ほど前に使ったらめっちゃ不安定だったけど
もうだいぶ改善されてるのか?
正式版の時期が近づいてるから、そろそろ良くなってなきゃまずい頃だとは思うが。
0158nobodyさん2010/06/04(金) 15:04:56ID:AnXEBzRW
PHPで、クラスの中にあるメソッドの一覧を取得するにはどうしたらいいでしょうか?
0159nobodyさん2010/06/04(金) 15:09:53ID:???
>>158
http://www.google.co.jp/
01601582010/06/04(金) 15:12:27ID:???
>>159 ありがとうございます。

PHPのリフレクションを使って、どうやってクラス毎のメソッド一覧、シグネチャ一覧を取得できますか?
0161nobodyさん2010/06/04(金) 15:15:08ID:???
>>158
ttp://jp.php.net/get-class-methods
01621582010/06/04(金) 15:18:28ID:???
>>161 どうもありがとうございます。
0163nobodyさん2010/06/04(金) 15:21:59ID:???
>>158
http://www.php.net/manual/ja/book.reflection.php
0164nobodyさん2010/06/04(金) 15:35:00ID:???
>>154
単純に、ファイルの文字コードとエディタの文字コードが違うんじゃないか?
上書き保存じゃなくて変換とかすればできるはず
0165nobodyさん2010/06/04(金) 16:57:55ID:???
>>164
この流れで文字化けに対する解決を提示しようとするなんて意地が悪いね。
0166nobodyさん2010/06/04(金) 22:05:06ID:???
>154
プロジェクトのプロパティに文字コードの設定がある
netbeans は指定の文字コードで読もうとするので
プロジェクト内は統一する必要がある
変換もできないので他のエディターで変更しとかないといけない
0167nobodyさん2010/06/04(金) 23:36:51ID:???
>>154
Netbeans UTF-8 でググればUTF-8で開く方法がたくさん出る
0168nobodyさん2010/06/04(金) 23:40:28ID:???
>>154
> PHPの文字コードは
> UTF-8のBOM無し
> で開発したらいいのでしょうか。
うん、それでいいよ。
PHPの設定も一応見直すとよいです。

なんか的外れなレスが多くね?
0169nobodyさん2010/06/04(金) 23:48:40ID:XmC1Ur85
【OS名】Linux (32bit)
【PHPのバージョン】5.2

CORESERVERを使用しています。
DB使わずにファイルでデータを管理しているのですが、
ファイルロックの方法が間違っているのかデータが飛びまくって困っています。

上書きする際の流れは

・ロック用ファイルをwでオープン
・ロック用ファイルを排他ロック
・変更ファイルをrでオープン
・共有ロック
・データを変数に格納&指定部分を変更
・ファイルロック解除
・ファイルクローズ
・変更ファイルをwでオープン
・排他ロック
・さっきの変数をfwriteで上書き
・ファイルロック解除
・ファイルクローズ
・ロック用ファイルのロックを解除
・ロック用ファイルをクローズ

って感じです。
他にも同じファイルを呼び出す処理がいくつかあって、
それらではrのときは共有ロック、aのときは排他ロックをかけています。

ご指摘お願いします。
ソース必要でしたら貼ります。
0170nobodyさん2010/06/05(土) 00:03:29ID:UzvzEjBp
質問です。

HTMLで以下のコード書いてみた。
<form method="GET" action="index.php?sex=man">
<input type=hidden name=myname value="maiko">
<input type=submit value="regist">
</form>

このフォームだと、myname="maiko"はサーバに渡るんだけど、
actionに指定しているsex=manの部分がサーバにわたらない。

method="POST"の場合だと、両方サーバにわたるんだけど、
なんで駄目なんでしょうか?
htmlの仕様?
0171nobodyさん2010/06/05(土) 00:33:54ID:???
うん
0172nobodyさん2010/06/05(土) 00:34:22ID:???
>>168
うん。君が的外れ。

>>169
PHPのファイルロックはダメダメ
アクセスカウンターが飛ぶとか過去スレ(かなり前)にあったと思う
ロック用のディレクトリやファイルを使ったりしてる人もいる
よく読んでないけど設計は合ってると思う

>>170
ブラウザのアドレス見たら分からんかな
0173nobodyさん2010/06/05(土) 00:35:42ID:WrJc7rsM

すみません、文字コードのことで困っています。

今現在、外部ファイルを読み込むプログラムを作成しているのですが、
一部の文字コードにおいて文字化けが発生してしまいます。

UTF-8 => o, EUC-JP => x

具体的には、片方の文字コードにしか対応できないということです。
EUC-JPに対応させようとしたら、今度はUTF-8が駄目に。。。

php.ini の設定内容についてアドバイスもらえると助かります。
よろしくお願いします。
0174nobodyさん2010/06/05(土) 00:38:03ID:???
>>173
具体的におかしくなる文字列を出した方がいいと思う
文字コードによって存在しない文字もある訳だし
01751732010/06/05(土) 00:41:13ID:WrJc7rsM
>>174
どうもありがとうございます。

対象の外部ファイルについてですが、任意の一般的なサイトです。
また、日本語については全て化けてしまっています。

自動的に文字コードを判別して切り替えることはできないでしょうか?
0176nobodyさん2010/06/05(土) 00:48:46ID:???
>>172
「PHPの文字コードはUTF-8のBOM無しで開発したらいいのでしょうか。」とか
「根本的なところ」とか聞かれてるんだから、>>157>>168が的確なレスでしょ。
文字コードの変換方法やNetBeansの設定が知りたいわけじゃないと思う。
01771732010/06/05(土) 01:04:39ID:WrJc7rsM
返された文字列の文字コードを調べて、mb_convert_encodingで解決できました。
下らねぇ質問失礼しました。
0178nobodyさん2010/06/05(土) 01:09:02ID:???
>>175
mb_detect_order でぐぐってみてくれ。

>>176
問題はdocblockの文字化けじゃないの?
そらすまんかった
0179nobodyさん2010/06/05(土) 02:53:33ID:???
>>169
読み込みと書き込みの間でトランザクションが途切れているのが不整合の原因

$f = fopen('file', 'r+');
if (!flock($f, LOCK_EX)) die 'ロックできなかった';
/* ここで読み込み&書き込み */
fclose($f);

flock($f, LOCK_UN) は書き込みバッファの関係上、理由がなければ使わない
flock()自体はシステムコールのflock(),fcntl(),LockFileEx()を呼んでるだけなので
よっぽど古いファイルシステムや処理系じゃなきゃ信頼していい
01801792010/06/05(土) 03:04:11ID:???
最も外側にロック用ファイルでロックしていたのを見落としていた、ごめん
1行目の指摘は無視してくれ
0181nobodyさん2010/06/05(土) 03:07:11ID:???
>>178
別にBOMつきのエンコードでうまく動作するなら文字化けの対処方法を書いてもいいよ。
けどそれじゃだめじゃん。
0182nobodyさん2010/06/05(土) 05:26:44ID:???
>>169
ロックファイルは存在してるかどうかだと思ってたんだが
file_exsists で true なら待機みたいな
0183nobodyさん2010/06/05(土) 05:33:06ID:???
そのやり方は良くあるだめなパターンだよー
0184nobodyさん2010/06/05(土) 05:34:29ID:???
>>181
UTF8Nはいいけど彼の文字化けはどうすんだよw
つまり >>164 だろ
PHPの設定とか完全に意味不明
0185nobodyさん2010/06/05(土) 05:36:54ID:???
>>183
どして?ぜひ理由を
0186nobodyさん2010/06/05(土) 05:44:08ID:???
>>185
大丈夫な時
A             B
存在チェックOK
ロックファイル作成
              存在チェックNG

ダメな時
A             B
存在チェックOK
              存在チェックOK
ロックファイル作成
              ロックファイル作成
0187nobodyさん2010/06/05(土) 05:45:25ID:???
>>184
横?でしかもうろ覚えですまんが、
今UTF-8じゃないならスクリプトのエンコードをUTF-8に変更する時に設定変えないとだめじゃないっけ
0188nobodyさん2010/06/05(土) 06:02:52ID:???
>>186
ダメな時(B)のロックファイル作成が通るって事?
fopen() のモード x みたいな感じを想定してた。
> 書き込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。
> ファイルが既に存在する場合には fopen() は失敗し、 E_WARNING レベルのエラーを発行します
> ファイルが存在しない場合には新規作成を試みます。

flockとかがアレなのはアレなんで,つまりそう言うのはDBゲホゲホ
0189nobodyさん2010/06/05(土) 06:03:58ID:???
>>187
internal encoding の事かー!!
0190nobodyさん2010/06/05(土) 08:09:37ID:???
>>188
それに頼るならわざわざfile_existsする必要なくね?
0191nobodyさん2010/06/05(土) 13:48:58ID:???
0192nobodyさん2010/06/05(土) 13:57:26ID:dqtCuv4f
以前も、PHP+MYSQLで質問させていただいたものですが良い方法が見つからないので
何方か力を貸してください。
SELECT文からtest内の値をarray関数に入れたいのですが良い方法ありますでしょうか。
mysql_fetch_arrayだと、idとtestをarrayにいれるだけで結果を全て入れる方法が
見つからない状況です。
実際には下記のように値を入れたいのです。
$a = array (aiue, okaki,kuke );
---------------------------------
| id | test |
---------------------------------
| 01 | aiue |
---------------------------------
| 02 | okaki |
---------------------------------
| 03 | kuke |
0193nobodyさん2010/06/05(土) 14:11:06ID:???
Adobe のDreamweaverCS5で開発やってる人っている?
どーも、ついに本格的にCS5でPHPのコードヒントとか関数リファレンス、
動的な部分もプレビューしてくれたりとか、プロジェクト管理もできるようです。

今エクリプスなんだけど、ちょっと乗り換えてみたいんだけど、使ってる人いたら感想とか聞きたい。
0194nobodyさん2010/06/05(土) 14:22:16ID:???
>>192
http://php.net/manual/ja/pdostatement.fetchall.php
0195nobodyさん2010/06/05(土) 14:57:38ID:???
うゎ、>>192じゃないけどfetchAll()知らんかったーorz
foreachでループしてfetchしてた…
0196nobodyさん2010/06/05(土) 15:03:14ID:???
foreachじゃなくてwhileだった
01971692010/06/05(土) 15:06:11ID:zOlNlPcy
ファイルロックについてレスしてくださった方、ありがとうございます。
現在>>179さんのアドバイスに従い、LOCK_UNの記述を削除してテスト中です。
念のため、rとwでわけていたのもr+で一度に処理するようにしてみました。

ロックファイルを使用する場合は>>188のやり方がいいんでしょうか?
これでダメだったら試してみます。
ほんとはDB使った方がいいのは百も承知なんですが、
既にサイトが稼働してるおかげで勉強&システム移行してる余裕が・・・

どうもありがとうございました。
0198nobodyさん2010/06/05(土) 15:12:55ID:???
>>186
普段DB使ってて、ファイルでのデータ管理は経験ない素人が適当なこと言って悪いけど、
ロックファイル作成後、書き込み時にロックファイルを確認すればいいんじゃない?
ロックファイルが複数あったら、先に作成されたほうだけを有効にするとか。
0199nobodyさん2010/06/05(土) 17:06:14ID:dqtCuv4f
>>194
ありがとうございます。とりあえずサンプルみて頑張ります。
(こんな関数しらんかった…)
0200質問1/22010/06/05(土) 18:17:47ID:w09PCQyp
検索させようと思ってますが、某所参考に書いたらDBの中身全部出てきてしまった。よろしくご指導願います
PHP5 & MySQL5.0
<?php
$mysql_dbs = mysql_connect("host", "user", "pass");
mysql_select_dB("db-name");
$debug = false;
if($debug) print_r($HTTP_POST_VARS);
$query = "SELECT * FROM table";
if(!empty($Col0)) {
$Col0 = addslashes($Col0);
$where = "Col0 MREGEXP '$Col0' && ";
}
if(!empty($Col5)) {
$Col5 = addslashes($Col5);
$where .= "Col5 MREGEXP '$Col5' && ";
}
0201質問2/22010/06/05(土) 18:18:54ID:w09PCQyp
if(!empty($where)) {
$where = substr($where, 0, -4);
$where = "WHERE " . $where;
}
$query .= $where;
if($debug) {
print "<BR><BR>";
print $query;
}
$result = mysql_query($query);
$num_rows = mysql_num_rows($result);
if($num_rows == 0) $message = "該当するデータはありませんでした";
else $message = $num_rows . "件ヒットしました";
?>
検索結果<br>
<?=$message?>
<table border=1><tr><td>名前</td><td>住所</td></tr>
<? while($row = mysql_fetch_assoc($result)): ?>
<tr><td><?=$row[Col0]?></td><td><?=$row[Col5]?></td></tr>
<? endwhile; ?>
</table><a href="input.html">再検索</a>
</body>
</html>
0202nobodyさん2010/06/05(土) 18:29:58ID:???
$Col0と$Col5がないんじゃ?
0203nobodyさん2010/06/05(土) 18:30:23ID:???
古くさいコードだな
0204nobodyさん2010/06/05(土) 18:35:44ID:???
某所ってどこなんだよ
0205nobodyさん2010/06/05(土) 18:47:16ID:IfiEpjR7
【OS名】
 Ubuntu 9.10
【PHPのバージョン】
 5.2.10
【連携ソフトウェア】
 MySQL
【質問内容】
 SQLインジェクションを防ぐためには、プリペアードステートメント(PDOのbindParam)を
 使うだけで十分なんでしょうか?
 怖いので、今はhtmlspecialchars($text, ENT_QUOTES)というのをやってから
 プリペアードステートメントを使ってINSERTやUPDATEをしてます。
0206nobodyさん2010/06/05(土) 19:37:59ID:???
>>205
htmlspecialcharsをそこで使うのは間違い
0207nobodyさん2010/06/05(土) 19:47:38ID:???
bindParamは変数をバインドするだけだから関係ない
prepareね

http://php.net/manual/ja/pdo.prepare.php

説明じっくりよんでみ
0208nobodyさん2010/06/05(土) 20:08:07ID:IfiEpjR7
>>206
PHPMyAdminでデータベース内を覗いて、保存されたデータを見てみると
「<」のような文字がたくさんあって、容量的に「<」という1文字より多くなるし
ぱっと見て読みにくいので、使い方が間違ってるかなと思ってました。

「エスケープ」する必要があると聞きましたが、htmlspecialcharsというのは
エスケープとは違うんでしょうか?

>>207
あ、そうです。prepareです。
例えば、

$sql = "INSERT INTO testtable (testcolumn) VALUES (:testcolumn)";
$stmt = $db->prepare($sql);
$stmt->bindParam(':testcolumn', $_POST['data1']);
$stmt->execure();

という風にやってます。
「基礎からのPHP」という本で学んだやり方です。
これだけでSQL対策は十分ですか?

よろしくお願いします。
0209nobodyさん2010/06/05(土) 20:09:02ID:IfiEpjR7
「SQL対策」は「SQLインジェクション対策」の誤りでした。すみません。
0210nobodyさん2010/06/05(土) 20:12:56ID:XPkr7TFj
>>200
http://php.dori-mu.net/source/source.php?src=search/search.phps
これ見てやったんだろう?
これおれうごいたから。
お前どっかぬけているんだよ。
まずは元ソースが動くか試してみな
0211205、208です2010/06/05(土) 22:46:24ID:IfiEpjR7
SQLインジェクションとXSSを混同してたようです。
いろいろ調べてみて自分で理解したことを書いてみます。

・DBに保存するとき
  SQLインジェクションの対策としてプリペアードステートメント(PDO::prepareなど)が必要
  それを使えばhtmlspecialcharsは不要

・ブラウザに出力するとき
  XSSの対策としてhtmlspecialcharsを使う

これで合ってますでしょうか?
プリペアードステートメントを使わない場合、htmlspecialcharsでは代わりになりませんか?
0212nobodyさん2010/06/05(土) 23:00:07ID:???
マニュアルをちゃんと読んだらどうなんだ
PDO使ってるならPDOのメソッド一覧あるんだから1つずつどういうものがあるか確認するぐらいしなさいよ

>プリペアードステートメントを使わない場合、htmlspecialcharsでは代わりになりませんか?
http://www.php.net/manual/ja/pdo.quote.php

htmlspecialcharsはxss対策に使うものでsqlインジェクション対策に使う関数ではありません
0213nobodyさん2010/06/05(土) 23:08:36ID:bkBaLixK
質問です

28habcpt918のような英数字の組み合わさった文字列を
最後の数字の部分だけ00918のように頭に0を加えて5桁にしたいのですが、
文字列のパターンはabc123や987xyz12のようにさまざまです。

つまり、
28habcpt918なら28habcpt00918、
abc123ならabc00123、
987xyz12なら987xyz00012のようにしたいです。

アドバイスお願いします
0214nobodyさん2010/06/05(土) 23:11:27ID:???
>>213
正規表現でいいじゃん
0215nobodyさん2010/06/05(土) 23:25:25ID:IfiEpjR7
>>212
すみません、既に読んでます。
お尋ねしたいのは以下の2点です。

・プリペアードステートメントを使えば、SQLインジェクションの対策としては完璧ですか?

・SQLインジェクションを防ぐ方法はプリペアードステートメントを使うのが良いのはわかりますが、
 htmlspecialcharsを使う方法が代わりにならない理由は何ですか?
 (数値が期待される部分では、その部分に用いる値をintval()で数値化する方法もダメですか?)
0216nobodyさん2010/06/05(土) 23:32:48ID:???
>>215
>プリペアードステートメントを使えば、SQLインジェクションの対策としては完璧ですか?
いいえ
プリペアードステートメントとは簡単に言えばSQLを高速に実行するための準備のことなので
sqlインジェクションとは関係ありません
PDO::prepareはこの準備をしつつSQLインジェクション対策を同時に行うメソッドです

>・SQLインジェクションを防ぐ方法はプリペアードステートメントを使うのが良いのはわかりますが、
> htmlspecialcharsを使う方法が代わりにならない理由は何ですか?
xssとsqlインジェクションとではエスケープすべき文字列が異なるからです
02172132010/06/05(土) 23:34:04ID:bkBaLixK
>>214
つまりどう書けばいいんですか?
■ このスレッドは過去ログ倉庫に格納されています