SQLの窓

2010年01月27日


JavaScript : 外部呼出しにおける SCRIPT要素の charset 属性

以下のコードは、window オブジェクトtest というプロパティを作成して、その中に show というメソッドを実装します。

show メソッドに書かれた日本語は shift_jis で書かれているので、通常では shift_jis 
以外のページから読み込むとIEではエラーになりますが、charset 属性で正しく指定するとエラーにはなりません
(function () {
	var work = {
		show: function() {
			alert("こんにちは");
		}
	}
	window.test = work;
})();


<script
	type="text/javascript"
	src="http://lightbox.on.coocan.jp/js/charset/sjis.js"
	charset="shift_jis"
></script>





posted by lightbox at 2010-01-27 08:41 | JavaScript | このブログの読者になる | 更新情報をチェックする

2010年01月24日


JavaScript のみでプレビューする時の注意事項

DIV 内に innerHTML でプレビューする場合は、インラインで複雑な JavaScript が書かれているとエラーになる場合があります。ですから、そういう場合も対処したい場合は、IFRAME に対して document.write すると回避されます。

しかし、document.write でも、部分的なスクリプト記述であると、当然エラーになってしまいますので、全体のエラーを以下のようにして抑制します。
<script type="text/javascript">
window.onerror = function (e, url, line) {
	console.log(e+" / "+line+" / "+url);
	return true;
}
// 関数未定義
test();
</script>

この記述を document.write で IFRAME に書き込む為に、全体を文字列化する必要がありますので、こちらで JavaScript ボタンをクリックして変換して下さい
str="";
str+="<"+"script type='text/javascript'> \n";
str+="onerror = function() { \n";
str+="	return true; \n";
str+="} \n";
str+="</"+"script> \n";
str+=" ";

IFRAME に対する document.write は、IFRAME の id を preview とすると以下のようになります
//
//
	var target = document.getElementById("preview").contentWindow.document;
	target.open;

	var str="";
str+="<style type=\"text/css\"> \n";
str+="* { \n";
str+="	font-size:12px; \n";
str+="} \n";
str+="</style> ";
	target.write(str);
str="";
str+="<"+"script type=\"text/javascript\"> \n";
str+="window.onerror = function() { \n";
str+="	return true; \n";
str+="} \n";
str+="</"+"script> ";
	target.write(str);

	target.write(document.getElementById("text").value);
	target.close();




タグ:javascript
posted by lightbox at 2010-01-24 21:24 | JavaScript | このブログの読者になる | 更新情報をチェックする

2010年01月23日


JavaScript : Numberオブジェクトに16進数文字列に変換して指定した長さで前にゼロを付けるメソッドを追加する

JavaScriptの function の引数の扱いと、prototype の使い方のサンプルです

Number.prototype.toHex = function () {
	var n;
	// デフォルトは長さ2で前にゼロ
	if ( arguments.length == 0 ) {
		n = 2;
	}
	// 以外は引数が長さで前にゼロ
	else {
		n = arguments[0]; 
	}
	// 数値を16進数文字列に変換
	var s_hex = this.toString(16);
	// 長さが引数より長い場合は何もしない
	if ( s_hex.length >= n ) {
		return s_hex;
	}
	// 長さが引数より短い場合は0で長さぶんを補完する
	else {
		return ("0000000000" + s_hex).substr(s_hex.length+10-n,n);
	}
}

alert((0).toHex());
alert((255).toHex());
alert((300).toHex(5));



posted by lightbox at 2010-01-23 02:05 | JavaScript オブジェクト | このブログの読者になる | 更新情報をチェックする

2010年01月21日


JavaScript : String オブジェクトの replace メソッドの第二引数に関数を指定する一括置き換え処理

Microsoft の関連ページ
replace メソッド

以下のように変換されます

2010年01月01日 2010年02月01日 2010年03月01日

※ a には、日付文字列全体がセットされます
buff = "2010/01/01 2010/02/01 2010/03/01"

result = buff.replace(
	/(\d+)\/(\d+)\/(\d+)/g,
	function (a, b, c, d) {
		return b + "年" + c + "月" + d + "日"
	}
)

alert(result)



タグ:javascript
posted by lightbox at 2010-01-21 17:53 | JavaScript オブジェクト | このブログの読者になる | 更新情報をチェックする

PHPのマニュアルにある、SQLインジェクション攻撃の例

オリジナルページ
PHP: mysql_real_escape_string - Manual

この例では、パスワードを正しく入力しなくても、ユーザの存在チェックがなされた事になってしまいます。( ※ mysql_fetch_row が行を取得してしまう )

また、この場合はユーザーが一致する必要があるのですが、以下のようにすると、ユーザー名が解らなくでもクエリが
行を返す事になります( 但し全てのユーザを返す複数行になります )

$_POST['username'] = "' OR '' != ''";
$_POST['password'] = "'";

よって、入力値に mysql_real_escape_string を使用する事が必要になります
<?
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );


$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'password';

// 接続解除
$connect = @mysql_connect( $server, $user, $password );
if ( !$connect ) {
	print "接続エラーです";
	exit();
}

// DB選択
mysql_select_db( $dbname, $connect );


// データベース上のユーザに一致するかどうかを調べる
$_POST['username'] = 'lightbox';
$_POST['password'] = "' OR ''='";

$query = <<<QUERY
SELECT * FROM users
	WHERE user = '{$_POST['username']}'
	 AND password = '{$_POST['password']}'
QUERY;

$result = mysql_query($query,$connect);
print_r($result);
print "<pre>";
print_r(mysql_fetch_row($result));
print "</pre>";

?>

但し、入力のキャラクタセットが shift_jis の場合、この関数では、日本語に \ が含まれる文字をエスケープしてしまうので個別に注意が必要です。


また、SQL インジェクションに対する基本的な対処として、

1) DBにスーパーユーザーまたはデータベースの所有者として接続しない

2) 指定された入力が期待するデータ型であることを確認

3) データベースに渡される数値以外のユーザ入力が想定しているキャラクタセットか確認

4) 3) でOKならば mysql_real_escape_string でエスケープ

が上げられます。


関連する記事

PHP+MySQLで、SQLインジェクション対策の為に、一括で mysql_real_escape_string を行う一つの手段


タグ:SQL
posted by lightbox at 2010-01-21 12:11 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

Microsoft Jet SQL に関するMicrosoftの重要なリンク

SQL データ型( 2007 )

Microsoft Jet データベース エンジン SQL と ANSI SQL のデータ型( 2007 )

Microsoft Jet SQL と ANSI SQL との比較( Access 2007 )

 SQLの窓 Build C++ のダウンロード





タグ:MDB Jet SQL
posted by lightbox at 2010-01-21 02:45 | SQLの窓 Build C++ | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり