2015年03月08日


allow_url_fopen と allow_url_include

allow_url_fopen は、デフォルトで有効ですが、allow_url_include はそうではありません
名前デフォルト変更可能変更履歴
allow_url_fopen"1"PHP_INI_SYSTEMPHP <= 4.3.4 では PHP_INI_ALL。
PHP 4.0.4 から利用可能です。
allow_url_include"0"PHP_INI_SYSTEMPHP 5.2.0 から利用可能です。
何れも、セキュリティ上の理由により、アプリケーションからは変更できませんが、allow_url_fopen が有効であれば、allow_url_include が無効でも代替方法があります。
function inc( $path ) {
// *******************************
// 配列にセット
// *******************************
	$inc = @file( $path );
// *******************************
// 最初と最後の行を削除
// *******************************
	array_shift($inc);
	array_pop($inc);
// *******************************
// 配列をテキストに戻す
// *******************************
	$GLOBALS['inc_eval_txt'] = implode( "", $inc );
// *******************************
// テキストを実行する
// *******************************
	eval($GLOBALS['inc_eval_txt']);
}

まず、ファイルを配列にセットして、最初と最後の行を取り除きます( <?php と ?> の削除 ) 
※ うまくいくように、ファイルの記述方法を定める必要があります。
( その前提ならば、ただのテキストファイルにするといいです )
※ ファイルの拡張子は、テキストの内容がサーバによって加工されないものを使います。

テストしてみると解りますが、include を使った場合でも、http 経由で読み込むテキストの拡張子は、php であってはいけません。( .php では サーバがソースコードを返す事が無いからです )

その後、テキストに戻してからグローバル変数に代入して eval して内容を実行します。

eval は危険な処理ですが、それはユーザーから受け取ったデータを対象にする場合です。ここでの処理は、本来allow_url_include によって利用可能な信頼できる文字列が対象です。
http://winofsql.jp/php/test/print.txt
<?php
inc("http://winofsql.jp/php/test/print.txt");

allow_url_inc();

print "<pre>";

$arr = get_defined_functions();
print_r( $arr["user"] );

print "</pre>";

function inc( $path ) {
// *******************************
// 配列にセット
// *******************************
	$inc = @file( $path );
// *******************************
// 最初と最後の行を削除
// *******************************
	array_shift($inc);
	array_pop($inc);
// *******************************
// 配列をテキストに戻す
// *******************************
	$GLOBALS['inc_eval_txt'] = implode( "", $inc );
// *******************************
// テキストを実行する
// *******************************
	eval($GLOBALS['inc_eval_txt']);
}


?>



タグ:PHP
posted by at 2015-03-08 16:01 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2010年11月15日


PHP : OpenID テストキット 完全版


PHP 5.3.x で出るエラーに対処
Deprecated: Assigning the return value of new by reference is deprecated in
という警告が出るのは、PHP: PHP 5.3.x で推奨されない機能 - Manual のせいですが、サンプル
ではほとんど使っていなかったので =& を = に変更しました。
この記述はライブラリのオリジナルサンプルにあったもので、現在でもあります。
意味は、new での戻り値は元々参照扱いなので =& を使ってはいけないというよ
うな事だと思いますが、過去のリソースを使う場合そんな事は言ってられないの
で、本来なら php.ini に、
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
と書いて対処します
ログイン後、Google ではメールアドレスを取得
Google のドキュメント(英文)にある仕様Attribute exchange extension
を使って取得しています。( ライブラリでは、Auth/OpenID/AX.php を使います )
ログイン後、Yahoo では表示名を取得
Yahoo は、プロフィールで設定された公開情報を取得できますが、個人の設定に
かなり依存するので実用に使えるかどうかはあまり保証されないと思います。
( Yahoo! JAPANが対応しているOpenID拡張仕様 )
http://axschema.org/namePerson/friendly を使う事によって、mixi でもニック
ネームが取得できるようになったのですが、mixi が対応している事を表記した
資料は以下です。
仕様 << mixi Developer Center (ミクシィ デベロッパーセンター)
※ mixi は以前より Attribute exchange extension 無しでニックネームを取得しています ( openid.sreg.nickname ) 一覧 : Schema for OpenID Attribute Exchange | Attribute Types WEB 上でのログインテスト


Google でログイン

Yahoo でログイン
index.php
<?
session_start();
header( "Content-Type: text/html; Charset=shift_jis" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

if ( $_GET['logout'] != "" ) {
	$_SESSION['id'] = "";
	$_SESSION['nickname'] = "";
	$_SESSION['email'] = "";
	$_SESSION['dispname'] = "";
}

if ( $_SESSION['id'] == "" ) {
	// エラーメッセージを表示
	ini_set( 'display_errors', "1" );
	
	// ログインされていないので、ログインページを表示
	require_once( 'login_view.php' );


	exit();
}

?>
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=shift_jis" />
<TITLE>ようこそ</TITLE>
<STYLE type="text/css">
* {
	font-size: 30px;
}
</STYLE>
<SCRIPT language="javascript" type="text/javascript">

</SCRIPT>
</HEAD>
<BODY>

<?
	if ( $_SESSION['nickname'] != '' ) {
		print "ようこそ {$_SESSION['nickname']} さん<br>";
	}
	if ( $_SESSION['email'] != '' ) {
		print "email : {$_SESSION['email']}<br>";
	}
	if ( $_SESSION['dispname'] != '' ) {
		print "表示名 : {$_SESSION['dispname']}<br>";
	}

?>
<br><br>
ID: <?= $_SESSION['id'] ?>

<FORM>
<INPUT type=submit name=logout value="ログアウト">
</FORM>
</BODY>
</HTML>

必要なもの :OpenID テストキット完全版

設置手順 1)

http://www.janrain.com/openid-enabled
上記の URL からライブラリをダウンロードして、openid2/Auth/OpenID.php と
なるように配置します。

[openid_sample]
    common.php
    その他のファイル
[openid2]
    [Auth]
        [OpenID]
        [Yadis]
        OpenID.php

設置手順 2)

Auth/Yadis/ParanoidHTTPFetcher.php を以下のように変更します
( 2箇所ある、curl_exec($c); の直前に以下を記述 )

if ($this->isHTTPS($url)) {
    curl_setopt($c, CURLOPT_CAINFO, $GLOBALS['openid_pem']);
}
これは、設置手順 4) でダウンロードしたファイルの実装方法ですが、
common.php の先頭で定義している変数を使っています。
そもそも、これをする意味は、mixi の デベロッパーセンター
で書かれている、SSL の接続に失敗する事への対処です。PHP では
curl を使って 通信するのですが、その際に証明書の最新が必要だと
いう事が、mixi で書かれています。その対処方法が、cacert.pem の
ダウンロードと実装なのです。
設置手順 3) OpenID.php のログ処理を以下のように書き換えます static function log($format_string) { $args = func_get_args(); $message = call_user_func_array('sprintf', $args); // error_log($message); if ( $GLOBALS['logfile'] != "" ) { error_log("$message\n", 3, $GLOBALS['logfile']); } }
error_log は、環境によっては単に print されてしまいますし、ログに
出力するにしてもデバッグに使え無いと意味無いので common.php の先頭
で定義した変数の中にファイル名が入っている時だけ出力するようにして
います。

※ OpenID のライブラリでは、エラーでなくても、または実際には問題無く
※ ても出力されるメッセージがあります。
設置手順 4) http://curl.haxx.se/docs/caextract.html から、cacert.pem をダウンロード して、openid_sample フォルダ内に置きます。 設置手順 5) (windowsのみ) windows では、php.ini の extension=php_curl.dll と extension=php_openssl.dll を有効にします ソースコード 共通部品 : common.php 開始コード( index.php ) ログインされていない時に表示される画面 OpenID を使用したログイン処理 OpenID 呼び出し時に使用された HTML コード 戻ってきた情報を受け取る 関連するページ PHP OpenID 認証 実行サンプル
posted by at 2010-11-15 06:31 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2010年08月25日


TCPDF用 MSフォント定義ファイル

この定義ファイルでは、PCにインストールされている MS フォント を参照
するだけです。( PDFに埋め込む事はありません )

ブラウザでダウンロード
TCPDF 用 MSフォント定義ファイルです。

msgothic.php
msgothicp.php
msgothicui.php
msmincho.php
msminchop.php

VBScript : TCPDFで MSフォントが使えるようにする全自動スクリプト
http://winofsql.jp/VA003334/sh_web100627131120.htm

上記ページからダウンロード可能なスクリプトで作成したものです。

TCPDF をダウンロードして解凍し、tcpdf\fonts ディレクトリに
コピーして使用して下さい。

同梱の msfont_test.php を 使って出力テストが可能です。
( 出力したものが msfont_test.pdf です )
関連する記事

VBScript : TCPDF 用埋め込みフォント作成( 日本語フリーフォント )
VBScript : TCPDFで MSフォントが使えるようにする全自動スクリプト


posted by at 2010-08-25 07:51 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2009年08月11日


WEB上のテキストをJavaScriptのdocument.write 用の文字列に変換してページに埋め込む : js.php

あまりに短いコードなので、フリーソフトとか言うほどの事も無いのですが、
自分の経験からしてこれはとても便利なはずです。

現在 http://winofsql.jp/js.php として自由にお使いいただけます。
※ 対象となるテキストは utf-8n である必要があります
<?
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
header( "Content-Type: text/javascript; Charset=utf-8" );

mb_language( "ja" );
mb_internal_encoding("UTF-8");

foreach( $_GET as $Key => $Value ) {
	$_POST[$Key] = $_GET[$Key];
}
foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}

$pgv = "str";

$Text = file_get_contents( $_POST['url'] );
$Text = str_replace("\n"," \\n",$Text);
$array_data = explode( " ", $Text );
$Text = "var $pgv=\"\";\n";
$str = "$pgv+=\"";
foreach($array_data as $key => $value) {
	$wrk = str_replace("\"","\\\"",$value);
	$wrk = str_replace("\n","\\n",$wrk);
	$wrk = str_replace(chr(0x0d),"",$wrk);
	$str .= $wrk . " ";
}
$Text .= $str . '";' . "\n";
$Text = str_replace("\\n","\\n\";\n$pgv+=\"",$Text);

print $Text;
print "document.write($pgv);\n";

?>

http://winofsql.jp/text.txt というテキストファイルがあり、
その中は以下のようになっています
<iframe
	frameborder="no"
	scrolling="no"
	width="650"
	height="450"
	src="http://winofsql.jp/ggv_pano_view.php?w=600&h=400&id=http%3A%2F%2Fwinofsql.jp%2Fggtest.txt"
></iframe>

上記テキストをこのページに埋め込むのに js.php を使用します
<script
	charset="utf-8"
	type="text/javascript"
	src="http://winofsql.jp/js.php?url=http%3A%2F%2Fwinofsql.jp%2Ftest.txt"></script>

↓結果です
タグ:javascript
posted by at 2009-08-11 00:45 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする

2009年06月15日


DIRECTORY_SEPARATOR等 : OSによって内容が変化する定数

一般的にWEBと言えば、unix でしようが、Windows サーバーも無い
わけではありませんし、業務的に言えば社内サーバーは Microsoft で
ある事は十分考えられますし、どちらでも稼動できるようにしておくのは、
やはり職人としては必要な事ではあります。
( 商品じゃ無い急いでるやっつけ仕事の場合は面倒なのでしませんが )

最も使う可能性の高そうなのは、PATH_SEPARATOR を使って set_include_path
を実行する事かもしれません。

以前、コードでこんなふうに書いた事もありました
$sep = substr( strtoupper( php_uname("s") ), 0, 7 ) == 'WINDOWS' ? ";" : ":";
set_include_path( ".$sep../pear/zip" );


unixwindows
DIRECTORY_SEPARATOR /\
PHP_SHLIB_SUFFIX sodll
PATH_SEPARATOR :;
(コロン)セミコロン
■ 関連する PHP ドキュメント
php_uname
set_include_path


posted by at 2009-06-15 00:08 | Comment(0) | PHP | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します