Hatena::ブログ(Diary)

crazyuplog このページをアンテナに追加 RSSフィード

2009-10-18

tumblrをサイトに表示するものを作ってみた。

そんなに需要はあるとは思えませんが自分のサイトにtumblrのデータを表示したいという人向け。

自分で使う以外に考えていないので酷い出来ですがあえて公開。

<?php
$tumblr = simplexml_load_file('http://crazyup.tumblr.com/api/read');
if(!$tumblr) {
  echo '<li>Error!!</li>';
  exit();
}
$post = $tumblr->posts->post;
for ($i = 0; $i <= 9; $i++) {
  $data = $post[$i];
  echo '<li>';
  $type = $data->attributes()->type;
  switch($type) {
  case 'quote':
    echo sprintf('<a href="%s"><strong>%s</strong></a><br />',$data->attributes()->url,$data->{'quote-text'});
    echo sprintf('<small>source: %s</small>',$data->{'quote-source'});
    break;
  case 'link':
    echo sprintf('<a href="%s"><strong>%s</strong></a>',$data->{'link-url'},$data->{'link-text'});
    break;
  case 'photo':
    echo preg_replace('/\<p\>(\<a href\=\".*\"\>)(.*)(\<\/a\>)\<\/p\>/','$1<strong>$2</strong>$3',$data->{'photo-caption'});
    break;
  case 'video':
    echo sprintf('%s',$data->{'video-player'});
    break;
  }
  echo '</li>'."\n";
}
?>

資料

2009-07-27

escaping_strategyがbothになっている環境で部分的にエスケープを解除する。

settings.ymlでescaping_strategyをbothにすると変数が常にエスケープされて便利なんですが、

記事の表示の時にエスケープされたものも再度エスケープされてしまうので

「…」などの特殊文字が表示できなくなってしまう。

これは困った。

ということで表示部分でエスケープさせないようにしてみました。

まずはこういう方法がある。

<?php echo $hoge ?>

となっている部分を

<?php echo $sf_data->getRaw('hoge') ?>

に変えてみる。

こうすることによってエスケープされていない値が入る。

メソッドを呼び出すときにエスケープしたい。

ただ、この方法だと

function hatenasyntax_list($article) {
  $article_body = preg_split('/====/',$article->getBody());
  if(isset($article_body[1])) {
    return HatenaSyntax::render($article_body[0]).
      '<p class="more">'.link_to('&gt;&gt; 続きを読む & コメントを書く/読む','article/show?id='.$article->getId()).'</p>';
  } else {
    return HatenaSyntax::render($article_body[0]).
      '<p class="more">'.link_to('&gt;&gt; コメントを書く/読む','article/show?id='.$article->getId().'#comment').'</p>';
  }
}

こういうのを

<?php echo hatenasyntax($article) ?>

で呼び出している場合、どうもうまくいかない。

どうすればいいかなーと思って調べたらこういう方法があるらしい。

参考:no title

参考:symfony のエスケープ処理 - アシアルブログ

$article->getBody(ESC_RAW)

ESC_RAWは何もエスケープしないようになる。

これで安心。HatenaSyntaxのおかげか、はてな文法以外はちゃんとエスケープされてるし。

2009-07-24

学習日記74日目 - Blogapp vol.10 -

スタートアップ研修記はこちらです。

どうも、enomotoです。

きょうは気づいたことを書いていきます。

気をつけたいこと

settings.ymlを編集するときはコメントアウトしてある部分を

コメントアウトを外して使うのではなくちゃんとまとめて書く。

all:
  .settings:
    escaping_strategy:      both
    enabled_modules:        [default, sfCryptoCaptcha]

#all:
#  .actions:

all:のコメントアウトを外すのを忘れて動作しなくていろいろ原因を探っていたらあっという間に時間が過ぎた。

こういう無駄な時間を過ごさないためにもできるだけ見やすく書く。

Webセキュリティ vol.2 〜XSS〜

  • XSSとは?
  • XSSが生まれる理由
  • XSSを防ぐ方法
  • symfonyなら安心
  • XSSってどれぐらい危険?

XSSとは?

クロスサイトスクリプティング

  • サイト間を横断して悪意のあるスクリプトを混入させること
  • これに加え、任意の要素を混入させられるうる脆弱性を含む

→ターゲットは違う人のPC・ブラウザになる。

XSSが生まれる理由

バグのせい

  1. 外部から来た値に対するチェック漏れ
  2. 入力した値のエスケープ忘れ。

XSSを防ぐ方法

  • 基本はhtmlspecialchars()関数
    • < > & "
    • 第二引数のENT_QUOTES必須
      • 'も変換してくれる
どんな値に注意するか
  • $_GET、$_POST
  • $_SERVER['PHP_SELF']
  • DBから取得した値
  • 外部サイトのRSSから取得した値
  • アップロード画像から取得した値
    • リクエストヘッダのMime-type
    • コメント領域
    • EXIF情報

symfonyなら安心

  • settings.ymlのescaping_strategyをbothに
  • スーパーグローバル変数の利用は厳禁

XSSってどれぐらい危険?

  • 非常に危険
    • HTML中にJSが書ける=自由度が高い
    • HTML要素やCSSを書けるだけでも恐怖
JSでできること
  • 起動タイミングは任意
  • 同一ホストへのGET/POSTが可能
  • 他ホストへのGET/POSTが可能
  • HTMLの見た目・挙動を変更できる
XMLHttpRequest
    • 同一ホスト内で可能なことはほとんど何でも可能
    • 何回でも実行可能

→様々なことが実行可能

2009-07-21

学習日記71日目 - Blogapp vol.7 -

スタートアップ研修記はこちらです。

どうも、enomotoです。

3連休は友人の納車に立ち会ったり、そのまま御殿場に行って寿司食って温泉入ってきました。

久々にリフレッシュしたなーと思った休日でした。

さて、Blogappの制作を今週も行っていますが今回は小ネタ。

WassrのタイムラインをBlogappに入れてみるを書いてみたいと思います。

ブログを投稿するとWassrにも流れるというわけではなくただ表示するだけです。

f:id:crazyup:20090721182003p:image

layout.php

<div id="header">
  <h1><?php echo link_to(sfContext::getInstance()->getResponse()->getTitle(),'@homepage') ?></h1>
  <ul>
    <li><?php include_component('article','wassr') ?></li>
  </ul>

components.class.php

<?php

class articleComponents extends sfComponents
{

  public function executeWassr()
  {
    define('WASSRJSON','http://api.wassr.jp/statuses/show.json?id=WassrID');
    $json = file_get_contents(WASSRJSON);
    $this->status = json_decode($json);
  }

}

_wassr.php

Wassr now : 
<?php echo link_to($status[0]->text,$status[0]->link) ?>

2009-07-09

学習日記64日目

スタートアップ研修記はこちらです。

どうも、enomotoです。

今日はaskeetを一段落させて次のPHP制作に向けて動き出しました。

ということで今日はaskeet日記とPHP制作で使うかもしれないモノの検証日記です。

今更、思ったこと。

$c = new Criteria();

ってよく使うけど、なんだろう。

と、思ったので本で調べてみた。

symfonyにおいてのDBとの接続

symfony→Propel→Creole→DB(MySQL etc...)

データの取得

Propelはクエリのwhere部分をCriteriaオブジェクトで表現する。

SQL文
SELECT * FROM user WHERE user.EMAIL='bar@example.com' AND user.NAME='bar';
Criteriaで表現すると
$c = new Criteria();
$c->add(UserPeer::EMAIL,'bar@example.com',Criteria::EQUAL);
$c->add(UserPeer::EMAIL,'bar',Criteria::EQUAL);
$users = UserPeer::doSelect($c);

ふむーなるほど。

SQL文書く代わりにこうかくのね。なるほど。

Wassr APIを使ってみる

Twitterからデータを取り出したらWassrもやらなきゃダメだろということで実際にやってみた。

JSONの読み方が分かると、できることが広がりますね><

参考:「Wassr」サービス終了のお知らせ

ということでさくっと書いてみる。

<?php
define('WASSRJSON','http://api.wassr.jp/statuses/show.json?id=crazyup');
$json = file_get_contents(WASSRJSON);
var_dump(json_decode($json));

var_dumpした結果

  • さすが、Wassr。イイネした相手も分かるのね。
  • echo $status[0]->text;とやれば1行が取り出せます。
array(1) {
  [0]=>
  object(stdClass)#1 (18) {
    ["favorites"]=>
    array(1) {
      [0]=>
      string(11) "kimishowota"
    }
    ["user_login_id"]=>
    string(7) "crazyup"
    ["areacode"]=>
    NULL
    ["photo_thumbnail_url"]=>
    NULL
    ["html"]=>
    string(183) "eneloop mobile boosterにUSBケーブルストラップを付けたらいい感じだ。mobile boosterをMacのUSBポートから充電できるし、携帯の充電もできる><"
    ["text"]=>
    string(183) "eneloop mobile boosterにUSBケーブルストラップを付けたらいい感じだ。mobile boosterをMacのUSBポートから充電できるし、携帯の充電もできる><"
    ["reply_status_url"]=>
    NULL
    ["user"]=>
    object(stdClass)#2 (3) {
      ["profile_image_url"]=>
      string(58) "http://wassr.jp/user/crazyup/profile_img.png.64.1238592573"
      ["protected"]=>
      bool(false)
      ["screen_name"]=>
      string(7) "crazyup"
    }
    ["id"]=>
    string(7) "4777225"
    ["reply_user_login_id"]=>
    NULL
    ["link"]=>
    string(48) "http://wassr.jp/user/crazyup/statuses/L9wDF18qrU"
    ["epoch"]=>
    int(1247122093)
    ["rid"]=>
    string(10) "L9wDF18qrU"
    ["photo_url"]=>
    NULL
    ["reply_message"]=>
    NULL
    ["reply_user_nick"]=>
    NULL
    ["slurl"]=>
    NULL
    ["areaname"]=>
    NULL
  }
}
Copyright © crazyup. All rights reserved.