Hatena::ブログ(Diary)

Elecnotes

2012-05-18

CodeIgniterでURLにコンマ(,)を使えるようにする

CodeIgniterのデフォルトでは、以下のようなコンマ(,)を使ったURLは利用できません。

An Error Was Encountered

The URI you submitted has disallowed characters.

http://hoge.com/admin/edit/5,4,15,333333

config.phpのpermitted_uri_charsに利用したい文字を追記することでエラーを回避できます。

$ vi /application/config/config.php

<?php
/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
//$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-,';

次に、入力クラスでは、許可されていない文字がキー名に使われることを許可していません。

Disallowed Key Characters.

同様にコンマ(,)を追記します。

このエラーは、<input>タグが正しく書かれていない場合にも表示されるようですね。

$ vi /system/core/Input.php

<?php
 // --------------------------------------------------------------------

 /**
 * Clean Keys
 *
 * This is a helper function. To prevent malicious users
 * from trying to exploit keys we make sure that keys are
 * only named with alpha-numeric text and a few other items.
 *
 * @access     private
 * @param     string
 * @return     string
 */
 function _clean_input_keys($str)
 {
//      if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
      if ( ! preg_match("/^[a-z0-9:_\/-,]+$/i", $str))
      {
           exit('Disallowed Key Characters.');
      }

      // Clean UTF-8 if supported
      if (UTF8_ENABLED === TRUE)
      {
           $str = $this->uni->clean_string($str);
      }

      return $str;
 }

http://stackoverflow.com/questions/4197976/codeigniter-disallowed-key-characters

2012-03-06

Rubyから手軽にTwitterへ投稿する

随分前に書いたRubyからTwitterへ投稿するネタですが、

Twitterライブラリの仕様が変わっていました。

http://twitter.rubyforge.org/


あと、アクセストークン等がTwitterのデベロッパーサイト上でそのまま取得できますね。

https://dev.twitter.com/

#! /usr/bin/ruby

require 'rubygems'
require 'twitter'
require 'date'

# 例えば、時間を付けて同じ文言による連投エラーを避ける。
date = Time.now.strftime("%H:%M:%S").to_s

message = "OAuth test."

Twitter.configure do |config|
  config.consumer_key = 'Consumer key'
  config.consumer_secret = 'Consumer secret'
  config.oauth_token = 'Access token'
  config.oauth_token_secret = 'Access token secret'
end

client = Twitter::Client.new

# ツイート!
client.update(date +" "+ message)

2012-03-04

Safari 5.2でGoogle Readerを利用する簡易機能拡張を作りました

現時点で、Safari 5.2 Preview版にはRSSへ追加する機能がありません。

RSSフィードを表示後、ツールバーのボタンを押すことでGoogle ReaderにアクセスするSafari機能拡張を作りました。

http://sandbox.is0.me/release/addRSSButton/

2012-02-08

CodeIgniterで日本語メールを送ると文字化けする場合の対処方法

CodeIgniterのEmailライブラリで日本語を含むメールを送ると、文字化けする。

システムの文字コードはUTF-8。

CIのライブラリ内にあるEmail::_prep_q_encodingで行われているQ-Encodingが原因らしい。

<?php

/**
 * Prep Q Encoding
 *
 * Performs "Q Encoding" on a string for use in email headers.  It's related
 * but not identical to quoted-printable, so it has its own method
 *
 * @access	public
 * @param	str
 * @param	bool	// set to TRUE for processing From: headers
 * @return	str
 */
private function _prep_q_encoding($str, $from = FALSE)
{
	[...]
}

/**
 * Set Email Subject
 *
 * @access	public
 * @param	string
 * @return	void
 */
public function subject($subject)
{
	// $subject = $this->_prep_q_encoding($subject);

	$this->_set_header('Subject', $subject);
	return $this;
}

上のようにEmail::_prep_q_encodingの部分をコメントアウトすれば解決した。

Controller上では、以下のように書けばメールを送信できる。

<?php

$from_name = 'admin';
$subject = '登録されました';
$message = "登録が完了しました。\n";
$message .= "http://is0.me/";

$from_name = mb_encode_mimeheader($from_name);
$subject   = mb_encode_mimeheader($subject);			

$mail_list = array();
$mail_list[] = 'sample@gmail.com';
$mail_list[] = 'hello@gmail.com';

$this->load->library('email');
$this->email->from('no-reply@is0.me', $from_name);
$this->email->to($mail_list);
$this->email->subject($subject);
$this->email->message($message);	

$this->email->send();

// error_log($this->email->print_debugger());