PHP質問・雑談スレ【初心者お断り(ROM歓迎)】©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん 転載ダメ©2ch.net
2016/04/22(金) 08:58:11.47ID:???初心者お断り(ROM歓迎)と書いてますが、初心者用のスレが用意されているからで、
難しい質問や話題をしなければいけないわけではありません。
PHPマニュアルの読み方を概ね理解していて、関数リファレンスが正しく読める方用のスレです。
PHP未導入の方や、手取り足取りが必要な初心者の方はくだスレへどうぞ。
【PHP】下らねぇ質問はここに書き込みやがれ 4
http://echo.2ch.net/test/read.cgi/tech/1457792733/
その他リンク
・PHPマニュアル
https://secure.php.net/manual/ja/index.php
・コードテスト・貼り付け用
http://ideone.com/
・プログラミングのお題スレ Part8 (求PHPer参戦)
http://echo.2ch.net/test/read.cgi/tech/1444216746/
このスレで扱う話題
・PHPのコード,設定や設定値に関する質問
・常識的範囲内でのコードレビュー依頼・改良相談
・PECL,PEARに関する質問
・PHP新機能やPHP関連トレンドの話題
(FWや非公式ライブラリの話題や特徴比較は良いが使い方から先の話題は専スレへ)
・PHPのバグ発見報告・公式に報告する前の検証依頼
このスレで扱わない話題
・直接関係ない○○特有の質問(専スレへ)
(HH,エディタ,IDE,サーバ,OS,DB,SQL,FW,テンプレート,非公式ライブラリ・アプリケーション等)
・PHPの改造
0724nobodyさん
2016/10/07(金) 06:39:00.96ID:???それおかしくね?CやPerlやRubyやPython知らないと駄目じゃん。
それらの技術者が「PHPの方が簡単でわかりやすいからPHP使おう!」とはならないだろ。
0725nobodyさん
2016/10/07(金) 10:12:32.50ID:???宗教的理由で忌避するのは個人では構わないけどそうでないなら素直にテンプレートエンジン使っとけ
あとそのコードもechoをexplicitに書くのはどうなん
<ul>
<?php foreach ($list as $data): ?>
<li><a href="<?=$data['url']?>"><?=$data['title']?></a></li>
<?php endforeach; ?>
</ul>
>>724
結局プログラマの言語の基準って科学計算以外なら結局未だにCが基準だと思うんだ
C/C++/Java/C#はみんなかなり似た文法だと思うし, だからこそJavaは仮想マシン上, C#はWindows上で普及してると思う(言語自体が「まとも」であることは当然だが)
PHPも, だからWeb上で普及してると見る
あとCでWeb開発なんて普通しない(デメリットが大き過ぎる), PerlからPHPに移ったという層はそれなりにいるだろう
RubyやPythonから始めた場合には言及してない
0727nobodyさん
2016/10/07(金) 10:21:38.40ID:???PHPをHTMLに書くのと何が違うのかまるで分からん。
どっちも”プログラム的な何か”をHTMLに挿入するじゃん。
なのに「すべきでない」理由にならないと思うんだが
0728nobodyさん
2016/10/07(金) 10:26:03.21ID:???テンプレートエンジンとして使うにはPHPは高機能過ぎる
見えてよいもの以外は見えるべきではないし, 使ってよいもの以外は使えるべきでない
カプセル化の大原則だと思うのだけれど
0729nobodyさん
2016/10/07(金) 10:31:04.71ID:???PHPそのものが優秀なテンプレートエンジンだからね
フレームワークも必要最小限なものだけしか使ってない
0731nobodyさん
2016/10/07(金) 10:32:16.78ID:???デザイナーがデザインしやすくなるというのがあるんじゃないかな。分業しやすくなると
プログラムの流れとしてデータはデータベースに入れてプログラム変更に干渉しないようになったし
デザインとプログラムもできるだけ分けて干渉しないようにした方が良いということかなと
0732nobodyさん
2016/10/07(金) 10:45:41.10ID:???どちらも「プログラム的な何か」をHTMLに埋め込むじゃん。
729も書いてる通り、それでもHTMLが見やすく・分かりやすい形にできるし、
実行してすぐに結果も分かるから、初心者向けでとっつきやすい。
0733nobodyさん
2016/10/07(金) 10:46:46.22ID:???俺、昔の癖でショートタグ使ってないんだが、
php.ini変えなくてもPHP5.4から標準になったのね・・・
0734nobodyさん
2016/10/07(金) 10:47:08.04ID:???0736nobodyさん
2016/10/07(金) 11:14:25.56ID:???0737nobodyさん
2016/10/07(金) 12:24:34.06ID:???https://agearea.com/
0738nobodyさん
2016/10/07(金) 12:33:01.32ID:???それはテンプレートをdisってんのかね?
0739nobodyさん
2016/10/08(土) 00:16:20.30ID:???絶対の正解っていうのは存在しないさ。
ただしそれでもSymfony公式はTwigの使用を推奨していて、その一番の理由は、キャッシュしてHTTPアクセス時の処理不可を軽減できるからだね。
Smartyもそうだし、テンプレートエンジンと呼ばれてるものは大抵、ナマの言語で書いて毎回パースするよりは高速化できるキャッシュ機能をそなえているよ。
0740nobodyさん
2016/10/08(土) 01:15:37.18ID:???0741nobodyさん
2016/10/08(土) 02:00:06.91ID:???その辺のテンプレートエンジンはなんか大げさなんだよなあ
0742nobodyさん
2016/10/08(土) 02:40:57.69ID:???shell_exec("php {$phpfile}")で取る?
それともcurlとかでlocalhost http経由で取る?
前者だと環境依存が強くなるから、どちらかというと確実な後者のほうがよさそう?
0743nobodyさん
2016/10/08(土) 11:38:47.90ID:???こんな程度の対策してないサイトがたくさんあるの?w
0744nobodyさん
2016/10/08(土) 11:51:11.30ID:???ゴミクズみたいなオレオレテンプレートエンジンつくって
「これ使って下さい」とか言われたのでコード読んでみたら全くエスケープ機能がなくて
XSSし放題じゃんってのを去年見た。
そのバカ会社はSQLインジェクションもし放題で、
DBまるごと吹っ飛ばせる状態だった。
同じサーバー内ならshell_execで取る。
あるいは、memcachedみたいなメモリキャッシュシステムを使っちゃう。
ここ最近の>>738あたりから>>743あたりまでを総なめしてレスしてみました。
0745nobodyさん
2016/10/08(土) 11:59:56.24ID:???自分の場合PHPでDBにデータ入れる時とか表示する前にエスケープしてるけど
そんなXSSやSQLインジェクションし放題の会社があるとはw
そんなとこに依頼するなら自分のところに依頼してくれりゃあいいのにw
0746nobodyさん
2016/10/08(土) 13:57:34.21ID:???置換する実装書いちゃうんだろ??
0747nobodyさん
2016/10/08(土) 14:06:25.34ID:???0749nobodyさん
2016/10/08(土) 14:29:44.74ID:???都合(この場合はHTMLを使って表示?)であって、
バックエンドのデータベースにクライアント側の都合に合わせてエスケープして入れるとかしねぇわ。
0750nobodyさん
2016/10/08(土) 14:47:46.08ID:???DBに入れる前にエスケープでも良いと思うけどなぁ
なんなら、フォーム処理は全てエスケープすればいい。
0751nobodyさん
2016/10/08(土) 14:58:00.40ID:???なんで、バックエンドのデータベースに表示側の責務(エスケープしなければいけない)を負わせなければいけないんだ?
復元できるからいいとかいったらそりゃ何でもありになるわ。
そのシステムでHTMLを使って表示しないAndroidやiOSのアプリを開発しなければいけなくなったら、
そのエスケープが邪魔になるし。
0752nobodyさん
2016/10/08(土) 14:58:26.83ID:???例えばreal_escape_stringは良いけど
htmlspecialcharsとかで処理するのは論外
0753nobodyさん
2016/10/08(土) 15:01:23.12ID:???2chのDATと同じ発想だな・・・
2chのDATもHTMLで表示が前提でエスケープしてあるから、
HTMLで表示しない専ブラとかでもいちいちエスケープを解除しなければいけない・・
もちろん、解除するのはアンエスープする関数を呼ぶ1行追加すりゃすむけど、
俺的にはそういう問題じゃねぇ。
0754nobodyさん
2016/10/08(土) 15:02:14.83ID:???>そのシステムでHTMLを使って表示しないAndroidやiOSのアプリを開発しなければいけなくなったら、
そんなケースあるか?
常に「こうだったら」「あーだったら」ってお前のように心配事繰り返すなら、
そもそも最初からやればリスクは減るよねってことだ
0755nobodyさん
2016/10/08(土) 15:06:38.25ID:???0756nobodyさん
2016/10/08(土) 15:09:11.75ID:???「対策していると”思ってた”」「出来ている”つもり”だった」ってのがあるだろ。
XSSやSQLインジェクション関連の情報流出って大体そうじゃないか?
端からセキュリティ観念がゼロでシステム開発している奴なんて稀だろ。
そら、責務やら論理的観点やらプログラマとしての正しさやら
言い出したらキリがないよ。
「俺は絶対間違えない!」ってのなら、出力時だけエスケープすればいいだけで、
DB入れる前にエスケープしてる奴を全否定するのは違うだろ
0757nobodyさん
2016/10/08(土) 15:09:46.05ID:???と考えると、不要なエスケープをするとデコード方法がわからない(そもそもデコード処理が必要なのかもわからない)ので困る。
0758nobodyさん
2016/10/08(土) 15:10:30.15ID:???クソなシステムは正しく動かなかったり、穴だらけのシステムのことで、
「ちゃんと動かす処理」をどうしようが勝手じゃねーか?妙に神経質なやつがいるな
0759nobodyさん
2016/10/08(土) 15:23:33.68ID:???まともなテストしてねぇだけじゃんかよ。それww
XSSやSQLインジェクションになる部分なんて明らかなんだからしっかりテストとコードレビューするしかないんだって。
>「対策していると”思ってた”」「出来ている”つもり”だった」ってのがあるだろ。
その通り、だから、仮にデータベースにエスケープしてデータ入れるとしても、
「しっかりデータベースをエスケープして入れてると"思ってた”」になっちゃうんだよ。
だから、そんな事よりしっかりテストとコードレビューするしかないんだってww
0760nobodyさん
2016/10/08(土) 15:49:06.96ID:???0761nobodyさん
2016/10/08(土) 15:56:07.39ID:???これは自分1人でしか開発したことがねぇやつが言う言葉だろ。
0762nobodyさん
2016/10/08(土) 17:36:47.26ID:???自分がDBに入れる前にエスケープするのはSQLインジェクションを防ぐためと念のためってだけ
人間どこでミスするかわからんし
もちろん表示の時だけエスケープした方が良いってのはその通りだが
結局ちゃんとユーザー側で動いていれば良いしそれが正義だと思ってる
逆にそれで何かあった時の方が怖くないか?
個人情報漏れとかね
0763nobodyさん
2016/10/08(土) 19:51:23.91ID:???入力をストレージに保存する際に表示形式に合わせた「変換」を行うとデータの再利用性が失われる
0764nobodyさん
2016/10/08(土) 21:31:42.94ID:???もちろんその通り防ぐ「べき」
しかし現実にPDOはIN句が使えなかったりして複雑な処理しなきゃいけなかったり、重くなったりする
そういうことを考えると入れる時にエスケープしておくのが安全かと自分は考えている
そういうリスクを負ってでもデータの再利用性を重視したいという人は表示の時のみエスケープすれば良いんじゃないかな
0765nobodyさん
2016/10/08(土) 21:42:28.25ID:???これがそもそも間違ってると思う。
そもそも、何人かちらほらデータベースに入れる「前」にエスケープした方が安全みたいな論調が
あるが、エスケープを「前」にしようが「後」にしようが、人間ミスすることには変わりないし、
最終的には>>759で書いたようにレビューしてテストするしかないのに。
なんで勝手にデータベースに入れる前にエスケープした方が「安全」だと思ってるのか?
「前」だろうが「後」だろうが安全性は変わらん。最終的にはレビューとテストで安全性を担保にするしかないのに。
何を根拠に「前」の方が安全っていってるのか理解しかねる。
0766nobodyさん
2016/10/08(土) 21:45:57.17ID:???そりゃ入る時は一度しかないけど取り出すのは理論上無限にあるからでしょ
回数考えれば一度と無限じゃ手間が全然違う
0767nobodyさん
2016/10/08(土) 21:51:03.04ID:???もちろん、入れるのと取り出すのは取り出す方が多いのは統計的にもそうだろう。
0768nobodyさん
2016/10/08(土) 22:04:49.87ID:???根本的にエスケープがどういうものかを分かってない。
XSS脆弱性埋め込むよりはマシだろというのは、
ポスターが剥がれるよりいいだろって言いながら4辺をガムテープ貼りする概念だ。
エスケープはターゲットに出力する時、都合が悪い物にだけする。
teratailあたりをずっと眺めてればわかるけど、
二重エスケープでHTMLタグが表示されてることが何度もあった。
エスケープをどのように扱うべきか、ちゃんと分かってない奴が作ってるからそうなるのさ。
見た目なんかどうでもいい、って人はまぁ、たしかにとにかく最初にエスケープしちゃえばいいよ。
メンテナンスする人が君のことを呪うだろうけど。
0769nobodyさん
2016/10/08(土) 22:17:21.41ID:???>エスケープはターゲットに出力する時、都合が悪い物にだけする。
これは別に、選択的にエスケープしろ、という意味じゃないよ。
普通のテンプレートエンジンが使っているであろうhtmlspecialchars()というメソッドが、
勝手にどれをエスケープすべきかは判断してくれるので、
グラマとしては「マズいものが有りそうな物を出力する時にだけ」かたっぱしからかけろ、
という意味ね。
>>748のSQLに関するプレースホルダについては
ちゃんとプレースホルダを使っているのであれば、それはエスケープですらない。
クエリをプリペアしてあるので、そこに当てはめる値についてはエスケープする必要がまったくないんだ。
SQLについてエスケープする必要があるのは、全部テキストでSQLを投げる場合。
0770nobodyさん
2016/10/08(土) 22:28:21.64ID:???>そりゃ入る時は一度しかないけど取り出すのは理論上無限にあるからでしょ
>回数考えれば一度と無限じゃ手間が全然違う
無限に処理をするのは君じゃなくてコンピュータだからね。そんな数を比べても意味ないよ。
君がすることは、出力の時に都合が悪い物をエスケープしてくれる処理を
1つの出力(PHPだとページと等価かな)について1回コードを書くだけ。
それで、メジャーなテンプレートエンジンは、その処理を勝手にやってくれる。
(Smartyがダメなのは、そのエスケープ処理がデフォルトではやらないようになっていること
Twigが優れているのはデフォルトがエスケープ処理をする設定になっていること)
エスケープに要する時間はピリオドの後0が2つの後に数字がくるくらいかな。だから気にしなくていいよ。
0771nobodyさん
2016/10/08(土) 22:29:55.02ID:???安全性は最高だし、特定の関数に依存する変換処理にならないし
0772nobodyさん
2016/10/08(土) 22:31:38.53ID:???上の方でずっとあっちのスレと俺を目の敵にしてた君じゃないかな?
君はまだまだダメだ。もうちょっと勉強し、経験を積み、頭を使いなさい。
0773nobodyさん
2016/10/08(土) 22:36:55.26ID:???それ、特定文字だけエスケープするのと何もかわんないよ、きっと。
DBに突っ込んだ内容をメールで送りますってなったら、
する処理、二つの場合で変わるかい?
DBに突っ込んだ内容を画面に表示しますってなったら、
する処理、二つの場合で変わるかい?
これは変わりそうだね。
なぜなら、文字コード表記を戻してJavaScriptを含んだHTMLが再現され、
見事にXSSが発動するはずだからだ。
そしたら、よけいめんどくさんじゃないかい?
0774nobodyさん
2016/10/08(土) 22:49:38.60ID:???>しかし現実にPDOはIN句が使えなかったりして複雑な処理しなきゃいけなかったり、重くなったりする
使えないなんてことは絶対にないし、
君が「複雑だ」と感じるのは、単純に君の技術がまだまだ低すぎるから。
たぶん、コードをベタ書きしているレベルってことだろう。
もうちょっと頭を使いなさい。
IN句の重さについては、
DBにもよるが、普通の利用において問題になるほどほど重くなることは通常無い。
気になるとしたら、設計上の問題が大きい。
IN句の中に書く要素数は仕様によって決まるものだからプログラムだけではいかんともしがたい場合もある。
確かに昔のMySQLなんかはIN句がやたら重かったからね。
それから、大抵のDBではSQLの1文に書ける文字数の上限があるので(それでもかなりの文字数はかける)
IN句で表現しようとすると、その文字数を超える場合もでてくる。
そういう意味で、IN句ではなく別の実装にしておこう、というケースはよくある。
0775nobodyさん
2016/10/08(土) 22:57:41.06ID:???>「入力でサニタイズ」することが大間違いなのだが、そう言ってしまうと、 「一般的に言われている“正しい”対策」と言ったことと矛盾してしまうため、 「サニタイズ自体は誤りでない」ことにして辻褄を合わせようとする。
>その結果、「サニタイズは誤り」という本当のことを書けなくなり、「SQL文 を組み立てているすべての個所でサニタイジングする」と言わざるを得なくなっ ている。
>こうやって「サニタイズ」の用法は節操なく拡大されてきた。そして、誤解す る者をいつまでも残す結果となった。
0776nobodyさん
2016/10/08(土) 22:59:13.78ID:???0777nobodyさん
2016/10/08(土) 23:01:31.18ID:???XSS対策用のエスケープと
SQLインジェクション対策用のエスケープを
ごっちゃにしている人がいるみたいだから、ちゃんと区別しような。
ごっちゃにして解説している本とかもいっぱいあるけど。
0778nobodyさん
2016/10/08(土) 23:05:46.92ID:???どこからの引用かわからないけど、その通りだね。
トンデモ解説なテキトーな書籍が沢山出版された事が元凶なんだろう。
誰が言っていたか忘れたけど、
「出来るやつは実行する。出来ないやつが教える」って事なんだろう。
0779nobodyさん
2016/10/08(土) 23:11:41.51ID:???>>762 : nobodyさん2016/10/08(土) 17:36:47.26 ID:???
>久々に盛り上がってるねw
>自分がDBに入れる前にエスケープするのはSQLインジェクションを防ぐためと念のためってだけ
>人間どこでミスするかわからんし
君は、
>久々に盛り上がってるねw
こんな余裕をかましている場合じゃないほど、物事をわかっていないんだ。
0780nobodyさん
2016/10/08(土) 23:17:32.21ID:???俺は困らないし。
0783nobodyさん
2016/10/08(土) 23:23:42.03ID:???複雑って程でもないけどそれなりに面倒だよ
IN句をそのまま使えた方が良い
それ以前にIN句をそのまま使えないPDOがクソと言えばクソだが
0784nobodyさん
2016/10/08(土) 23:23:42.62ID:???ちょっとだけ補足
>「入力でサニタイズ」することが大間違いなのだが
ここだけ、間違いね。
フォームで期待されている値以外を排除するための「入力でのサニタイズ」
つまり、本当の意味でのサニタイズは絶対に必要だよ。
その後に書くプログラムの量と複雑さに関わってくるからね。
まず、仕様で定められている値にサニタイズする。これが鉄則。
これが出来ていないプログラムが実に多すぎるのが残業だらけのクソ業界に繋がっている。
このサニタイズの際には不必要な改行コードやNullバイトも必ず削除しておくこと。
これも、ちゃんとやっているシステムを見たことが無い。
そのせいでphpmyadminの古いバージョンではNullバイト攻撃による任意のPHPコード実行が可能な脆弱性があって、
アホみたいな話だけど、PHPの方でこの脆弱性を修正した。
0785nobodyさん
2016/10/08(土) 23:24:50.82ID:???現実にやってるか言ってるんだけど、
君がやり方を分からないって可能性を、なぜ排除した?
この短い時間で。
0786nobodyさん
2016/10/08(土) 23:26:10.85ID:???>やったことあればわかるしちょっと調べればわかること
よし、じゃあ、その調べたソースを見せてみてくれ。
添削してあげるから。
何度も言うけど、君は技術力も知能も低すぎるんだ。
自覚しないと前に進めないよ。
0787nobodyさん
2016/10/08(土) 23:27:46.57ID:???クソなのは、君の脳
ちょっと、「どうして複雑だと思うか」を分かるように、コード書いて見せてごらん。
教えてあげるから。
0788nobodyさん
2016/10/08(土) 23:30:45.67ID:???なんでこっちが見せなきゃいけないんだw
自分で仮想サーバーなりなんなりでPDO使ってIN句入れて実行してみれば良いだろw
そのままじゃ動かないから
IN句のやつをorでやればできるけど
0790nobodyさん
2016/10/08(土) 23:35:02.65ID:???>なんでこっちが見せなきゃいけないんだw
上の方読んでもまだわからないの?
君がアホすぎるから、今の君のアホな脳内をみせてくれないと
どこが間違っているのか教えられないよ、ってこと。
「PDOではIN句が使えない」なんて、猿でも言わないよ。
PDOってのはただの抽象化レイヤーでしかないからね。
>自分で仮想サーバーなりなんなりでPDO使ってIN句入れて実行してみれば良いだろw
だから実際に使っているから言っているんだよってさっきも言ったよね。
君さ、毎回毎回草生やしてるけど、そんな余裕ないほど自分がアホの子なんだってそろそろ気付こうよ。
0791nobodyさん
2016/10/08(土) 23:38:49.31ID:???きみ、アホ君かな?
まず、XSS脆弱性とSQLインジェクション脆弱性の違いを理解しよう。
君が全く理解できていないことは、この文章のバカさ加減を見ればすぐにわかる。
>では聞くがDBにエスケープしてデータ入れて困る時って具体的にどんなケースなの?
答えを書いてあげようか?
DBに「なんらかのエスケープされたデータ」を入れた事「自体」で困ることはない。
だが、その取扱において困るケースは沢山有る。
君は「DBにエスケープしてデータ入れて」と書いたが、
このエスケープとは、何に対するエスケープか?
それを理解しない限り、君は相変わらずネアンデルタール人以下のままだ。
0792nobodyさん
2016/10/08(土) 23:39:36.84ID:???サルでも言わないんだw
ここでは言ってるけど
http://tips.recatnap.info/wiki/PDO%E3%81%A7where%E5%8F%A5%E3%81%AE%E3%80%8Cin%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%86
0793nobodyさん
2016/10/08(土) 23:44:44.66ID:???何に対するエスケープかと言えば主にXSSと次にSQLインジェクションだよ
XSSはポストから不正なコードを埋め込まれる脆弱性でSQLインジェクションは不正なコードによりSQLを実行されることだ
自分1人なら出力時に完全にエスケープできるとしても他の奴がもしやらずに出力したらどうするんだ?
実際に脆弱性突かれてるケースがあるというのに
んでその取扱いにおいて困るケースってのは「具体的」にどんなケースなの?
3つくらいで良いから教えてよ
0794nobodyさん
2016/10/08(土) 23:46:26.67ID:???君、本当に、どこまでバカなのかな?
どうしてそれを見て「使えない」と思ったの?
ちょっと説明してみてくれる。
君、思ってた以上に頭が悪いようだな。
あと、
>ここでは言ってるけど
この人誰? なんか有名な人なの?
全然知らない人が書いた、意図も分からないペラのページ見て
「PDOではIN句が使えない」と思い込んじゃう君の脳みその構造がよくわかんないな。
0795nobodyさん
2016/10/08(土) 23:49:14.53ID:???いや実際にPDOでそのままIN句は実行できないわけだが?
可能ならPDOでIN句そのまま使いたいから使える方法教えてくれよw
0796nobodyさん
2016/10/08(土) 23:50:51.44ID:???>何に対するエスケープかと言えば主にXSSと次にSQLインジェクションだよ
君はさ、その二つが別の物だとわかっているのに、
一つの文章の中で「エスケープはどうする」って語るんだ。
君が頭おかしいところの一つはそこ。
>自分1人なら出力時に完全にエスケープできるとしても
>他の奴がもしやらずに出力したらどうするんだ?
>その取扱いにおいて困るケースってのは「具体的」にどんなケースなの?
>3つくらいで良いから教えてよ
・君一人なら、DBに入っているデータは「ある形式でエスケープされている」とわかるとしても
他の奴が「その形式でエスケープされている」って事をとくていするにはどうするんだ?
・上の方のteratailの項参照
・上の方のメール送信の項参照
3つだね。これでいいかな?
0797nobodyさん
2016/10/08(土) 23:53:08.85ID:???いい加減馬鹿みたいに草生やすのやめたら?
君はそんなことシている余裕ない子だよ?
>可能ならPDOでIN句そのまま使いたいから使える方法教えてくれよw
ちょっとさ、君が想定している、その「そのまま使う」って言う状態が
どういう状態か説明しみなよ。
そうしないと、君、一生アホのままだよ?
0798nobodyさん
2016/10/08(土) 23:55:13.03ID:???あとさ、
>>748 : nobodyさん2016/10/08(土) 14:11:23.10 ID:???
> >>747
>PDOでプレースホルダも使ってるけど
>念には念を入れてだよ
これ、君だよね?
自分で何言ってるかよく考えてからレスしてね。
0799nobodyさん
2016/10/08(土) 23:55:17.92ID:???>君一人なら、DBに入っているデータは「ある形式でエスケープされている」とわかるとしても
>他の奴が「その形式でエスケープされている」って事をとくていするにはどうするんだ?
そんなの注意事項ファイルに記載しておくかINSERTしてるソース見ればわかるだろ
百歩譲って出力時だけエスケープすれば良いとしてもアホな奴がプリペアードステートメントや
プレースホルダ使用しなかったり出力時にエスケープ処理しないで問題が起きたらどうするんだ?
個人情報抜かれたりした後じゃ遅いだろ
0800nobodyさん
2016/10/08(土) 23:57:05.68ID:???そのまま使うというのはIN句をSQL平文そのまま使うという意味だ
もちろん他の部分はPDOのプリペアードやプレースホルダ使用でな
0801nobodyさん
2016/10/09(日) 00:01:51.77ID:???> >>797
> そのまま使うというのはIN句をSQL平文そのまま使うという意味だ
> もちろん他の部分はPDOのプリペアードやプレースホルダ使用でな
なんでそんなアホなことしたいのかは置いとくとして、
そうしたいならそうすればいいじゃん。
思いっきり脆弱性の危険性を埋め込むことになって
これまでの知ったかぶりな君の発言を全部否定することになるけど、
そうすればいいじゃないか。
どうして出来ないと思うの?
君、本当にアホの子だね。
0802nobodyさん
2016/10/09(日) 00:04:52.21ID:???つまり君は、エスケープの意味も、何故しなければいけないのかも、
プレースホルダの意味も、何故存在するのかも、
クエリをプリペアするというのがどういうことかも、
何故プリペアするのかも全く分かっていないのに
これまで十数レスに渡って、さも分かっているような顔をして草生やしてたわけだ。
救いようがない感じかな、どうやら。
0803nobodyさん
2016/10/09(日) 00:12:55.86ID:???> そんなの注意事項ファイルに記載しておくかINSERTしてるソース見ればわかるだろ
IN句生成が複雑だなんていってる程度の君のクソコードはみんな、読みたくなんかないって。
> 百歩譲って出力時だけエスケープすれば良いとしてもアホな奴がプリペアードステートメントや
> プレースホルダ使用しなかったり出力時にエスケープ処理しないで問題が起きたらどうするんだ?
> 個人情報抜かれたりした後じゃ遅いだろ
ほら、またごっちゃにしだした。何回言ったら理解できるのかな?
今君が話した「出力時」ってどの、何を出力を想定した? それがプリペアードステートメントと本当に関係があったかい?
> 個人情報抜かれたりした後じゃ遅いだろ
君がそんな重要なシステム開発に関われているとは到底思えないなぁ。
これまでの君の発言を読んでみればそれは誰にでも分かることだが、
君にもわかるように教えてあげるね。
「クリティカルな開発の現場においては、DBアクセスは抽象化されたライブラリを利用し、
そのライブラリがSQLインジェクション脆弱性対策を担保している
そうした方が、君みたいなアホが考えたオレオレアクセスを使うよりも遥かに安全だと言うことが分かりきっているからだ」
勿論、そのライブラリを使わずに君みたいな智識の無いバカが勝手なアクセスをすれば脆弱性が埋め込まれることになるが、
規定されているライブラリを使っていないことは、コードを見ればひと目でわかる。
それから繰り返し、もう一度言うけど、
XSS脆弱性対策とSQLインジェクション対策はまったく別の物だから
いい加減区別して考えられるようになれ、野猿。
0804nobodyさん
2016/10/09(日) 00:19:55.67ID:???>>800 名前:nobodyさん :2016/10/08(土) 23:57:05.68 ID:???
> >>797
> そのまま使うというのはIN句をSQL平文そのまま使うという意味だ
> もちろん他の部分はPDOのプリペアードやプレースホルダ使用でな
そういう状態を
>>748 : nobodyさん2016/10/08(土) 14:11:23.10 ID:???
> >>747
>PDOでプレースホルダも使ってるけど
>念には念を入れてだよ
とは表現しねーんだよ、マヌケ! 使ってる意味ね〜だろーが!
いい加減に知ったかぶりで乗り切ろうとするのはやめろ。
0805nobodyさん
2016/10/09(日) 00:25:18.48ID:???XSSとSQLインジェクション対策が別物ということなどわかっている
問題は他人がselect系の作業を行う可能性があるということだ
0806nobodyさん
2016/10/09(日) 00:30:13.81ID:???データをストアする際に表示形式を考えて加工するというのはモデルがビューの領域を侵犯してることに他ならない
モデルがビューを侵犯する以上MVCが全て密結合にならざるを得ない
したがって一般にストア時に表示形式を前提とした「加工」を行う設計は「悪い」設計だと言わざるを得ない
0807nobodyさん
2016/10/09(日) 00:47:53.24ID:???仕様理解してればどうってことないんだけどね
一昔前は情報も少なかったけど最近は多いしちょっとググれば出てくるよ
WHERE `id` IN (:hoge)
bind(":hoge", [1,2,3,4], INT) //1のみ有効
bind(":hoge", "1,2,3,4", INT) //1のみ有効
bind(":hoge", "1,2,3,4", STR) //無効
WHERE `id` IN (:hage, :hige, :huge, :hege)
bind(":hage", 1, INT)
bind(":hige", 2, INT)
bind(":huge", 3, INT)
bind(":hege", 4, INT)
0808nobodyさん
2016/10/09(日) 00:51:32.31ID:???$parameters = array();
$parameters[] = 123;
$parameters[] = 456;
$parameters[] = 789;
$sql =
0809nobodyさん
2016/10/09(日) 00:53:05.43ID:???PDOでINするときって
$parameters = array();
$parameters[] = 123;
$parameters[] = 456;
$parameters[] = 789;
$sql = ”SELECT 〜〜 FROM 〜〜 WHERE column_name IN (”;
foreach ($parameters as $index => $parameter) {
if ($index > 0) { $sql .= ’,’; }
$sql .= ’?’;
}
$statement = $db->prepare($sql);
foreach ($parameters as $parameter) {
$statement->bind($parameter);
}
$statement->execute();
俺はこれでやってるんだけど、もっといい方法あったら教えてくれー。
「できない」派の人は、これはPDOライブラリの機能ではなくソースで対応してることだから「できない」って意見なのかな?
0810nobodyさん
2016/10/09(日) 00:54:37.98ID:???不特定多数の値をINに入れたいときの書き方、という意図です。
たとえばフォームのチェックボックスに好きなだけチェックして送れるとかの。
0811nobodyさん
2016/10/09(日) 10:00:44.52ID:???> bind(":hoge", "1,2,3,4", INT) //1のみ有効
> bind(":hoge", "1,2,3,4", STR) //無効
これはそれぞれの値をintやstringにキャストした時のやつってことかな?
(int)[] = 0
(int)[1000] = 1
(int)"1,2,3" = 1
(string)[1,2,3] = "Array"
"1,2,3,4"がだめなのは"1,2,3,4"というidと認識されてるからって感じで
0812nobodyさん
2016/10/09(日) 11:34:44.96ID:???0813nobodyさん
2016/10/09(日) 16:47:21.63ID:???> >>803
>XSSとSQLインジェクション対策が別物ということなどわかっている
わかってるなら何で区別して書かねーんだ、マヌケ。
お前のくだらん言い訳は聞き飽きた。
> 問題は他人がselect系の作業を行う可能性があるということだ
SELECT系だけが問題だと思ってるアホがプレースホルダを語るな、バカ。
本当にお前は、もう、3年ROMれ。
お前位みたいなバカが「PHPのPDOはIN句が使えない」とか
わかった風なフリして書き込むだけで、本当に迷惑なんだよ。
分かってないなら「わからないので教えてください」っていう体で書け。
そのぐらいの“人”としての振る舞いもわかららないからデルタールだって言ってんだ。
0814nobodyさん
2016/10/09(日) 17:07:33.97ID:???えっとね、コードが汚いから他の人がメンテしずらい。
特に、ここがダメ
$sql = ”SELECT 〜〜 FROM 〜〜 WHERE column_name IN (”;
foreach ($parameters as $index => $parameter) {
if ($index > 0) { $sql .= ’,’; }
$sql .= ’?’;
}
もし、この流儀に沿って治すとしたら
$in_section = "";
if(count($parameters) > 0){
$holders = array();
for($i=0; $i<count($parameters); $i++){
$holders[] = "?";
}
$in_section = " WHERE column_name IN (" . implode(", ", $holders) . ")";
}
$sql = "SELECT 〜〜 FROM 〜〜{$in_section}";
こんな感じ。精査はしてないから雰囲気だけ分かってくれれば。
0815nobodyさん
2016/10/09(日) 17:07:58.33ID:???ただし、向こうでも言ったけど、プレースホルダに ? 使ってるやつはいい加減頭が古すぎる。
名前付きプレースホルダを使うようにしよう。
例えば
SELECT ~~ FROM ~~ WHERE hoge = ? AND hage = ? AND moge = ? muge = ? AND boke = ? AND sage = ?;
$params = array("guri", "gura", "muga", "boga", "daga", "riga");
というコードがあるとして、moge = ? の後に pubya = "papa"を挿入したい場合、
bindするパラメターのどこにpapaを挿入したら良いのか、一目でわかるかい?
実際のシステムは、バインドパラメターが10個以上になるケースも珍しくない。
そんなとき、いちいち数を数えるのは拷問でしかない。
名前付きプレースホルダを使うシステムなら順番を考慮する必要なくbind出来るから、
? なんていうノータリンが考えたソリューションは使うべきではない。
0816nobodyさん
2016/10/09(日) 17:16:17.26ID:???IN句の場合数がもの凄く多い時もあると思うがそういう時名前のbind使いたい時は
ループで数字足していって名前作るということ?
0817nobodyさん
2016/10/09(日) 17:37:13.95ID:???そういうこと。それは別にIN句に限ったことじゃない。
普通のWHERE句とかでも同様。
こんな感じ
SELECT ~~ FROM ~~ WHERE moge = :moge AND mage = :mage AND boke IN (:boke1, :boke2, :boke3);
$bind = array(
"moge" => "もげ",
"mage" => "まげ",
"boke1" => "ぼけ1",
"boke2" => "ぼけ2",
"boke3" => "ぼけ3"
);
>>816なら作り方は説明しなくても分かるよね?
これについて、おさるサンの>>792が紹介している方法でbindする。
これなら後で別の要素を追加するにしても、順番なんか全く考慮しなくていいだろう?
こんな簡単なことなんだよ。難しくもなんともない。
なのに、こういう事を紹介している本もサイトもまったくない。
世の中、本当にバカしかいないんだなって思うよ。
0818nobodyさん
2016/10/09(日) 18:18:06.51ID:???貴方やたら人格攻撃や否定してるけどそういうの職場ではやってないよな?
相手もやる気なくなって職場の雰囲気悪くなるから指摘する点だけ話せよ
0819nobodyさん
2016/10/09(日) 18:21:37.49ID:???お前が誰だかわからんけど、
そんなどうでもいいこと指摘してる暇があったら、もっと勉強して技術磨け。
それがこの分野で金をもらうための最低条件だ。
人格攻撃? おまえ、本当にバカだろう。
おれは一度も人格攻撃なんてしていない。
おれがしてきたのは、
認識がおかしい場合と、
人としての振る舞いがおかしい場合だ。
もし、俺が人格攻撃をしていると思う箇所があるなら例示してみろ。
0820nobodyさん
2016/10/09(日) 18:27:52.80ID:???この業界2人以上で作業することがほとんどなんだからどうでも良くはない
自分のことを言ってるのではなくて貴方のことを話している。自分の間違いは認められないタイプか?
勉強するなんてのは当然のことだ
0821nobodyさん
2016/10/09(日) 18:33:46.95ID:???まーたさるかに合戦やってんのかー
0822nobodyさん
2016/10/09(日) 18:51:58.56ID:???一人でやる分には問題ないけど
0823nobodyさん
2016/10/09(日) 19:37:14.78ID:???>勉強するなんてのは当然のことだ
全く勉強しないのに、さもわかったような顔して適当な智識をひけらかし、
間違いを指摘されてもヘラヘラ笑って「なんで俺が俺の考え方を提供しなきゃいけないんだよ」
と、言い放つバカと
>この業界2人以上で作業することがほとんどなんだからどうでも良くはない
一緒に仕事をしたいと思うやつは居ないし、もし一緒に仕事をすることになったら
そいつをやめさせるか、自分が職場を変える。
簡単なことだな。おまえ、アホだろう?
■ このスレッドは過去ログ倉庫に格納されています