【PHP】質問スレッドpart19【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/07/16 07:12ID:KvHeypq/・新規質問の方は上げてください。age進行でお願いします。
・質問する際には環境も明記。
・正しい日本語で分かりやすく。
・レスがつかないからって逆切れする厨お断り。
・解決しなくてもこたえてもらったら礼を。
■本家
http://www.php.net/
■日本 PHP ユーザ会
http://www.php.gr.jp/
■PHP マニュアル
http://www.php.net/manual/ja/
■PEAR マニュアル
http://pear.php.net/manual/ja/
過去スレ, 関連スレ等>>2-4
抜けているものがあったら補足願います
0166139
04/07/20 19:56ID:???サンクス!
default_charset = "Shift_JIS" が抜けてたらしい
php.ini
default_charset = "Shift_JIS"
extension_dir = "extensionsのある場所"
extension=php_mbstring.dll
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;
;mbstring.func_overload = 0
これでSJISもEUCも、使えるようになったが
↑以外の設定だとSJISで書いたプログラム側が文字化けしたことを報告する
つまり >108 のいう「例 3. SJISユーザ用のphp.iniの設定」では文字化け発生
追加として鯖システムはUNHTTPD。Apacheは他の奴報告してくれ
0167nobodyさん
04/07/20 20:18ID:???PEARのHTML_QuickFormを使えば再帰的にstripslashesしてくれて便利。
サニタイズはPEAR DBのquoteSmart使えばOK.
(数値型のデータなら事前にintval/floatvalしとく
HTML_QuickFormのaddRuleと組み合わせるとなおよし)
0168nobodyさん
04/07/20 20:30ID:???それでやられちゃうのか
全然知らん買ったよ
sql文を防ぐってdelete select insert updateぐらいをフォームデータに入ってるかチェックでいい?
0169nobodyさん
04/07/20 20:37ID:???0170nobodyさん
04/07/20 20:38ID:???まずdeleteできちゃう。もう1レコードなんてもんじゃない。テーブルごと。
何しろ無制限。スゲェ!なんか制限とかないの。
しかも他のテーブルも消せちゃう。ヤバイよ、真っ白だよ。
だって普通は削除できないじゃん。だって削除されたら困るじゃん。
データ消えたら困るっしょ。
だからそのCGIはロールバックできる。話のわかるヤツだ。
けど普通のCGIはヤバイ。そんなの気にしない。消えるだけ。
とにかく貴様ら、SQLインジェクションのヤバさをもっと知るべきだと思います。
そんなヤバい仕事をしてる貴様らとか超偉い。もっとがんばれ、超がんばれ。
0173nobodyさん
04/07/20 20:44ID:???>>169 ぜんぜんだめ
MySQLならmysql_real_escape_stringした文字列をさらに'(シングルクォート)で囲む。
(PHP4.3.0未満はmysql_escape_string, PostgreSQLはpg_escape_string)
DB_common::quoteSmartは型を考慮してそこらへんを自動でやってくれる。
0175nobodyさん
04/07/20 20:55ID:???ごめん、説明の仕方が悪かった。quoteSmartは静的呼び出し無理ぽ。
PEARのDBクラスを使うときは
$db = &DB::connect($dsn);
$num = (int) $num; // 整数型のデータの場合
$str = $db->quoteSmart($str); // 文字列型のデータの場合
$sql = "SELECT * FROM hoge WHERE foo = $num AND bar = $str;';
$db->query($sql);
こんな感じでやります。詳しくはPEARマニュアル。
テーブル名やカラム名をquoteIdentifierするのが望ましいけど長くなるので省略。
0177nobodyさん
04/07/20 21:21ID:???0178nobodyさん
04/07/20 21:22ID:???そもそも本家(php.net)で配布しているWindows用バイナリは
「mbstring.internal_encoding = SJIS」
に対応してないことは知ってるんだろうな…
http://jp2.php.net/mbstring
「PHPで動作しない文字エンコーディング:JIS, SJIS」
スクリプトの記述エンコーディングにSJISを使うのなら
自分でビルド時にちゃんと「--enable-zend-multibyte」指定しないと駄目。
そうやってビルドしたWindows用バイナリは廣川さんが公開してくれている。
RPM等のバイナリも通常は「--enable-zend-multibyte」な指定はしないから、
ちゃんと確認して使用すること。
0179nobodyさん
04/07/20 21:30ID:???その場合、許可する文字列を列挙して
$regex=hoge|moge;
if ( isset($_GET['sort']) && ereg($regex,$_GET['sort']) $sort=$_GET['sort'];
としてるんですが、これで十分ですよね?
0180nobodyさん
04/07/20 21:33ID:???DB_DataObject(を継承したクラス)を使えばもっと楽で、
型のキャストとか文字列のエスケープとかを気にしなくてよくなります。
マジおすすめ。
ひとつのクエリにひとつDB_DataObject(を継承したクラス)のインスタンスをつくって使います。
厳密にはそこまでしなくていいかもしれないけど、そうした方がハマらないと思う。
DB接続はグローバル変数に登録して使い回すので大丈夫。
>>177
文字列は''で囲むもんだから。
0182nobodyさん
04/07/20 21:44ID:???DBにおいてはWHERE dat='$dat'としておけば$datに「;」が含まれていても
問題が起きにくいという事ですね
PHP5で遊んでいる環境なのでPEARも使えないですし、脆弱性についても
知識不足で穴だらけだったので大変勉強になりますm(_)m
0183166
04/07/20 21:49ID:???無論それを読んで、きちんと仕様通り試して文字化け発生して泡食って
最新からある程度古いのまでのWin用package及びinstallerを入れて、試した上で
日本語メーリングを検索かけて対応策が出てこなくて
こっちに辿り着いているのだが
それでも一つ見落としている辺り節穴だけどさ
ソースをビルドする技術が無いんじゃ使うのは無理ってことだよな?
0184nobodyさん
04/07/20 21:56ID:???ダメだよ。
$datが data';delete from table;...
というように、'が入っていると...
' をエスケープしないと意味無い。
0185nobodyさん
04/07/20 22:03ID:???あ、言葉足らずですいません^^;
私はINSERT INTO table SET でしか使わないので、こんな感じで
処理しようと考えているのですが大丈夫でしょうか?
function sql_esc_set($name,$var){
return $name."='".mysql_real_escape_string($var)."'";
}
0186nobodyさん
04/07/20 22:17ID:???もし$datに'や\等の特種文字が入っていたら、問題が起こるので
必ず $dat = mysql_real_escape($dat); しておかないとだめ。
...と書いてたら>>184,185の流れが...
$name に MySQLの予約語(tableとかcreateとか色々)を使うことがあるなら
return "`" . $name . "`='" . mysql_real_escape_string($var) . "'";
だけど、その予定がないならそれでOK.
#PHP5でもPEARのメジャーなクラスは対応しているし、数は少ないけどPHP5専用のクラスもあります。
0187185
04/07/20 22:18ID:???Formからのからのデータを全てhtmlspecialcharsとaddslashesとし、
SQLへはdat='$dat'とすれば良いのですよね?
0188nobodyさん
04/07/20 22:23ID:???IPA ISEC セキュア・プログラミング講座
http://www.ipa.go.jp/security/awareness/vendor/programming/index.html
0189nobodyさん
04/07/20 22:29ID:???0190nobodyさん
04/07/20 22:30ID:???それに必要な関数は全部 PHP に揃ってる。
QF とか便利だが、何故・どうしてを理解しないまま道具に頼って終わりってのは違うと思う。
で質問なんですが、
$db->query(,"SELECT * FROM hore WHERE id = {$_GET['id']}");
とかやってたとして、具体的に被害出せます?
例えば '";DELETE FROM hoge; とか突っ込んでも大抵の DB だと無効なクエリになるのでは、、
0192nobodyさん
04/07/20 23:08ID:???実行するよ。実際やってみれ。
要は$db->query("SELECT * FROM table;DELETE FROM table");
で後ろのDELETE文を実行してしまうかどうかだが、実行する。
すべて有効になりますね。drop databaseなんて打たれたらどうします?
全部アボーンっすよ((;゚Д゚)ガクガクブルブル
0194nobodyさん
04/07/20 23:23ID:???0195nobodyさん
04/07/20 23:27ID:???0196190
04/07/20 23:53ID:???やってみた。
index.php?gid=50001;DELETE%20FROM%20groups;
で、生成されたクエリが
SELECT * FROM groups WHERE gid = 50001;DELETE FROM groups;
実行結果は
DB Error: syntax error
index.php
--
$db = DB::connect($dsn);
$query = "SELECT * FROM groups WHERE gid = {$_GET['gid']}";
$rs =& $db->query($query);
while ($result = $rs->fetchRow())
{
print "<pre>"; print_r($result); print "</pre><hr>";
}
print "done";
('A`
0197190
04/07/21 00:05ID:???おや、DBによって挙動が異なるのかな?
以前検証したときは、pgsqlでPearDBじゃなくてpg_queryだったんだけど、
確かに後ろ側も実行してましたよ。
0198nobodyさん
04/07/21 01:38ID:???めっちゃファイルサイズ大きくて、全部読み込むの大変。
0200nobodyさん
04/07/21 01:58ID:???delete from groupsでは構文がおかしくないか?
0201198
04/07/21 02:11ID:???ありがとん。
0202190
04/07/21 02:28ID:???mysql だす。
MSSQL とか、初期設定で複数のクエリを通すので危険とか昔聞いたような聞いてないような。
>>200
普通に DELETE FROM groups で SQL 発行したら groups デーブルがきれいに空になりますた。
昔、ボルチモアテクノロジーのサイトが脆弱性吐いてた時に発見者の某 ML の中の人が
具体的な exploit コードを晒していたから何かあると思ったんだけど、、
結局、複数のクエリの実行を許していない時は、具体的な攻撃方法は今は無いって事で FA ?
データベース方面は必要最低限しかしらないもので、、頼り切りですまそ。
0203nobodyさん
04/07/21 02:46ID:???あんまりファイルのサイズが大きいとサーバー側に(「RLimitCPU」(CPU占有時間制限)で)
CGIプログラムの暴走と見なされることがあるのではないかと心配してるんですが、
実際の所どうなのか、分かる方おりますか?
0204nobodyさん
04/07/21 03:40ID:/GR6B3Fppreg_replace_callback('/>([0-9]+)/','trans',$str);
function trans($str) {
//for($i=0;$i<count($str);$i++)
//{
$str[0]=$str[0];
//$str[$i]="<a href="'right.php'" name=$text[$i]>".$str[$i]."</a>";
//}
return $str;
}
実際にはfunction内のコメントアウト部とそうでない部分を入れ替えて使いたいのですがこの状態ですら機能しません。
エラーメッセージは
preg_replace_callback("/>([0-9]+)/","trans",$str); function trans($str[$i]) { //for($i=0;$i".$str[$i].""; //} return $str; }
Fatal error: Call to undefined function: trans() in right.php on line 184
right.phpの184は
$text[$i]=trans($text[$i]);
以上のとおりです。preg_replace_callbackの設定に問題がるのでしょうか?
0205nobodyさん
04/07/21 04:05ID:/GR6B3Fp<?php
preg_replace_callback('/>([0-9]+)/','henkan',$str);
function henkan($str)
{
for($i=0;$i<count($str);$i++){
$str[$i]="<a href='http://'>'.$str[$i].'</a>";
}
return $str;
}
?>
$text[$i]=henkan(text[$i]);
$twext[$i] に >1 と入れた場合のhenkan(text[$i]) は <1 と不等号の向きが変わってしまいアンカーもつきませんでした。
0206nobodyさん
04/07/21 04:40ID:???1. マニュアル(ttp://jp.php.net/manual/ja/function.preg-replace-callback.php)をよく読む。
2. マニュアルのサンプルコードを改造してやってみる。(一から書かない!)
3. それでもダメならもう一度ここに来る。
0207nobodyさん
04/07/21 05:10ID:/GR6B3Fpありがとうございました。
解決いたしました。
何でああいう思い込みをしていたのか自分でも想像がつきません。
おそらくどこかのサンプルページを真似て書いたつもりだったのでしょうが、お恥ずかしい限りです。
済みませんでした。
0208nobodyさん
04/07/21 09:18ID:???0209nobodyさん
04/07/21 09:26ID:???0210nobodyさん
04/07/21 09:36ID:???オッス!昨日からの書き込み
http://pc5.2ch.net/test/read.cgi/php/1089929550/131-209
0212nobodyさん
04/07/21 09:42ID:???function b($val){
echo $val;
}
}
$obj = new a;
$obj->b('test');
ではなく、もっと短くfunction bを呼び出す方法はないでしょうか?
0213nobodyさん
04/07/21 09:57ID:???0214nobodyさん
04/07/21 10:01ID:???ここを見ていたのですが、$str='a7'でも半角英数字
だと判断されてしまします。
本当に半角英数字のみを判定する場合は
'^[0-9]+$'で良いのでしょうか?
if ( ereg("[0-9]+", $str) ) {
echo "半角数字のみ!";
} else {
echo "不正なデータ(値なしも含みます)";
}
0216nobodyさん
04/07/21 10:05ID:???てか、半角「英数字」を判定したいのか半角「数字」のみを判定したいのか
よく分からんのだが。とりあえず「^」と「$」をつけなされ。
0217nobodyさん
04/07/21 10:06ID:???phpかperlで、mallocを実現することは出来ないでしょうか
0219214
04/07/21 10:15ID:???半角数字だけであれば、'^[0-9]+$'で良いのですね。
0220nobodyさん
04/07/21 10:28ID:???こんなのでも ereg は TRUE だったりするし。
ereg("^[0-9]+$", "1\0test");
0222nobodyさん
04/07/21 12:38ID:???readfile()を使いたいって事は、ダウンロード先を教えたくなかったり、ロックしたりとかしたいということ?
ダウンロードする回数にもよるけど、かなりのCPU使用率になるよ。(一瞬だけど)
連続してダウンロードされると、サーバによっては止められる可能性も高い。
一回、自分のPCで試してみな。
0223nobodyさん
04/07/21 12:40ID:???今、SQLiteを使ったスクリプトを書いていてふと思った・・・
0224nobodyさん
04/07/21 12:44ID:???0225nobodyさん
04/07/21 12:44ID:???俺の使ってるphp+mysqlな参考書は
htmlspecialchars()しか触れてないぞう。
・・勉強してきます。。
0226nobodyさん
04/07/21 12:49ID:???とりあえず>>188のサイトをよく読んで
「サニタイズ」「SQLインジェクション」「クロスサイトスクリプティング」辺りでぐぐってみ
0228nobodyさん
04/07/21 13:11ID:???あっ入力チェックはきちんと行うとして、、
0229nobodyさん
04/07/21 13:13ID:???SQL発行時はバインド
この2つしかやってません
0230nobodyさん
04/07/21 14:08ID:???crypt使ってですよね?
0231nobodyさん
04/07/21 14:30ID:???cryptとか使ってないです
0232nobodyさん
04/07/21 14:49ID:???0233nobodyさん
04/07/21 15:17ID:???教えてください
0234nobodyさん
04/07/21 15:18ID:/GR6B3Fpfor($i=100;$i>=0;$i--)
{
require_once("res.inc");
$text[$i]=preg_replace_callback(
"|>([0-9]+)|",
"henkan",
$text[$i]);
print($text[$i]);
}
rec.inc の中身
<?php
function henkan($matches)
{
return "<a href=#$matches[1]><P title=$text[$i]>>".$matches[1]."</P></a>".($matches[2]);
}
?>
イメージ的にはこのように レス番号文字列にカーソルを合わせるとそのレス内容が表示され、
かつクリックするとそのリンクへ飛ぶという形にしたいのですが res.incないで$text[$i]が取得できません
文頭にrequire_once("right.php");としても結果は変わりませんでした。どのようにすればright.php内の
$text[$i]が取得できますか?ご教授くださいお願いします。
0236nobodyさん
04/07/21 15:47ID:???aタグの中にpタグを包含していいのか?
どうせなら aタグにtitleを書きゃいいじゃないか。
そんで、その程度ならpreg_replaceで十分だろ。
0237nobodyさん
04/07/21 15:49ID:???Pear
http://pc5.2ch.net/test/read.cgi/php/985665522/
0238nobodyさん
04/07/21 15:49ID:???0239nobodyさん
04/07/21 16:42ID:???md5が手軽でいいかと
0241nobodyさん
04/07/21 17:10ID:???HTTPヘッダのステータスをPHPのスクリプト内部から設定したいんだけど
どうしたらよろしいのでしょうか?具体的には、STATUSを500に設定したいのですけど。
header()関数あたりになにか入れればいいのでしょうか?
0243nobodyさん
04/07/21 17:37ID:???含まれるみたいなのですが、これはPHP4の時からそうなっていた
のでしょうか?
今まで気づかなかっただけか・・・^^;。
0245nobodyさん
04/07/21 18:37ID:???0247nobodyさん
04/07/21 18:51ID:???ttp://jp.php.net/manual/ja/security.php
0248nobodyさん
04/07/21 18:55ID:???PHP4でも含まれていたはずだけど、今まで無かったのなら↓これの所為では?
ttp://jp.php.net/manual/ja/ini.sect.data-handling.php#ini.variables-order
0249nobodyさん
04/07/21 18:57ID:???つか去年はどうして出れたんですか?
0250nobodyさん
04/07/21 19:02ID:???Part2 : http://pc.2ch.net/php/kako/1003/10032/1003283567.html
Part3 : http://pc.2ch.net/php/kako/1013/10139/1013919792.html
Part4 : http://pc.2ch.net/php/kako/1022/10229/1022999539.html
Part5 : http://pc.2ch.net/php/kako/1031/10317/1031721334.html
Part6 : http://pc5.2ch.net/php/kako/1038/10389/1038988518.html
Part7 : http://pc5.2ch.net/php/kako/1044/10444/1044478561.html
Part8 : http://pc5.2ch.net/php/kako/1050/10502/1050249148.html
Part9 : http://pc5.2ch.net/php/kako/1057/10579/1057947512.html
Part10: http://pc5.2ch.net/php/kako/1064/10641/1064104114.html
part11: http://pc5.2ch.net/php/kako/1067/10676/1067635640.html
part12: http://pc5.2ch.net/test/read.cgi/php/1070639208/
part13: http://pc5.2ch.net/test/read.cgi/php/1073291978/
part14: http://pc5.2ch.net/test/read.cgi/php/1076163015/
part15: http://pc5.2ch.net/test/read.cgi/php/1078592587/
part16: http://pc5.2ch.net/test/read.cgi/php/1081267619/
part17: http://pc5.2ch.net/test/read.cgi/php/1084781699/
0252nobodyさん
04/07/21 20:29ID:???0253nobodyさん
04/07/21 20:57ID:???0255nobodyさん
04/07/22 02:00ID:???0256nobodyさん
04/07/22 02:03ID:???header("Content-Type:text/plain");
$str1 = "http://end.com/マルチバイト";
$str2 = "マルチバイトhttp://end.com/";
if( mb_ereg("^マルチバイト",$str1) ){
print("\$str1 Hit : ^マルチバイト\n");
}
if( mb_ereg("^マルチバイト",$str2) ){
print("\$str2 Hit : ^マルチバイト\n");
}
?>
/* output
$str2 Hit : ^マルチバイト
*/
0257203
04/07/22 02:29ID:???遅れましたがとんくすです。
試しにレンタルしてる鯖でこっそり試してみたら小さいファイルだったら大丈夫そうですが、
RLimitCPUなんかよりもreadfileしたファイルがサイズ制限みたいなのを受けて落ちてきませんでした。
いろんな設定があるもんだなと思いました(自分apacheの設定深くはしらんので…)。
汎用性のあるものを作りたいので諦めました。また他の方法考えてみます。ありがとでした。
0258nobodyさん
04/07/22 03:07ID:???ttp://www5a.biglobe.ne.jp/~inano/jancode.html
というのは見つけたのですが、45/49で始まるもの以外も使うので
汎用的に使うにはちょっと難しい感じです。
どこかに転がっていないでしょうか?
0259nobodyさん
04/07/22 04:33ID:???<?
include("var.php");
include("format.php");
?>
とすればうまく表示できるんですけど
var.phpの方がいろいろ増えてvar-tarou.php、var-hanako.php、var-hiroyuki.php
みたいになった時、そのファイル名をテキストファイルvar.txtに1行ごと書いて
<?
$data = file ("var.txt");
for ($i=0;$i<3;$i++) {
include("$data[$i]");
include("format.php");
}
?>
とやったら
0260nobodyさん
04/07/22 04:36ID:???途中で送ってしまった・・・
それでこれでは間違ってるようなのですがどうすれば
var.txtに書いたファイル名を1行目から表示していけるか誰か教えてください。
あ、データベースは使えません。
0262nobodyさん
04/07/22 04:56ID:???0263234
04/07/22 05:19ID:O8WfHKX6$string = $text[$i];
$pattern = "|>([0-9]+)|";
$replacement = "<a href=#\${1} title=$text[\${1}]>>\${1}</a>";
print preg_replace($pattern, $replacement, $string);
前と同じような段階までは進むのですが title=$text[\${1}] やはり同じくこの部分で引っかかってしまいます。
エラーメッセージは
Parse error: parse error, unexpected T_CHARACTER, expecting T_STRING or T_VARIABLE or T_NUM_STRING
$textないをクオーテーション等でくくってみてもうまくいかず、アドバイスいただけたらと思います。
0264ちなみに
04/07/22 05:27ID:O8WfHKX6title=$text[10] 等書いてもその部分はコメントが出されません。
$text[10]には当然値は入っているのですが・・・
0265nobodyさん
04/07/22 06:16ID:???preg_replace_callbackを使って、コールバック関数内でglobal $text, $i;を宣言すればいい。
(元のfor文がグローバルスコープにあるのが前提だけど)
クラスを使えば変数のスコープに悩まされずに済む。
・・・それ以前にa要素のtitle属性に全文をぶち込もうという蛮勇のほうが問題と思うが。
しかもstrip_tagsもhtmlspecialcharsもかけずに。
ポップアップさせたいのならCSSとJavaScriptで対応した方がいいよ。
p2のソースとか参考にしる。
■ このスレッドは過去ログ倉庫に格納されています