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

【PHP】くだらねぇ質問はここに書き込みやがれpart9

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/09/03(土) 11:53:32ID:7OO4C5e5
PHPに関するくだらない質問用すれです。
ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。
次スレは>>970あたりが建てて下さい

・過去スレ
【PHP】くだらねぇ質問はここに書き込みやがれ
http://pc5.2ch.net/test/read.cgi/php/1099322141/
【PHP】くだらねぇ質問はここに書き込みやがれpart2
http://pc5.2ch.net/test/read.cgi/php/1105218084/
【PHP】くだらねぇ質問はここに書き込みやがれpart3
http://pc5.2ch.net/test/read.cgi/php/1107780435/
【PHP】くだらねぇ質問はここに書き込みやがれpart4
http://pc8.2ch.net/test/read.cgi/php/1110697712/
【PHP】くだらねぇ質問はここに書き込みやがれpart5
http://pc8.2ch.net/test/read.cgi/php/1114787573/
【PHP】くだらねぇ質問はここに書き込みやがれpart6
http://pc8.2ch.net/test/read.cgi/php/1117945031/
【PHP】くだらねぇ質問はここに書き込みやがれpart7
http://pc8.2ch.net/test/read.cgi/php/1121100429/
【PHP】くだらねぇ質問はここに書き込みやがれpart8
http://pc8.2ch.net/test/read.cgi/php/1123431535/
0002nobodyさん2005/09/03(土) 12:51:30ID:???
1乙2ゲト
0003nobodyさん2005/09/03(土) 13:50:11ID:???
レンタルツールを提供するサイトを運営しているのですが、ユーザーが編集したHTMLを元にPHPを作成してオリジナルのデザインを使えるようにしたいと考えています。
作成にあたりセキュリティ面に不安があり、皆様のご意見を聞かせていただけたらと思います。
例えばユーザーが編集したページデザインが

<html><head><head><body>
名前:#namae<br>
タイトル:#title<br>
</body></html>

だったとしてこれを元に

<?php
echo '<html><head><head><body>名前:'.$namae.'<br>タイトル:'.$title.'<br></body></html>';
?>

(↑#namaeを '.$namae.' に#titleを '.$title.' に変換しただけ)

このようなincludeファイルを作って表示された場合に、シングルクウォートの入力を許可するとPHPの関数が実行可能となってしまいますが、
シングルクウォート以外を使って関数の実行は可能でしょうか?デザインの編集はフォームで行います。

ソース中の記号が読みにくいかと思いますがよろしくお願い致します。
0004nobodyさん2005/09/03(土) 14:11:34ID:7K8wd7Ia
よくわからんが
#namaeを
<?php echo $namae; ?>に
置き換えればいいんじゃね?あとは普通のHTML。
000532005/09/03(土) 14:37:13ID:???
説明で下手で申し訳ありません

ユーザーが>>2のようなデザインをフォームから投稿すると
str_replace("#namae","'.\$namae.'")
といったように書き換えて>>2のようなincludeファイルを作成します。
掲示板のPHPは記事データ($namaeや$title)を読みこんだ後で
作成された>>2のincludeファイルを読み込んでincludeされたファイルがデータを表示します

ユーザーが作成するデザインでシングルクウォートが使えると

<html><head><head><body>
名前:#namae<br>';
$fp = ("./bbs.php");
$txt = fread($fp,filesize($file));
echo $txt;
echo '
タイトル:#title<br>
</body></html>

といった感じに書かれてしまうと、自由にPHPを実行されてしまいます。
シングルクウォート以外に禁止したほうがいい文字列なんかありますでしょうか?

わかりづらい文章ですみません。


0006nobodyさん2005/09/03(土) 19:34:03ID:???
まわりくどいことしてるみたいだけど。
#name → $nameという処理を特定のものだけに制限すれば、あとは、HTML内のただの文字にしかならないと思うけど。
0007nobodyさん2005/09/03(土) 20:21:17ID:???
>>5
お前が「レンタルールを提供するサイトを運営している」事が驚きだね。
ついでに言っとくが、この結果はどうなると思う?
$data = "'A';print 'TEST';";
echo $data
000872005/09/03(土) 20:22:22ID:???
あふぅ!なぜコピペしただけのはずなのに「ツ」が抜けてるのだ・・・。
0009nobodyさん2005/09/03(土) 22:03:46ID:???
PHP初心者の便乗質問ですみません。

よくわからんが、
$namaeにPHPコードがあると
echo $namae
でPHPコードが実行されるもんなのか?

includeファイルだからなるの?
includeだとPHPを実行しちゃうの?

じゃincludeしなければいいんだ。
ファイル読み込みとechoでinclude代用
0010nobodyさん2005/09/03(土) 22:08:55ID:???
>>9
まず自分で試されましたか?
質問する前に、自分で試してみましょう。
0011nobodyさん2005/09/03(土) 23:15:45ID:/h7Yu57r
ユーザー定義関数を作るときに、その関数の内部で使用するための関数を以下のように作ったところ、
ひとつのPHPファイルの中で2回以上使用するとredeclareできないというエラーが出てきます。
function hoge($data) {
  function hogege($data) {
    $data .= "-hogege";
return $data;
}
$data = hogege($data);
$data .= "-hoge";
return $data;
}
上記のような関数を2度以上使うとエラーがでました。
これはまずPHPファイル読み込み時にhoge()が宣言され、
内部のhogege()はhoge()が呼び出されるたびに宣言することになるからだと理解したのですが、
対処としてはhogege()をhoge()の外で宣言するしかないのでしょうか?
ある関数について宣言されていなければ宣言する、といったようなことは可能なのでしょうか?
0012112005/09/03(土) 23:39:37ID:???
function_exists関数を使うことで解決しました。
0013nobodyさん2005/09/03(土) 23:40:32ID:6exF3kaw
PHPからシェルスクリプトを動作させるにはどうすればいいでしょうか?
ヒントだけでもキボンヌです
001432005/09/04(日) 00:00:45ID:???
>>6
ご意見ありがとうございます。

7>>
シングルクウォートの入力は許可してないのでそのコード自体書き込めません。
ためしにシングルクウォートのチェックはずして
$data = "'A';print 'TEST';";
echo $data ;
と入れてみましたが parser errorでした。
すべてダブルクウォートにしてもHTMLで出力されるだけでした。

すみません質問の仕方かえます。

$a='かきくけこ';
echo 'あい'.$a.'うえお';
↑これだと$aが展開されると思いますが、''内でシングルクウォートを使わずに$aを展開することは技術的に可能でしょうか?


0015nobodyさん2005/09/04(日) 00:04:02ID:???
>>11
私はそのような内部関数を作ろうと思ったことは無いのですが、
本当にそれが必要なのでしょうか?
OOPの内部クラスとも違いますよね。

展開してしまえば、関数定義も、関数呼び出しも要りません。
function_exists() でテストするコストも減らすことができます。

言語で出来ることをいろいろ試すという目的なら分かるのですが。
0016nobodyさん2005/09/04(日) 00:25:14ID:KQPE/gyz
>>やったことないけど
exec
shell_exec
というなんかできそうなのがあるよ
0017112005/09/04(日) 00:27:47ID:???
オブジェクトは使っておらず、通常のユーザー定義関数です。
定義した関数の中で複数箇所で実行したい処理をその関数内でのみ関数として定義したいのです。
具体的には、フォームで受け取った値を種別にチェックする関数を作っているのですが、
(「年」「月」「日」「ユーザーID」その他DBに設定した項目にあわせてチェック)
その中で、たとえば整数かどうかのチェックを行う関数や、
SQLでIN句に使用する('data1','data2',,,)という文字列を作成する関数を作っています。
「展開してしまえば」というのは、関数で定義もせず、その都度処理を全部記述するということでしょうか?
あまり効率的でないように思えるのですが、どうなんでしょうか?
0018nobodyさん2005/09/04(日) 00:33:18ID:KQPE/gyz
>>14
{}とかは無理?
0019nobodyさん2005/09/04(日) 00:35:02ID:???
自宅鯖管理者です。
現在サーバーの設定ファイルを弄るPHPを作っているのですが、
「権限」の面で非常に困っています。
単純にApache権限では各種設定ファイルへアクセスすることは
できないわけですが、
通常どのような手段を用いるものなのでしょうか?
(PHPというよりはむしろ鯖管理の知識になるのでしょうか?)
0020nobodyさん2005/09/04(日) 00:43:58ID:???
>>17
個人的には、素直に外に出した方が良いと思います。
整数かどうか、というチェックなら頻繁に使われるでしょうし、標準の関数もありますよね。

私は、PHPで内部関数を作ること自体に(見た目的にも)違和感があります。
その関数内でしか使わないような関数であっても、外に出しています。
もちろん個人の好みなのかも知れませんが。
0021112005/09/04(日) 01:20:25ID:???
>>20
中身は整数だけど文字列になってたりするので標準の関数が使えなかったりするんですよ。
他にも多数のPHPファイルにその都度全部一連の処理を繰り返し記述するのは苦痛にしか感じないのですが
そうでない人もいるということなのかな?
まぁ、極力手抜きをしたい、ということなんですけどね。
0022nobodyさん2005/09/04(日) 01:27:16ID:???
この様子では
PHPでは匿名内部クラスも実装することができないのだろうか。
メソッド内クラスも。
0023nobodyさん2005/09/04(日) 01:28:12ID:???
>>19
グループ権限を使ってみれば?
0024nobodyさん2005/09/04(日) 01:30:23ID:???
>>17
だったら、

function func1(){
 function func2(){
 }
}

とせず
ただ
function func1(){
}

function func2(){
}

と分けるだけでいいんでない?

オブジェクト指向を使えば
もっと便利なこともできるけど。
■ このスレッドは過去ログ倉庫に格納されています