【PHP】下らねぇ質問はここに書き込みやがれ 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/04/01(日) 04:21:50ID:VGqlLhlDPHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 41
http://pc11.2ch.net/test/read.cgi/php/1173163186/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ http://pc10.2ch.net/php/subback.html
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで http://pc10.2ch.net/db/subback.html
0719nobodyさん
2007/04/09(月) 13:23:34ID:VhSqsDLrIPアドレス:ポート番号で接続を試行して、応答が返ってきたらtrueを返す。
みたいな都合のいい関数ありませんでしょうか?
0720nobodyさん
2007/04/09(月) 13:31:52ID:???PHP5ならstream_socket_clientで一発
4ならphp socket ping あたりでググレ。ping系スクリプトが転がってる。
0721nobodyさん
2007/04/09(月) 13:48:05ID:VhSqsDLrpingが通らなかったので、pingを使わない方法を探していましたが、
これでいけるようです!どうもありがとうございました。
0724nobodyさん
2007/04/09(月) 14:10:56ID:???PHPなんかだと組み込みの高機能な関数が多すぎる。
0725nobodyさん
2007/04/09(月) 14:11:29ID:???0726nobodyさん
2007/04/09(月) 14:24:21ID:kaHzWtZFレスサンクスです。
試してみたけどやっぱりダメだた・・・。
状況としてはこれにかなり近い感じ。
[PHP-users 30825] Pear DBでのエラー
http://ml.php.gr.jp/pipermail/php-users/2006-November/031342.html
0727nobodyさん
2007/04/09(月) 14:33:36ID:W+dKCXXHhtmlに出力するときはhtmlspecialcharsで対象となる文字のみ対策しておけばXXS対策になるんでしょうか?
0729nobodyさん
2007/04/09(月) 14:57:00ID:kaHzWtZFSmarty以外も読めんですorz
ファイルの種類というよりもむしろ、ディレクトリの場所によって読めるか読めないかみたいな感じで、
カレントディレクトリとかドキュメントルート以下(/var/www/html/〜〜)の中にあるファイルなら普通に読めるんですけど、
/usr/〜〜とかそれ以外の場所になるとパスが通ってても読めない状況です。
0731nobodyさん
2007/04/09(月) 15:05:50ID:???クライアントからの入力データだと思うもの全てをhtmlspecialcharsに突っ込んでも安全とは限らない。
本質的にXSSはプログラマがクライアントからの入力全てに気を配らないと起こり得る。
環境変数もどれが任意でどれがそうでないかを全て把握してる人はそういない。
よって、HTML出力を必要としない部分全てをhtmlspecialcharsに突っ込むのが安全。
尤も、タグの属性値なんかに突っ込むならそれでも不十分。そんな設計は見直すべきだが。
0732nobodyさん
2007/04/09(月) 15:09:03ID:kaHzWtZFセーフモードっていうのがよくわかってないんですが、
php.iniを見てみたら
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
みたいになってます。
0734nobodyさん
2007/04/09(月) 15:28:35ID:kaHzWtZFああああああああああああああ!
# getenforce
Permissive
鬱すぎるorz
0736nobodyさん
2007/04/09(月) 15:51:53ID:kaHzWtZFseLinuxは無効になってたっぽいです。
もうほんとなにが悪いんだか・・・。
0737nobodyさん
2007/04/09(月) 16:34:56ID:R/Jf3MPV最近よく私が管理しているWikiにスパムが飛んできて困っているのですが、
$_POST['msg']に入っている本文から英字だけ抜き出す場合どうすればいいのでしょうか。
それを使って英字の文字数によりスパム弾きをしたいと思っているのですが…
0738nobodyさん
2007/04/09(月) 16:37:16ID:???0739nobodyさん
2007/04/09(月) 16:39:28ID:R/Jf3MPVeregを使うという所までは思いついたものの、
ループ処理で文字を次々ヒットさせる際の処理が思い浮かばず…
0740nobodyさん
2007/04/09(月) 16:41:23ID:???ふぬああああああああああああああああああ
[a-z]
}
うんこ。
0741nobodyさん
2007/04/09(月) 16:48:59ID:???答える方も質問してる方も時間の節約になる
エスパーが登場すればこの限りではないが
0742nobodyさん
2007/04/09(月) 16:54:25ID:???0743nobodyさん
2007/04/09(月) 17:03:39ID:???0744nobodyさん
2007/04/09(月) 17:13:48ID:???で、あえて聞くけど
require_once(フルパス);
もエラーになるの?
あるいは
echo file_exsists(フルパス);
はtrue返るの?
0745nobodyさん
2007/04/09(月) 17:15:02ID:???0746nobodyさん
2007/04/09(月) 17:16:23ID:R/Jf3MPV有難う御座います。
参考にしながらこんなのを組んでみました…
$msg = $_POST['msg'];
$eng_num = 0;
$i = 0;
//コメントスパム対策
while($i<=strlen($msg)) {
$i++;
$num = substr($msg,$i,1);
if (ereg('[a-zA-Z0-9]',$num)) { $eng_num++; }
}
if (strlen($eng_num)>50) { die; }
…が正しく実行されないのは置いといて、
大体こんな感じでいいのでしょうか。
0747nobodyさん
2007/04/09(月) 17:26:22ID:???$msg = $_POST['msg'];
$eng_num = 0;
$i = 0;
while( $char = ord($msg[$i++])) !=0) {
if (ereg('[a-zA-Z0-9]',$char)) { $eng_num++;}
if($eng_num > 50 ) {die('invalid post');}
}
0749nobodyさん
2007/04/09(月) 17:33:38ID:R/Jf3MPV有り難う御座います!
バイト後にやってみます。
0750nobodyさん
2007/04/09(月) 17:34:07ID:???0751nobodyさん
2007/04/09(月) 17:54:18ID:???無駄なものってなんですか?
preg_match_all('/\w/',$_POST,$c);
if (count($c[0]) > 50) die();
で問題が出る?
0752nobodyさん
2007/04/09(月) 20:35:33ID:???0753nobodyさん
2007/04/09(月) 20:43:57ID:???spycに添付されていたspyc.ymlで比較してみたんだけど、違うようです。
あと、syckは解析できなかった時に、"unknown type"を返しますよね?
なんじゃこりゃ?
0754nobodyさん
2007/04/09(月) 20:50:38ID:W+dKCXXH$sqlのなかにフィールド名とテーブル名が入った変数を入れると動きません。
$sqlの中に変数ではなくて、フィールド名とテーブル名を直接書けば正常に動きました。
フィールド名とテーブル名を変数に格納して、$sqlにまぜたいのですが
うまくいきません。
以下、問題となるコードを抜粋しました。
$field_name = "id, name";
$table = "table1";
$sql = "SELECT $field_name FROM $table_name ORDER BY id";
$res = mysql_query($sql,$con) or die("データを抽出できません");
PHP4.4.6とMySQL4.1を使用してます。
どなたかご教授お願いいたします。
0756nobodyさん
2007/04/09(月) 20:59:38ID:???$table = "table1";
$sql = "SELECT $field_name FROM $table_name ORDER BY id";
$table_nameなのか$tableなのか
0757nobodyさん
2007/04/09(月) 21:16:25ID:???タイム計測したらechoの方が二倍近く速かったんだが
0758nobodyさん
2007/04/09(月) 21:26:31ID:???変数を"でくくるのはこれで合ってますか?
$sql = "SELECT \"$field_name\" FROM \"$table_name\" ORDER BY id"
試してみましたが動きませんでした。
>>755
すいません、$tableは$table_nameの打ち間違えです。
echo で$sqlを出力したらでてきた内容です。
SELECT id,name, FROM table1 ORDER BY id
変数の中身を直接書くと動くので、SQL文自体には間違いはないと思ってますが
何か勘違いしている部分等ございましたらご指摘ください。
0759nobodyさん
2007/04/09(月) 21:29:13ID:Hw87SVIBphp -f test.php
とコマンドラインから呼び出したのですが何も表示されません。
何故でしょうか?
test.php
<?
print "aaaaaaaaa";
?>
0760nobodyさん
2007/04/09(月) 21:30:30ID:???SELECT id,name, FROM
の抽出するフィールドリストの最後にカンマついてちゃだめ
てかmysql_error使え
0762nobodyさん
2007/04/09(月) 21:54:49ID:LuOmRtTQ------------------------------------------------------
$_POST['name1'] = htmlspecialchars($_POST['name1']); //1回目だけ特殊記号変換
echo $_POST['name1'];
echo $_POST['name2'];
$form = "<form action=\"${_SERVER['PHP_SELF']}\" method=\"POST\">
<input type=text name=name1>
<input type=hidden name=name2 value=\"${_POST['name1']}\">
<input type=submit value=\"go\">
</form>
";
echo $form;
------------------------------------------------------
一度受け取った$_POST の中身をhtmlspecialchars で&gt; に変換して
もう一度送っているだけなんだが。
(俺の頭の中では)$_POST['name2']の中身は&gt; 変換済みになっているわけだが、
二回目を受け取ったら(もう一度送ったら)、自動的に元に戻っちゃうわけ?
助言をお願いします。
0763nobodyさん
2007/04/09(月) 22:03:07ID:???意味不明
>$_POST['name2']の中身は&gt; 変換済みになっているわけだが、
意味不明
>二回目を受け取ったら(もう一度送ったら)、自動的に元に戻っちゃうわけ?
意味不明
返れ
0764nobodyさん
2007/04/09(月) 22:03:45ID:???$fromとかわけわかんないんだけどさ
0765nobodyさん
2007/04/09(月) 22:03:49ID:???Cookieに値は入れないが概念的にそうとも言える。
>>759
エラーも表示されないってことなら、同じファイル名の別のtest.phpだったとか。
>>762
変換というよりエスケープ。
$form = "<form action=\"${_SERVER
ここで「"」を「\"」にエスケープしてるけど、HTMLでは元に戻ってるでしょ?
0766nobodyさん
2007/04/09(月) 22:06:48ID:???まあ誰もがハマる道かもしれんな
元に戻るんじゃなく、送信されるhiddenの値が
HTMLエスケープされていない文字列ってだけだ
0769762
2007/04/09(月) 22:17:16ID:LuOmRtTQごめん、あれだ、マジでこんがらがっている
かりに<img>を入れると<img>に変換されて
<input type=hidden name=name2 value="<img>">
上のソースになるわけだけど、
これをそのまま送るとなんで<img>になっちゃんだ?
0770nobodyさん
2007/04/09(月) 22:22:09ID:6Xdj6yAC普通に考えて<一回目>は
&lt;img&gt;
になってるだろ
0772499
2007/04/09(月) 22:24:02ID:???なんか検索して一見目にここから最新のfixもってってちょって書いてあったんで落としてビルドしたけどやっぱいり同じエラーで止まったっす
英語読めてないだけかもしれませんが
0773762
2007/04/09(月) 22:24:26ID:LuOmRtTQ<input type=hidden name=name2 value="&lt;img&gt;">
0775nobodyさん
2007/04/09(月) 22:27:20ID:AitdzCc4質問の内容がまじで意味不明だが
ページを開くと一度だけプログラムが実行され
実行終了後には変数が全て空っぽになる(一部例外は除く
0777nobodyさん
2007/04/09(月) 22:33:49ID:AitdzCc4$post = $_POST;
"SELECT * FROM test WHERE id='$post'"
より
"SELECT * FROM test WHERE id='"+$post+"'"
のほうがいいんですかね?
$postの値が「' 適当なSQL文'」だったらまずいですよね
もしその場合は下記の方も同じ動作なのでしょうか?
0778nobodyさん
2007/04/09(月) 22:38:10ID:???0779nobodyさん
2007/04/09(月) 22:41:03ID:???そんなこと気にするくらいなら
適当なDBインターフェースを利用して
プレースフォルダを使えばいい
pear::DB の場合
$params = array($post);
$sql = "SELECT * FROM test WHEAR id=?";
$ret = $conn->query($sql, $params);
0780nobodyさん
2007/04/09(月) 22:44:42ID:???+演算子じゃインジェクションの前にとんでもないことになるけど。
クォートするかPDOStatement->bindValue()でも使おうぜ…。
0781nobodyさん
2007/04/09(月) 22:45:45ID:???「セッションを使うためにsidをcookieに持たせる」ってのはデフォルトの挙動であって
use_trans_sidとかでGETで送らせてやればCookie使えなくてもセッション自体は使えるよ
>>769
ソースに書かれた文字列の評価ってプロセスがあるんだよ
何らかの文字列を > そのものとして扱えないと > を入れる方法がないでしょ?
0784nobodyさん
2007/04/09(月) 23:53:47ID:R/Jf3MPV完璧でした。どうもありがとう御座いました!
0785nobodyさん
2007/04/09(月) 23:59:00ID:???やりたいことはクッキーの削除とDB(トランザクションの処理はしています)への書き込みで、重複登録を防ぐ為にクッキーが無ければDBへ書き込まないようにしています。
普通に処理をするPGへ遷移する場合はクッキーも削除され、DBへ1件書き込まれるだけですが、F5を連打するとDBに1件書き込まれますがクッキーが消えません。。
また、処理の最後で$_COOKIEにarrayを入れるとクッキーとDBが削除及び登録されたりされなかったりします。
あと、setcookieで削除する所で戻り値がとれるまでループさせてやると、連打した数だけDBに登録されてしまいます。クッキーは削除されています。
何かヒントみたいなもの頂けると嬉しいです。。
お手数お掛しますがよろしくお願い致します。
0786785
2007/04/10(火) 00:01:49ID:???環境はPHP4.3.0 apache2 windowsXPです。
よろしくお願い致します。。
0787nobodyさん
2007/04/10(火) 00:53:06ID:LOxXZREL切る部分にURLやらメールアドレスやら携帯絵文字が入らないようにして、
2バイト文字の区切りで切れるようにして、
なんてやってると正規表現やら条件分岐使いまくりなんだけど
他でもそういう風にやってるのかな?高々文区切るだけで
もう規定数の文字数で問答無用にぶった切ってもいいような気がしてきた
0788nobodyさん
2007/04/10(火) 01:28:44ID:???>もう規定数の文字数で問答無用にぶった切ってもいいような気がしてきた
なんでこうしないの?
見た目で考えても 「>>続きを見る」 の方が視認性高いじゃん
0789nobodyさん
2007/04/10(火) 01:46:43ID:???エロゲスレに誤爆した
確かマルチバイト系の関数で指定文字で切ってくれる関数があったぞ
よく覚えてないけど省略するときの文字も指定できたはず
0790nobodyさん
2007/04/10(火) 01:51:40ID:???foreachでまわしてたので自動的にカンマがついてたのに気づきませんでした。
現在は問題なく動きます。ありがとうございます。
0792nobodyさん
2007/04/10(火) 02:18:52ID:???重複登録を防ぎたいなら、INSERTで失敗させるようにするとか、トランザクション使うとかすればいい。
setcookieでクッキーを削除したつもりでも、ブラウザがそのレスポンスを受け取るまでは何度でもクッキー送ってくるよ。
クッキーは排他処理とかに使える道具じゃない。
0793nobodyさん
2007/04/10(火) 02:26:58ID:4NI9RXKe?
0795nobodyさん
2007/04/10(火) 04:07:44ID:???0797nobodyさん
2007/04/10(火) 08:40:15ID:???>>789
mb_strimwidth だね。(誰かこの関数名の単語の区切りを教えて)
でもメールアドレスの途中で切らないとかそういった機能はないから
たとえば「split系関数で切りたい文字列と切りたくない文字列が交互に並ぶ配列にして
ループで順に連結して規定バイト数を超えたかどうか見つつ
添え字 % 2 の戻り値でmb_strimwidth をかけるかどうか判断する」といったロジックが必要。
0798nobodyさん
2007/04/10(火) 08:46:43ID:???こういう場合は、
if(処理終了) {header("Location:....");}でOK。
強制的に飛ばす(リダイレクトする)のがいい。
0799nobodyさん
2007/04/10(火) 08:56:56ID:???>mb_strimwidth だね。(誰かこの関数名の単語の区切りを教えて)
エス トリム ウィドゥス かな?
で本題
mb_strimwidth(接続文字空)でいったん切ってから、正規表現で末尾の連続する半角英数記号を削除
で どう?
0800nobodyさん
2007/04/10(火) 08:58:02ID:???そんなに厳密じゃなくてもいいわけでしょ?
「ひらがながあれば、ある範囲で切る」だけを唯一の区切り条件にすればいいじゃん。
漢文サイトじゃないだろうから。
0803nobodyさん
2007/04/10(火) 10:00:04ID:???--with-imapにソースを解凍してmakeしたディレクトリ指定したらコンパイルまで通りました
パスが違うのかコピーするファイルが足りないのか?
0804nobodyさん
2007/04/10(火) 10:33:14ID:Y95uap3IPearDBクラスを、自分が作ったクラスの中で使うとき、
extendsするのか、ただ単に使う場所でinclude_once('DB.php')すればいいのか
わかりません。
どちらにすればいいのでしょうか?
0805nobodyさん
2007/04/10(火) 10:58:06ID:???0806nobodyさん
2007/04/10(火) 11:06:49ID:Y95uap3I0807nobodyさん
2007/04/10(火) 11:34:59ID:???0808虚弱PHP
2007/04/10(火) 11:35:34ID:???用途によるとしか…。
>>805は言葉は悪いけど正論だと思うなぁ。
オブジェクト指向はJavaでやるのが一番だと思う。
いや、SmalltalkとかRubyの方がいいのかもしれんけど、
俺はまともにやったことないからわからん。
0809nobodyさん
2007/04/10(火) 11:35:59ID:???0810虚弱PHP
2007/04/10(火) 11:40:23ID:???なんか根本的に間違っている気がする。
synchronizedってスレッドの処理だから今回のような件だと関係ないし。
俺だったら、CookieのかわりにSession変数使う。
0811虚弱PHP
2007/04/10(火) 11:45:46ID:???DBによってエスケープ方法が違うけど、
mysqlのネイティブ関数としてはmysql_real_escape_stringとかがある。
PDOならプリペアドステートメント使えば解決。
0812nobodyさん
2007/04/10(火) 12:05:49ID:???エスケープしとくべきですか?
0813nobodyさん
2007/04/10(火) 12:22:30ID:FUjP3ASn0814nobodyさん
2007/04/10(火) 12:27:36ID:FUjP3ASn0815虚弱PHP
2007/04/10(火) 12:59:06ID:???"決められたUPDATE文"にDBから引っ張ってきた値が入っている場合は、
セカンドオーダーSQLインジェクションが発生する恐れがあるので必ずエスケープ。
平文でコードに直書きしている場合は問題ない…
けれども、人間は間違いをおかすものなので変数は全部エスケープが正解。
0817nobodyさん
2007/04/10(火) 13:04:00ID:???そんなものです
>>814
ないと思う
ただし、右辺値で使う場合は警告がでる
$foo = $this->bar;
とかね
0818nobodyさん
2007/04/10(火) 14:07:55ID:???ttp://labs.cybozu.co.jp/cbl_activerecord/
このO/Rマッピングライブラリを使って、DBから取得してオブジェクトに入れるところまではできたのですが、
取得した値を使いたい場合にいちいち
$var['name'] = $todo->name;
$var['title'] = $todo->title;
と指定するのではなく、まとめて$varの配列に置き換えたいのですが
どうすれば良いのでしょうか?
0819nobodyさん
2007/04/10(火) 14:15:35ID:???何のためのO/Rマッパだよ、、、そのまま使えばといいんじゃないかと
■ このスレッドは過去ログ倉庫に格納されています