Hatena::ブログ(Diary)

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

2009-07-17

学習日記70日目 - Blogapp vol.6 -

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

どうも、enomotoです。

今日もBlogapp制作日記です。

本日どうにかブログ投稿画面がほぼ完成しました。

今までタグを投稿するのに別画面で投稿しなければならなかったのが

ブログ記事投稿と同時にできるようになりました。

どうやったか?

処理自体はこうなっています。

ブログ投稿画面(articleモジュール)でブログ内容とタグ内容を記述し送信ボタンを押す

ブログ内容を保存し、タグ内容をセッションに入れてタグ投稿画面に移動

→タグ内容をセッションから取り出しタグ内容を保存(articletagモジュール)

→タグ内容が入ったセッションを削除してブログ投稿リストに飛ばす

タグ投稿内容はブログ投稿内容を保存すると共にセッションに入れてarticletagモジュールに投げています。

f:id:crazyup:20090717184957p:image

f:id:crazyup:20090717184958p:image

Admin Generatorはそのままではこんなことはやってくれないので自分で実装する必要が…

ということでgenerator.ymlを弄る。

tagパーシャルの呼び出しをする。

generator:
  class:              sfPropelAdminGenerator
  param:
    model_class:      Article
    theme:            default
    list:
      title:          BLOG List
      display:       [id, title, created_at, updated_at]
    edit:
      title:          BLOG Editor
      display:       [title, _tag, body]
tagパーシャルはこんなの。
  <div>Add your own:
      <?php echo input_hidden_tag('article_id', $article->getId()) ?>
  </div>
投稿内容の処理
  protected function updateArticleFromRequest()
  {
    //$usersid = $this->getUser()->getSubscriberId();
    $usersid = 1;
    // まずは投稿者IDをセット
    $this->article->setUserId(1);
    // getRequestParameterする。
    $article = $this->getRequestParameter('article');
    $tag = $this->getRequestParameter('tag');
    // タイトルと内容を保存
    if(isset($article['title'])) {
      $this->article->setTitle($article['title']);
    }
    if(isset($article['body'])) {
      $this->article->setBody($article['body']);
    }
    $this->article->save();
    // 記事IDを呼び出す
    $articleid = $this->article->getId();
    // タグモジュールに送る
    $this->getUser()->setAttribute('userid',$usersid);
    $this->getUser()->setAttribute('articleid',$articleid);
    $this->getUser()->setAttribute('tag',$tag);
    $this->redirect('articletag/set');
  }
タグモジュール
  public function executeSet()
  {
    // タグデータを受け取る
    $userid = $this->getUser()->getAttribute('userid');
    $articleid = $this->getUser()->getAttribute('articleid');
    $tag = $this->getUser()->getAttribute('tag');
    // 普通のタグ挿入
    $this->article_tag = new ArticleTag();
    $this->article_tag->setUserId($userid);
    $this->article_tag->setArticleId($articleid);
    $this->article_tag->setTag($tag);
    $this->article_tag->setNormalizedTag(Tag::normalize($tag));
    // 保存
    $this->article_tag->save();
    // ここから日付タグ
    $this->article_tag = new ArticleTag();
    $this->article_tag->setUserId($userid);
    $this->article_tag->setArticleId($articleid);
    $this->article_tag->setTag(date('Ymd'));
    $this->article_tag->setNormalizedTag(Tag::normalize(date('Ymd')));
    // 保存
    $this->article_tag->save();
    // タグデータを消去
    $this->getUser()->getAttributeHolder()->clear();
    $this->redirect('article/list');
  }

Webセキュリティ vol.1 <SQLインジェクション>

SQLインジェクションについて学びました。

セキュリティに関しては手を抜けないところですが、

フレームワークを使う理由の一つにSQLインジェクション対策があることを聞いて

ますますフレームワークの便利さが分かりました。

SQLインジェクションとは?

よくある例
$sql = 'SELECT name FROM user WHERE id='.$_GET['id'];
  • 想定外のSQLを実行される脆弱性
  • DBの全情報を盗む方法論が確立している
  • 更新系のSQLを流される可能性
SQL文のコメント
--こめんと
UNION文
  • 前後のSELECT文の結果を連結
  • 1文目と2文目でカラム数・型が合っている必要がある

防ぐ

防御方法
  • O/Rマッパー
    • メリット
      • 誰でも安全なSQL文が作れる
    • デメリット
      • 適応範囲が限られる

→O/Rマッパーで書ける範囲なら完璧

  • prepared statement
    • メリット
      • 複雑なSQLでも記述可能
      • ?が使える場所は安全
    • デメリット
      • ?は文字列にしか使えない(使えない場所は用心)
使い分け
  • 基本はO/Rマッパー
  • 複雑なSQLは用心しながらprepared statement
    • ?が使えない場所は要レビュー
Copyright © crazyup. All rights reserved.