トップページphp
1002コメント362KB

PHP質問・雑談スレ【初心者お断り(ROM歓迎)】©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん 転載ダメ©2ch.net2016/04/22(金) 08:58:11.47ID:???
PHP関する質問や雑談をするスレです。
初心者お断り(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の改造
0697nobodyさん2016/10/05(水) 11:36:08.06ID:???
>>687を作った者だがまず3年というのは確かに歳食うと範囲が狭すぎる
目的は上司や親世代と繋がって発言がしにくくなることだから今後3〜10年の幅で選択制にしようと考えている

あと掲示板じゃなくてSNSだからタイムラインやメッセージ機能は実装した

環境はPHP5.6でLAMP、Smartyは重くなるので使用しないで自作の簡単なテンプレートエンジンを作った
フレームワークもオープン系は未使用で自作フレームワークみたいの作って使ってる

デザインも今のところ最低限でスマホ対応のためレスポンシブだけ付けてる

信用と言っても自分の名前や住所はフッターのところから付けても良いけど
それだけで人来るかねw
0698nobodyさん2016/10/05(水) 11:42:18.37ID:???
すまん年齢層制限目的はFacebookとかで上司や親世代と友達になって
くだらないことが発言しにくくなることを防ぐためね
0699nobodyさん2016/10/05(水) 12:59:36.12ID:???
agearea.comでtwitter検索してもほぼ君のtweetのみ
しかも、SNSとは無関係のゴミtweetしかない
何がやりたいんだか
0700nobodyさん2016/10/05(水) 13:57:54.17ID:???
2chは匿名求めてるユーザー多いのに、メールアドレス登録めんどくさいし、
フェイスブックやらLineやら既にあるのに、
自分の年齢に近い人しか友達になれないっていう欠点なのか特徴なのかしらんが
それだけのためにわざわざ新しい怪しげなSNSに・・
まぁ、人は全く来ないと予想。
0701nobodyさん2016/10/05(水) 14:13:17.07ID:???
アカウント登録してログインしてみたけど、ひどいわこれ
ゼロ年代前半臭はんぱない
0702nobodyさん2016/10/05(水) 16:54:41.97ID:???
>>697
CSSライブラリくらい使えよ
ページ開いてみたら、ショボすぎてびっくりしたぞ
0703nobodyさん2016/10/05(水) 17:22:02.60ID:???
デザインさえマシになれば使ってもいいみたいな流れ、なんなの?
0704nobodyさん2016/10/05(水) 18:23:35.07ID:???
どこにそんな流れが
0705nobodyさん2016/10/05(水) 19:08:22.16ID:???
様々なご意見ありがとうございますw
まずデザインは最低限のしかやってない。
一応レスポンシブだからいいやって感じで機能開発に時間使ってました。
今後余裕ができればCSSフレームワーク等の使用を検討したり色々考えます

機能的にも最低限のものしかまだ入ってない
投稿に対する返信機能はすでにできるんだがまだ実装してない
他にもいいね!機能や通知機能も入れたい

まずFacebookはやってる奴いればわかると思うけど上司やら親世代と繋がるとかなり発言しにくくなる
Lineとの差は同じ学校だったりした人とも繋がれるのが異なる点

んでAgeareaでは学校を入力する項目があるんだけど文字が同一でないと一致して友達を探す時に上位に表示させられない
これは滅茶苦茶大きな欠点なんだがこいつを解消するためには日本全国の学校名を取得してDBに入れて選択表示させる必要がある
これはそのうちやりたいが手間がかかるのでまだ出来てない

とまぁ色々欠点はまだまだあるんですが上司世代と繋がらずに同世代と繋がれる可能性があるという特徴があります
0706nobodyさん2016/10/05(水) 19:11:17.23ID:???
>>701
ゼロ年代後半くらいまでは行ってないかな?w
前半はスマホなかったからレスポンシブなかったし
00年代後半から10年代前半くらいにはなってると思うんだけどw
0707nobodyさん2016/10/05(水) 20:04:55.20ID:???
>>696
高望みして技術に詳しく将来にわたって自社を引っ張れるような中途人材を求めた結果
足切りしまくってるのが現状なんでは
ようはなかなか採用が決まらずずっと採用情報に残ってるパターン
スタートアップの大量採用(といっても数人〜十数人)を過ぎたPHP扱う零細・小企業にはよくあること
0708nobodyさん2016/10/05(水) 20:11:39.73ID:???
>プログラマー、SE、ハッカーの方このサイトに脆弱性ありますかね?
>一応考えられるところは全部潰してあると思うのですが。
>もし見つけた方はメッセージか問い合わせから教えて頂けると助かります。 よろしくお願いします。

>超キャンペーン開始します!
> 10月7日までに新規登録者が100名(国内の匿名でない正規登録者)を超えた場合
>抽選で1名の方に1000円分のJCBギフト商品券を贈呈します。
>登録利用は無料なので是非ご登録と利用をお願いします!

引き返せないほど人集まったら脆弱性を1000万で売ろう
0709nobodyさん2016/10/06(木) 00:23:05.51ID:???
いつからWebサービス相談スレになったんだ?
0710nobodyさん2016/10/06(木) 06:23:25.11ID:???
いいじゃん。過疎ってるんだし
0711nobodyさん2016/10/06(木) 09:05:40.38ID:???
皆なんかPHPで作った作品ないの?
どうせ過疎なんだからそういうの披露しようぜ
0712nobodyさん2016/10/06(木) 10:40:45.19ID:???
ポータルサイトやコミュニティサイト見ると、(大手以外)ほぼPHPなんだが、
遅いだの初心者向けだの言われる割には利用されてるよな
0713nobodyさん2016/10/06(木) 11:05:35.65ID:???
書き方をちゃんとすれば別に玄人向けになるからな
初心者向けと言われるのは滅茶苦茶な書き方をしてもそれなりに動くからそう言われるだけで玄人のような書き方も可能
スピードに関してはPHP7になってから他の速いと言われる言語にも引けを取らなくなった
だから書きやすくて生産性高い言語だし広く利用されるのは当然と言えば当然
0714nobodyさん2016/10/06(木) 16:04:59.75ID:???
PHP7ってそんなに早いのか。
まだPHP5.3使いなんで勉強しないといけないなぁ
0715nobodyさん2016/10/06(木) 19:47:39.59ID:???
まぁどの言語でもベタ書きすれば酷いしモダンに書けばいいんだけどね
後はRailsみたいにフレームワークとかその周辺が整備されてれば言語自体の差は大した問題じゃない

PHPはCとかPerlから殆ど何も考えずそのまま移行出来る分入口に集まりやすいんだろう
何も考えてないのも多いからそのまま入口に溜まりやすいのもだけど
0716nobodyさん2016/10/06(木) 21:57:30.66ID:???
>714
まったく同じソースでも動作環境がPHP7になるだけで早くなるよ。
ソースコードにも新しい書き方が生まれているけど、それよりも変数を内部的にどんなメモリ構造で保持するかとかの改良がメインだから。
0717nobodyさん2016/10/06(木) 23:11:42.96ID:???
まだメインストリームが5だから
本格的に7のコードで書くのはまだ2・3年先の話だろうな
0718nobodyさん2016/10/07(金) 00:42:58.67ID:ppFqxqEL
7のコードって言っても書き方はほぼ同じだよ
phpは昔クラスとかなかったしhtml内にも書けるからコードが汚くなる
とか変数の型指定しないから変な挙動することがあるとかそういうことだろう
それらの大半は今は解決されている
0719nobodyさん2016/10/07(金) 01:07:10.34ID:???
>>718
> html内にも書けるからコードが汚くなる
正しいが解決されてないし絶対解決されない

タイプヒンティングはinvariantじゃなくてcovariantならなぁ
0720nobodyさん2016/10/07(金) 01:44:03.91ID:???
>>719
htmlに書くことは出来るけどほぼ書かないで綺麗に書くことも出来るじゃん
つまり玄人向けの書き方も出来るということ
0721nobodyさん2016/10/07(金) 04:55:45.68ID:???
というか、HTMLに書ける事が普及に繋がったんじゃないか?
最初、Perl勉強してた時、HTMLの出力にめんどくささを感じたが、
PHPを知って一気に分かりやすくなり、結果的にプログラミング出来るようになったぞ。
0722nobodyさん2016/10/07(金) 06:02:19.39ID:???
>>721
混在は可能だがするべきではない
正直HTMLに混在させられるという解説は最初にすべきじゃないと思ってる

PHPが普及した理由は文法がCやPerlに, RubyやPythonよりかなり近いことに拠っていると思うね
0723nobodyさん2016/10/07(金) 06:34:20.07ID:???
>>722
以下のようなソースでも駄目なのか?

<ul>
<?php foreach ($list as $data): ?>
<li><a href="<?php echo $data['url']?>"><?php echo $data['title']?></a></li>
<?php endforeach; ?>
</ul>

ま、DBに登録したデータを出力するよくあるパターンだわな。
このHTML部分(ul、li、a)をPHP側で書いて出力すると
ビュー用のHTMLに「混雑していない」事になるかもしれないけど、
ソースは読みづらいし、デザインとロジックの分離の観点からも難しくなると思うぞ
0724nobodyさん2016/10/07(金) 06:39:00.96ID:???
>PHPが普及した理由は文法がCやPerlに, RubyやPythonよりかなり近いことに拠っていると思うね

それおかしくね?CやPerlやRubyやPython知らないと駄目じゃん。
それらの技術者が「PHPの方が簡単でわかりやすいからPHP使おう!」とはならないだろ。
0725nobodyさん2016/10/07(金) 10:12:32.50ID:???
>>723
宗教的理由で忌避するのは個人では構わないけどそうでないなら素直にテンプレートエンジン使っとけ
あとそのコードも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から始めた場合には言及してない
0726nobodyさん2016/10/07(金) 10:16:47.63ID:???
>>725
short_tag使うのはどうもな〜
0727nobodyさん2016/10/07(金) 10:21:38.40ID:???
テンプレートエンジン(例えばSmarty)使うのと、
PHPをHTMLに書くのと何が違うのかまるで分からん。
どっちも”プログラム的な何か”をHTMLに挿入するじゃん。
なのに「すべきでない」理由にならないと思うんだが
0728nobodyさん2016/10/07(金) 10:26:03.21ID:???
>>727
テンプレートエンジンとして使うにはPHPは高機能過ぎる
見えてよいもの以外は見えるべきではないし, 使ってよいもの以外は使えるべきでない
カプセル化の大原則だと思うのだけれど
0729nobodyさん2016/10/07(金) 10:31:04.71ID:???
>>727
PHPそのものが優秀なテンプレートエンジンだからね
フレームワークも必要最小限なものだけしか使ってない
0730nobodyさん2016/10/07(金) 10:31:59.83ID:???
>>726
もうshort_tag扱いじゃないし・・・・
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:???
>>730
俺、昔の癖でショートタグ使ってないんだが、
php.ini変えなくてもPHP5.4から標準になったのね・・・
0734nobodyさん2016/10/07(金) 10:47:08.04ID:???
あ、でもXML使う場合に問題があるし、やっぱショートタグよくなくね?
0735nobodyさん2016/10/07(金) 11:03:28.19ID:???
>>734
何でマニュアル読まずにそんなこと言っちゃえるの?
0736nobodyさん2016/10/07(金) 11:14:25.56ID:???
勉強不足だから言えちゃいました。ごめんなさい。
0737nobodyさん2016/10/07(金) 12:24:34.06ID:???
このサイトPHP7に変えました。超高速になったけどバグありますか?おそらくバグは出ないと思うのですが…
https://agearea.com/
0738nobodyさん2016/10/07(金) 12:33:01.32ID:???
html内に書けることが出来るのが問題って
それはテンプレートをdisってんのかね?
0739nobodyさん2016/10/08(土) 00:16:20.30ID:???
Twigを内包しているSymfonyだって、テンプレートをTwigではなくPHPで書くってこともできるもんね。
絶対の正解っていうのは存在しないさ。
ただしそれでもSymfony公式はTwigの使用を推奨していて、その一番の理由は、キャッシュしてHTTPアクセス時の処理不可を軽減できるからだね。
Smartyもそうだし、テンプレートエンジンと呼ばれてるものは大抵、ナマの言語で書いて毎回パースするよりは高速化できるキャッシュ機能をそなえているよ。
0740nobodyさん2016/10/08(土) 01:15:37.18ID:???
個人的にはテンプレートエンジンのライブラリを薦める一番の理由は初心者が書いてもXSS防止しやすい、だなー
0741nobodyさん2016/10/08(土) 02:00:06.91ID:???
簡単なテンプレートエンジンならさくっと書けるし
その辺のテンプレートエンジンはなんか大げさなんだよなあ
0742nobodyさん2016/10/08(土) 02:40:57.69ID:???
PHP実行結果のキャッシュって、
shell_exec("php {$phpfile}")で取る?
それともcurlとかでlocalhost http経由で取る?
前者だと環境依存が強くなるから、どちらかというと確実な後者のほうがよさそう?
0743nobodyさん2016/10/08(土) 11:38:47.90ID:???
サイト作るとJavascriptのalert実行させようとするの多いなw
こんな程度の対策してないサイトがたくさんあるの?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:???
DBにデータを入れる時にエスケープとかちょっと勘弁・・
0748nobodyさん2016/10/08(土) 14:11:23.10ID:???
>>747
PDOでプレースホルダも使ってるけど
念には念を入れてだよ
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:???
なんでもくそもないだろ。XSSになるぐらいならその方がマシだって話だ。

>そのシステムでHTMLを使って表示しないAndroidやiOSのアプリを開発しなければいけなくなったら、

そんなケースあるか?
常に「こうだったら」「あーだったら」ってお前のように心配事繰り返すなら、
そもそも最初からやればリスクは減るよねってことだ
0755nobodyさん2016/10/08(土) 15:06:38.25ID:???
それぐらいの簡単な責務の分離もできないくせに、どんなクソシステム量産してるんだよww
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:???
>>755
クソなシステムは正しく動かなかったり、穴だらけのシステムのことで、
「ちゃんと動かす処理」をどうしようが勝手じゃねーか?妙に神経質なやつがいるな
0759nobodyさん2016/10/08(土) 15:23:33.68ID:???
>>756
まともなテストしてねぇだけじゃんかよ。それww
XSSやSQLインジェクションになる部分なんて明らかなんだからしっかりテストとコードレビューするしかないんだって。


>「対策していると”思ってた”」「出来ている”つもり”だった」ってのがあるだろ。
その通り、だから、仮にデータベースにエスケープしてデータ入れるとしても、
「しっかりデータベースをエスケープして入れてると"思ってた”」になっちゃうんだよ。
だから、そんな事よりしっかりテストとコードレビューするしかないんだってww
0760nobodyさん2016/10/08(土) 15:49:06.96ID:???
smartyのコードきたねえ
0761nobodyさん2016/10/08(土) 15:56:07.39ID:???
>「ちゃんと動かす処理」をどうしようが勝手じゃねーか
これは自分1人でしか開発したことがねぇやつが言う言葉だろ。
0762nobodyさん2016/10/08(土) 17:36:47.26ID:???
久々に盛り上がってるねw
自分がDBに入れる前にエスケープするのはSQLインジェクションを防ぐためと念のためってだけ
人間どこでミスするかわからんし

もちろん表示の時だけエスケープした方が良いってのはその通りだが
結局ちゃんとユーザー側で動いていれば良いしそれが正義だと思ってる
逆にそれで何かあった時の方が怖くないか?
個人情報漏れとかね
0763nobodyさん2016/10/08(土) 19:51:23.91ID:???
SQLインジェクションは使えるなら常にプリペアドステートメントで防ぐべきだ
入力をストレージに保存する際に表示形式に合わせた「変換」を行うとデータの再利用性が失われる
0764nobodyさん2016/10/08(土) 21:31:42.94ID:???
>>763
もちろんその通り防ぐ「べき」
しかし現実にPDOはIN句が使えなかったりして複雑な処理しなきゃいけなかったり、重くなったりする
そういうことを考えると入れる時にエスケープしておくのが安全かと自分は考えている
そういうリスクを負ってでもデータの再利用性を重視したいという人は表示の時のみエスケープすれば良いんじゃないかな
0765nobodyさん2016/10/08(土) 21:42:28.25ID:???
>そういうことを考えると入れる時にエスケープしておくのが安全
これがそもそも間違ってると思う。

そもそも、何人かちらほらデータベースに入れる「前」にエスケープした方が安全みたいな論調が
あるが、エスケープを「前」にしようが「後」にしようが、人間ミスすることには変わりないし、
最終的には>>759で書いたようにレビューしてテストするしかないのに。

なんで勝手にデータベースに入れる前にエスケープした方が「安全」だと思ってるのか?
「前」だろうが「後」だろうが安全性は変わらん。最終的にはレビューとテストで安全性を担保にするしかないのに。

何を根拠に「前」の方が安全っていってるのか理解しかねる。
0766nobodyさん2016/10/08(土) 21:45:57.17ID:???
>>765
そりゃ入る時は一度しかないけど取り出すのは理論上無限にあるからでしょ
回数考えれば一度と無限じゃ手間が全然違う
0767nobodyさん2016/10/08(土) 21:51:03.04ID:???
それは個別に取り出さなければいいし、取り出し方は普通はまとめるしな。
もちろん、入れるのと取り出すのは取り出す方が多いのは統計的にもそうだろう。
0768nobodyさん2016/10/08(土) 22:04:49.87ID:???
DBに入れる前でもいいだろ、って人は
根本的にエスケープがどういうものかを分かってない。

XSS脆弱性埋め込むよりはマシだろというのは、
ポスターが剥がれるよりいいだろって言いながら4辺をガムテープ貼りする概念だ。

エスケープはターゲットに出力する時、都合が悪い物にだけする。

teratailあたりをずっと眺めてればわかるけど、
二重エスケープでHTMLタグが表示されてることが何度もあった。
エスケープをどのように扱うべきか、ちゃんと分かってない奴が作ってるからそうなるのさ。

見た目なんかどうでもいい、って人はまぁ、たしかにとにかく最初にエスケープしちゃえばいいよ。
メンテナンスする人が君のことを呪うだろうけど。
0769nobodyさん2016/10/08(土) 22:17:21.41ID:???
768だけど、誤解のないように言っておくと

>エスケープはターゲットに出力する時、都合が悪い物にだけする。

これは別に、選択的にエスケープしろ、という意味じゃないよ。
普通のテンプレートエンジンが使っているであろうhtmlspecialchars()というメソッドが、
勝手にどれをエスケープすべきかは判断してくれるので、
グラマとしては「マズいものが有りそうな物を出力する時にだけ」かたっぱしからかけろ、
という意味ね。

>>748のSQLに関するプレースホルダについては
ちゃんとプレースホルダを使っているのであれば、それはエスケープですらない。
クエリをプリペアしてあるので、そこに当てはめる値についてはエスケープする必要がまったくないんだ。
SQLについてエスケープする必要があるのは、全部テキストでSQLを投げる場合。
0770nobodyさん2016/10/08(土) 22:28:21.64ID:???
>>766 名前:nobodyさん :2016/10/08(土) 21:45:57.17 ID:???
>そりゃ入る時は一度しかないけど取り出すのは理論上無限にあるからでしょ
>回数考えれば一度と無限じゃ手間が全然違う

無限に処理をするのは君じゃなくてコンピュータだからね。そんな数を比べても意味ないよ。

君がすることは、出力の時に都合が悪い物をエスケープしてくれる処理を
1つの出力(PHPだとページと等価かな)について1回コードを書くだけ。
それで、メジャーなテンプレートエンジンは、その処理を勝手にやってくれる。
(Smartyがダメなのは、そのエスケープ処理がデフォルトではやらないようになっていること
Twigが優れているのはデフォルトがエスケープ処理をする設定になっていること)

エスケープに要する時間はピリオドの後0が2つの後に数字がくるくらいかな。だから気にしなくていいよ。
0771nobodyさん2016/10/08(土) 22:29:55.02ID:???
特定の文字だけエスケープしてデータベースに入れるんじゃなくて、いっそ全部文字コード表記にして突っ込んじゃえばどうだろうか
安全性は最高だし、特定の関数に依存する変換処理にならないし
0772nobodyさん2016/10/08(土) 22:31:38.53ID:???
たぶんだけど、DBに入れる時にエスケープしちゃう君は、
上の方でずっとあっちのスレと俺を目の敵にしてた君じゃないかな?
君はまだまだダメだ。もうちょっと勉強し、経験を積み、頭を使いなさい。
0773nobodyさん2016/10/08(土) 22:36:55.26ID:???
>>771
それ、特定文字だけエスケープするのと何もかわんないよ、きっと。

DBに突っ込んだ内容をメールで送りますってなったら、
する処理、二つの場合で変わるかい?

DBに突っ込んだ内容を画面に表示しますってなったら、
する処理、二つの場合で変わるかい?
これは変わりそうだね。
なぜなら、文字コード表記を戻してJavaScriptを含んだHTMLが再現され、
見事にXSSが発動するはずだからだ。
そしたら、よけいめんどくさんじゃないかい?
0774nobodyさん2016/10/08(土) 22:49:38.60ID:???
>>764
>しかし現実にPDOはIN句が使えなかったりして複雑な処理しなきゃいけなかったり、重くなったりする

使えないなんてことは絶対にないし、
君が「複雑だ」と感じるのは、単純に君の技術がまだまだ低すぎるから。
たぶん、コードをベタ書きしているレベルってことだろう。
もうちょっと頭を使いなさい。

IN句の重さについては、
DBにもよるが、普通の利用において問題になるほどほど重くなることは通常無い。
気になるとしたら、設計上の問題が大きい。
IN句の中に書く要素数は仕様によって決まるものだからプログラムだけではいかんともしがたい場合もある。

確かに昔のMySQLなんかはIN句がやたら重かったからね。

それから、大抵のDBではSQLの1文に書ける文字数の上限があるので(それでもかなりの文字数はかける)
IN句で表現しようとすると、その文字数を超える場合もでてくる。
そういう意味で、IN句ではなく別の実装にしておこう、というケースはよくある。
0775nobodyさん2016/10/08(土) 22:57:41.06ID:???
> 一般に、マスコミは物事を大袈裟に言いたがる。正しい対策をしていれば普通 に防げる話でも、あたかも「新しい攻撃」であるかのように言いたい*2ため、 間違った対策のことを「一般的に言われている“正しい”対策」と言わざるを 得ないわけだ。

>「入力でサニタイズ」することが大間違いなのだが、そう言ってしまうと、 「一般的に言われている“正しい”対策」と言ったことと矛盾してしまうため、 「サニタイズ自体は誤りでない」ことにして辻褄を合わせようとする。

>その結果、「サニタイズは誤り」という本当のことを書けなくなり、「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:???
>>775=>>776かな?

どこからの引用かわからないけど、その通りだね。
トンデモ解説なテキトーな書籍が沢山出版された事が元凶なんだろう。

誰が言っていたか忘れたけど、
「出来るやつは実行する。出来ないやつが教える」って事なんだろう。
0779nobodyさん2016/10/08(土) 23:11:41.51ID:???
これが、XSS対策用のエスケープとSQLインジェクション用のエスケープを混同シちゃってる証拠のレスね。

>>762 : nobodyさん2016/10/08(土) 17:36:47.26 ID:???
>久々に盛り上がってるねw
>自分がDBに入れる前にエスケープするのはSQLインジェクションを防ぐためと念のためってだけ
>人間どこでミスするかわからんし


君は、

>久々に盛り上がってるねw

こんな余裕をかましている場合じゃないほど、物事をわかっていないんだ。
0780nobodyさん2016/10/08(土) 23:17:32.21ID:???
ま、自分用で不都合ないならごちゃまぜ対策を入力時に全部やって、出力時にもやる二重のご苦労コードでもいいんじゃまいか?
俺は困らないし。
0781nobodyさん2016/10/08(土) 23:18:27.93ID:???
>>774
PDOでIN句は使えないよ
やったことあればわかるしちょっと調べればわかること
0782nobodyさん2016/10/08(土) 23:20:18.37ID:???
>>780
その通り
結局脆弱性対策がきっちりできていてユーザーが使えればどちらをやっても良いということだ
0783nobodyさん2016/10/08(土) 23:23:42.03ID:???
>>774
複雑って程でもないけどそれなりに面倒だよ
IN句をそのまま使えた方が良い
それ以前にIN句をそのまま使えないPDOがクソと言えばクソだが
0784nobodyさん2016/10/08(土) 23:23:42.62ID:???
>>775

ちょっとだけ補足

>「入力でサニタイズ」することが大間違いなのだが

ここだけ、間違いね。

フォームで期待されている値以外を排除するための「入力でのサニタイズ」
つまり、本当の意味でのサニタイズは絶対に必要だよ。

その後に書くプログラムの量と複雑さに関わってくるからね。

まず、仕様で定められている値にサニタイズする。これが鉄則。
これが出来ていないプログラムが実に多すぎるのが残業だらけのクソ業界に繋がっている。

このサニタイズの際には不必要な改行コードやNullバイトも必ず削除しておくこと。
これも、ちゃんとやっているシステムを見たことが無い。

そのせいでphpmyadminの古いバージョンではNullバイト攻撃による任意のPHPコード実行が可能な脆弱性があって、
アホみたいな話だけど、PHPの方でこの脆弱性を修正した。
0785nobodyさん2016/10/08(土) 23:24:50.82ID:???
>>781
現実にやってるか言ってるんだけど、
君がやり方を分からないって可能性を、なぜ排除した?
この短い時間で。
0786nobodyさん2016/10/08(土) 23:26:10.85ID:???
>>781 : nobodyさん2016/10/08(土) 23:18:27.93 ID:???
>やったことあればわかるしちょっと調べればわかること

よし、じゃあ、その調べたソースを見せてみてくれ。
添削してあげるから。

何度も言うけど、君は技術力も知能も低すぎるんだ。
自覚しないと前に進めないよ。
0787nobodyさん2016/10/08(土) 23:27:46.57ID:???
>>783
クソなのは、君の脳

ちょっと、「どうして複雑だと思うか」を分かるように、コード書いて見せてごらん。
教えてあげるから。
0788nobodyさん2016/10/08(土) 23:30:45.67ID:???
>>786
なんでこっちが見せなきゃいけないんだw
自分で仮想サーバーなりなんなりでPDO使ってIN句入れて実行してみれば良いだろw
そのままじゃ動かないから
IN句のやつをorでやればできるけど
0789nobodyさん2016/10/08(土) 23:35:01.48ID:???
>>779
では聞くがDBにエスケープしてデータ入れて困る時って具体的にどんなケースなの?
0790nobodyさん2016/10/08(土) 23:35:02.65ID:???
>>788
>なんでこっちが見せなきゃいけないんだw

上の方読んでもまだわからないの?
君がアホすぎるから、今の君のアホな脳内をみせてくれないと
どこが間違っているのか教えられないよ、ってこと。

「PDOではIN句が使えない」なんて、猿でも言わないよ。
PDOってのはただの抽象化レイヤーでしかないからね。

>自分で仮想サーバーなりなんなりでPDO使ってIN句入れて実行してみれば良いだろw

だから実際に使っているから言っているんだよってさっきも言ったよね。

君さ、毎回毎回草生やしてるけど、そんな余裕ないほど自分がアホの子なんだってそろそろ気付こうよ。
0791nobodyさん2016/10/08(土) 23:38:49.31ID:???
>>789
きみ、アホ君かな?

まず、XSS脆弱性とSQLインジェクション脆弱性の違いを理解しよう。
君が全く理解できていないことは、この文章のバカさ加減を見ればすぐにわかる。

>では聞くがDBにエスケープしてデータ入れて困る時って具体的にどんなケースなの?

答えを書いてあげようか?
DBに「なんらかのエスケープされたデータ」を入れた事「自体」で困ることはない。
だが、その取扱において困るケースは沢山有る。

君は「DBにエスケープしてデータ入れて」と書いたが、
このエスケープとは、何に対するエスケープか?

それを理解しない限り、君は相変わらずネアンデルタール人以下のままだ。
0792nobodyさん2016/10/08(土) 23:39:36.84ID:???
>>790
サルでも言わないんだ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:???
>>791
何に対するエスケープかと言えば主にXSSと次にSQLインジェクションだよ
XSSはポストから不正なコードを埋め込まれる脆弱性でSQLインジェクションは不正なコードによりSQLを実行されることだ
自分1人なら出力時に完全にエスケープできるとしても他の奴がもしやらずに出力したらどうするんだ?
実際に脆弱性突かれてるケースがあるというのに

んでその取扱いにおいて困るケースってのは「具体的」にどんなケースなの?
3つくらいで良いから教えてよ
0794nobodyさん2016/10/08(土) 23:46:26.67ID:???
>>792
君、本当に、どこまでバカなのかな?
どうしてそれを見て「使えない」と思ったの?
ちょっと説明してみてくれる。

君、思ってた以上に頭が悪いようだな。

あと、
>ここでは言ってるけど
この人誰? なんか有名な人なの?

全然知らない人が書いた、意図も分からないペラのページ見て
「PDOではIN句が使えない」と思い込んじゃう君の脳みその構造がよくわかんないな。
0795nobodyさん2016/10/08(土) 23:49:14.53ID:???
>>794
いや実際にPDOでそのままIN句は実行できないわけだが?
可能ならPDOでIN句そのまま使いたいから使える方法教えてくれよw
0796nobodyさん2016/10/08(土) 23:50:51.44ID:???
>>793 : nobodyさん2016/10/08(土) 23:44:44.66 ID:???
>何に対するエスケープかと言えば主にXSSと次にSQLインジェクションだよ

君はさ、その二つが別の物だとわかっているのに、
一つの文章の中で「エスケープはどうする」って語るんだ。

君が頭おかしいところの一つはそこ。

>自分1人なら出力時に完全にエスケープできるとしても
>他の奴がもしやらずに出力したらどうするんだ?

>その取扱いにおいて困るケースってのは「具体的」にどんなケースなの?
>3つくらいで良いから教えてよ


・君一人なら、DBに入っているデータは「ある形式でエスケープされている」とわかるとしても
 他の奴が「その形式でエスケープされている」って事をとくていするにはどうするんだ?

・上の方のteratailの項参照

・上の方のメール送信の項参照

3つだね。これでいいかな?
■ このスレッドは過去ログ倉庫に格納されています