カテゴリー: プログラム

Google AnalyticsでPDFなどのダウンロード数を解析する方法(非同期トラッキング)

Google Analyticsで、PDFのダウンロード回数や外部ページへのリンクをクリックした数をカウントする方法をご紹介します。

【ここ1年くらいでGoogle Analyticsのタグを入れた人や、これから入れる人はこちら】

最近Google Analyticsのタグを入れた人は、最新の「非同期トラッキング」という方法が使えます。
旧来の方法と比べて機能的にどうよくなったのかはよく分かりませんが、「ちょっと解析までの時間が早くなる」みたいなこと書いてあるサイトもありました。

さて、最近Google Analyticsを入れた人は、埋め込みタグが下記のような感じになってると思います。

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

PDFのダウンロード率などをカウントするためには、上記タグを「<body>タグの直後」に入れてください。
※<body>タグの直後です。閉じタグ(</body>)の直後ではありません。

もしも何らかの理由で「全ページの直後に入れたくない」という場合は、PDFのダウンロード回数や外部ページへのリンククリック数をカウントしたページだけにタグを入れて、そのほかのページは従来とおりの直前に入れておく、ということもできます。

さて、次は実際にカウントを取りたいリンクの設定です。PDFなどのファイルや、通常のリンクのクリック数をカウントするには、カウントしたリンクに下記のように設定してください。

<a href="test.pdf" onClick="_gaq.push(['_trackEvent', 'カテゴリ名', 'アクション名','ラベル名', 値]);" >test.pdf</a>

上記のカテゴリ名、アクション名、ラベル名、値にお好きな名前を入れてください。ラベル名と値はそもそもなくてもOKですが、カテゴリ名とアクション名は必須です。

つまり、カテゴリ名とアクション名だけで事足りる場合は下記のような感じ。

<a href="test.pdf" onClick="_gaq.push(['_trackEvent', 'カテゴリ名', 'アクション名']);" >test.pdf</a>

Web担に書いてあったのだけど、「値」の部分は数値しか設定できないので、文字列はダメらしい。そして、数値なので”は取らないといけないとのこと。

私はWordPressや自作のCMSに上記タグを入れ込んで、ラベルの部分を動的に書き出すようにしてます(記事id_記事のタイトル、みたいな)。
上記の例では<a>タグにonClickで指定していますが、要はonClickが認識できればいいのでFlashの再生ボタンとかでもいけるらしいです。試していませんが。

無事に設定し終わったら何回かクリックしてみてください。しばらくするとGoogle Analytics管理画面の コンテンツ > イベントのトラッキング の中でクリックされた数などを解析できます。上記で設定したカテゴリ別、アクション別・・・などで分けて見れるので便利ですね。

ちなみに反映されるまでの時間ですが、初めて設定した時は1日以上かかったのに、次にタグを増やした時は2時間ほどで反映されました。なのでよくわかりません。

【1年以上前にGoogle Analyticsのタグを入れた人はこちら】

さて、もしあなたが下記のような古いタイプのGoogle Analyticsタグを設置している場合、上記とちょっとやり方が違います。

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>

<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-XXXXXX-X*);
pageTracker._initData();
pageTracker._trackPageview();
</script>

このタグの場合は非同期トラッキングという新しい手法が使えないので、カウントしたいリンクに下記のように設定します。

<a href="test.pdf" onClick="javascript:pageTracker._trackPageview('カテゴリ名', 'アクション名','ラベル名', '値');" >test.pdf<a>

まーこちらは古い方法なので、もしも新しいタグに移行できるならした方がいいと思います。

以上です。

ここで紹介した方法では、Google Analyticsの画面で「イベントトラッキング」で確認できる、と前述しましたが、もしも「通常のコンテンツと同じように「上記のコンテンツ」とかで管理したい」、ということであれば「バーチャルベージビュー」というちょこっとだけタグの違う機能を使います。

まぁ、リンクに貼るタグがちょこっと変わるだけです。こんな感じに.

<a href="test.pdf" onClick="javascript:_gaq.push(['_trackPageview', '/download.html']);" >test.pdf<a>

では。

PHPでMysqlからデータ抽出した値の文字化けを直す方法(さくらインターネットなど)

MysqlからPHPでデータ抽出した値が文字化けする場合の対処法です。

最近はWordPressの普及もありUTF-8が一般的になっていますが、さくらインターネットなどの一部サーバーではまだEUC-JPが使われていたりして、文字化けに頭を悩ますことになります。

Mysqlから抽出したデータが文字化けした場合は、Mysqlと接続するときに下記のように設定してあげれば文字化けしなくなるはずです。

$conn = mysql_connect(データベースのホスト名,アカウント名,パスワード);

mysql_query("SET NAMES utf8",$conn); //ここで文字コードを設定!

mysql_select_db(データベースのホスト名,$conn) or die("データベースがありません");

2行目の「utf8」をあなたの環境の文字コードに変えてください。いま思ったけど、「utf-8」じゃなくていいのかな?ハイフンいらないのかな?
まぁ問題なく化けなくなったからいいけれど。

もしも文字化けで悩んでいたら試してください。

さくらインターネットでCakePHPを使っている場合の文字化けを直す方法

また更新を1ヵ月も止めてしまいました。

飽きっぽいのが悪い癖です。これからはちょっとしたことでもいいから、ちゃんと更新できるようにがんばります。
目指せ1日1記事!

「目指せ」とか言ってる時点で望み薄ですねw

今回はCakePHPです。最近仕事でCakePHPやWordPressを使って情報サイトを作ったので、その辺の更新が増えるかも、です。

ここから本題です。

さくらインターネットのサーバーはMysqlの文字コードがEUC-JPのため、普通にCakePHPを使うと文字化けしてしまいます。
そんな時は、app/config/database.phpの中で下記のように指定してあげれば文字化けが直ります。

’encoding’ => ‘utf8′;

上記の「utf-8」のところはあなたの環境に合わせて変えてください。Shift-jisを使っている場合は「Shift-jis」に変えてね。

もう文字コードはUTF-8が基本になっているような気がしますが、さくらインターネットはEUC-JPが基本なので最初はいろいろと手間取りますね。
次回はさくらインターネットのサーバーを契約しているけれど、CakePHPでなく普通にPHPベタ書きでデータベースからデータを抽出したときに文字化けしたときの対処法を説明します。

ではまた。

windows版safari4以降でプルダウンメニューがFlashの背景に隠れるバグの対処法

ある案件で、プルダウンメニューの下にFlashを配置するウェブサイトを制作しました。

こういった状況で必ず問題になるのが、JavaScript(HTML)がFlashの背景に隠れてしまう、というものです。Flashはz-indexを認識しないため、CSSで重なりの設定しても効果がありません。

そんな場合の通常の解決策が、flashを設置しているタグにwmodeのtransparentを指定してあげるというものです。

●objectで指定する場合は下記を追加

<param name="wmode" value="transparent" />

●embedで指定する場合は下記を追加

<embed wmode="transparent"... />

●swobject.jsを使っている場合は下記を追加

so.addParam("wmode", "transparent");

この解決策にもデメリットがあり、Flashの中に入力要素があったりすると入力できなくなったりするそうです。
まぁ私の案件ではFlashは単純にonclick等で動かすだけのものだったので、特に問題なしと思っていました。

が、先日問題を発見。

windows版safariのバージョン4.0以降で見てみると、上記指定が効いておらず、プルダウンがFlashの背景にいってしまいます。
調べたところバージョン3.0では問題なかったようです。

海外のサイトを含め、かな~り調べて試しましたが、7月9日現在根本的な解決策は見つかっていません。
ただ、ここまでの調査で分かっているのは下記のとおりです。

・windows版safariのバージョン4以降で発生。mac版では問題ない。バージョン3以下でも問題なかった可能性大(他のサイトの情報から)
・IE6、IE7、IE8、Firefox2、Firefox3、Google Chromeでは問題なし
・インストールされているFlash playerが新しければ問題なし。10.1であれば問題が発生しないのを確認。

とりあえずはFlashのバージョンが新しければ問題ないので、win版safariのシェアも低いことですし今回はそれでなんとか収まればよいのですが。。。
根本的な問題解決策は、今後も探してみようと思います。

もし解決策をご存じの方がいらっしゃいましたら教えてください。m(_ _)m

【追記】

解決策、なし。まぁFlash更新されりゃ問題ないからいいでしょう。

PHPセキュリティ まとめ ver.01

気がついたら全く更新してませんね。

いえね、実は裏側ではだいぶいろいろ動いているのですが、チョコチョコしたことではなく結構でかめのことをやっているので、あまりこちらでちょくちょく公開できる感じでもないのですね。
まーそれはそれとして、気をとりなおしてブログ再開していきましょう。

脱引きこもりプロジェクトの第三弾か四弾として、PHPセキュリテイセミナーに参加してきました。

昨日全然寝てないもんだから、セミナー中に寝そうになってしまい「おぉ、これはウッカリ」と思って回りを見たらけっこうチラホラ寝てました。
まぁそれだけ基本的な内容だったとも云えるかもしれません。オライリーで勉強したことそのまんまという印象でした。

とはいえ、自作CMSをスパムにフルボッコにされた経験を持つ私としては、体系的におさらいが出来て有意義でした。
以前自分がまとめたものと合わせて、再度自分のためのおさらいとしてまとめようと思います。

<ul class="参考にした資料">
<li><!-- プログラミングPHP 第2版(オライリー) --></li>
<li><!-- 入門 PHPセキュリティ(オライリー) --></li>
<li><!-- PHP逆引きレシピ --></li>
<li>PHPセキュリティセミナー(セミナー)</li>
</ul>

※2010年07月01日現在。随時更新予定

【第1:基本的な考え方】

———————————————————————————————————————————————————————————————————————
●多重防御 ・・・複数のブロックをつける
●最小特権 ・・・ユーザーには必要最低限のパワーを与える
●シンプル ・・・ シンプルはセキュリティ。複雑なソースを作らない
●データの流出は最小限に ・・・機密データの不必要な流出は避ける
●データの追跡 ・・・どのデ-タがどこから来てどこへ行くのかを意識する

■変数は必ず初期化してから使う
■基本はPOST送信。GETはページidなどだけに使う。
■データベース(個人情報)、ログ、ライブラリはドキュメントルート配下に置かない(置くと誰でも見れてしまう)

【第2:安全なphp.iniの設定】

———————————————————————————————————————————————————————————————————————

●逆引きレシピのP589参照
●およびセミナーの内容を追記

【第3:入力のフィルタ】

———————————————————————————————————————————————————————————————————————

●1、入力を識別する ・・・どれが入力されたものかを識別する
(フォーム、URL、セッション、データベースから来たものは全て入力)

●2、入力をフィルタする
・内容および範囲のチェック
※フィルタはホワイトリスト形式で行う
※フォーム(チェックボックスなども)、URL、セッション、データベースからの全てが対象となる
※パスワード一致など、文字列の比較は必ず===で行う

●3、フィルタ前のデータとフィルタ後のデータを明確に区別
・$clean_xxxx変数を初期化
・$clean_xxxx変数にフィルタ後のデータを入れる

【第4:出力のエスケープ】

———————————————————————————————————————————————————————————————————————

●出力をする際は必ずエスケープする
・HTMLに出力(print)する直前にエスケープ → $clean_xxxx = htmlentities($xxxx,ENT_QUOTES,’UTF-8′)
(一部のHTMLタグを許可したい場合はHTML purifierライブラリを使用する)
・データベースに入れる直前にのエスケープ → mysql_real_escape_strings()など
‘※SQL文で使用する変数を’で囲まないと意味が無い

【第5:クロスサイトスクリプション、SQLインジェクション、NULLバイト攻撃】

———————————————————————————————————————————————————————————————————————

●クロスサイトスクリプション(XSS)
(ユーザーの入力したデータをそのままHTMLに出力することで発生する脆弱性)
・print出力前のエスケープで対応
$_SERVER[‘PHP_SELF’]の撲滅。代わりに$_SERVER[‘SCRIPT_NAME’]を使う

●SQLインジェクション(ユーザーが入力したデータをそのままSQL文として出力することで発生する脆弱性)
・SQL文出力前のエスケープで対応

●NULLバイト攻撃
(\0の文字で一部のバイナリセーフでない関数で発生する脆弱性)
・preg_matchでチェックする

if(preg_match(‘/\0/’),$sample){
die(“不正な入力です”);
}

【第6:セッションハイジャック対策、その他クッキー対策】

———————————————————————————————————————————————————————————————————————

●セッションハイジャック対策
(他のユーザーのセッションIDを乗っ取る攻撃)
・ログイン前後、権限レベル変更前後、DBの内容更新前後、SSLページへの偏移前後にsesson_regenerate_id(TRUE)でセッションを再生成する
・上記2のphp.iniの設定(セッション関係)を採用する

●セッションファイルの保存ディレクトリを他人がアクセスできない場所へ変更
(php.iniのsesson_save_pathで設定)

●setcookieの第7引数にtrueを入れて、JS経由のcookieへのアクセスをさせないようにする

【第7:CSRF対策】

———————————————————————————————————————————————————————————————————————

●CSRF対策
(サイトの権限を持ったユーザーに不正操作を実行させる攻撃)
・処理の前後でワンタイムチケット方式でのチェックをかます
(確認後、ワンタイムチケットに使用したセッションは初期化しないとあかんよ。)

【第8:ファイル関連】

———————————————————————————————————————————————————————————————————————

●ファイルが本当にアップロードされたものかどうかis_upload_file()でフィルタし、ファイルの移動も move_uploaded_file()を使う
●独自のファイル名に変更する
●もしも独自ファイル名に変更できず、ままのファイル名を採用しなくてはいけない場合は、basename()とrealpath()でチェックする(ディレクトリトラバーサル対策)
●ファイルのMAXサイズを決める

———————————————————————————————————————————————————————————————————————

7月1日時点では、セミナーで話してた内容だけをまとめているので、これから他の資料から学んだセキュリティのポイントも追加していって、結構まとまったものにしようと思います。

10日までには上に記載した書籍のセキュリティ関係の内容をすべて網羅した感じにします。

プロフィール

PICxPIC
1983年生まれ。2010年からiOSアプリを開発し、2012年に法人化。メディア掲載やランキング、ダウンロード数などの詳しい実績などはこちら

PICxPICのアプリ

赤ちゃんの大冒険

おさるランド

動物オーケストラ2

子どもゲームランド

おしゃべりボタン

天空までのぼれ!

ジャンプで川下り

ひよこランド

動物オーケストラ

ポコポコアニマル

キラキラお絵かき

音が出るお絵かき

あいづちん