ラベル validation の投稿を表示しています。 すべての投稿を表示
ラベル validation の投稿を表示しています。 すべての投稿を表示

2016年5月21日土曜日

Qualys SSL Server Testでレートを Aプラスにする


Qualys SSL LabsのSSL Server Testで、A評価を得てみる。


環境

  • OS: Amazon Linux 2016.03
  • Webサーバ: Apache 2.4.18
  • OpenSSL: 1.0.1k
  • サーバ証明書: Let's Encrypt(certbot)



デフォルト設定
SSLProtocol all -SSLv3
SSLHonorCipherOrder on
↓
B
This server accepts RC4 cipher, but only with older protocol versions. Grade capped to B.


SSLCipherSuiteも指定(コメントアウトされている推奨?設定+RC4も禁止)
SSLCipherSuite HIGH:MEDIUM:!RC4:!aNULL:!MD5
↓
A


HSTSを追加
Header always set Strict-Transport-Security "max-age=15768000"
↓
A+
HTTP Strict Transport Security (HSTS) with long duration deployed on this server.


さらにProtocol Supportを満点にするには、TLS1.2のみにすればOK。
Key ExchangeとCipher Strengthを満点にするには?SSLCipherSuiteをきちんと指定する??



参考



2011年3月24日木曜日

PHPで URLのホスト名(ドメイン)が存在するかチェックする方法

PHPでURLのホスト名(ドメイン)が有効なものかどうかをチェックする例。
file_get_contents()でignore_errorsをtrueにしてstream_context_create()してもホスト名が名前解決できなくてWarningが出てしまう問題に悩んでいる場合などにどうぞ。

$url = 'http://www.example.com/path';

$array = parse_url($url);

if ($array && $array['host']) {
    $ip = getHostByName($array['host']);
    $long = ip2long($ip);
  
    if ($long === false || $ip !== long2ip($long)) {
        echo '名前解決できなかった';
    } else {
        echo 'OK';
    }
} else {
    echo 'URLが正しくない';
}

DNSで名前解決できたらOKにしている。
また、ホスト名がIPアドレス(IPv4)の場合はどんなIPでも(たとえ255.255.255.255でも)OKにしている。

ip2long()で得た値をlong2ip()でIPアドレスに戻してチェックしているのは、ip2long()が「0.0.256」のような値を「0.0.1.0」などと解釈してしまうため。
参考:(IPv4) インターネットプロトコルドット表記のアドレスを、適当なアドレスを有する文字列に変換する - PHP 5.3 日本語マニュアル
ip2long() を、それ単体で IP の検証に利用するべきではありません。long2ip() と組み合わせて利用します。

<?php
// IP が有効であることを確認します。また、不完全な形式の IP を
// 以下で示すような正しい形式(ドットで 4 つに区切られている)に変換します。
$ip = long2ip(ip2long("127.0.0.1")); // "127.0.0.1"
$ip = long2ip(ip2long("10.0.0")); // "10.0.0.0"
$ip = long2ip(ip2long("10.0.256")); // "10.0.1.0"
?>


これはIPv4を使ってるけど、今後IPv6が普及したら...その時までにPHPも進化しているでしょう。


参考

2011年3月3日木曜日

PHPの SJISと SJIS-WINの違い


SJIS-WINとは?

PHPで文字コードとして「SJIS-WIN」を指定すると、Microsoftが拡張したShift_JISであるWindows-31Jが使われる。

Windows-31Jは、Microsoftが「JIS X 0208-1990」をベースに、NECとIBMの独自拡張文字の一部(一般的にはSJISの「機種依存文字」と呼ばれる?)を取り込んだ文字コード。
(参考:Microsoftコードページ932 - Wikipedia)



SJISとSJIS-WINで何が違うの?


SJIS-WINの方が文字が多い。

よく使うところでは、下記のような文字はSJISーWINにはあるがSJISにはない。

  • 丸数字 (①②③...⑳)
  • ローマ数字 (ⅠⅡⅢ...Ⅹ、ⅰⅱⅲ...ⅹ)
  • カッコ付きの株 (㈱)
  • はしご高[はしごたか] (髙)
  • たつ崎[たつさき、たちさき] (﨑)



SJIS-WINにはあるがSJISにはない文字

下記の3種類
  • NEC 特殊文字(13区)
  • NEC 選定 IBM 拡張文字(89~92区)
  • IBM 拡張文字(115~119区)

具体的な文字の一覧については下記参考サイトを参照。



SJIS-WINにはあるがSJISにはない文字を正規表現で探すには?

preg_match()等のPCRE関数はUTF-8以外のマルチバイト文字に対応していないので、そのままではShift_JISには使えない。(UTF-8の場合はパターン修飾子として"u"を付ければ使える。)
一見Shift_JISでも使えそうに見えることもあるが、Shift_JISの2バイト目と次の文字の1バイト目を1つの文字とみなしてヒットしてしまう場合がある。
preg_match('/[\x87][\x40-\x8F]/', 'ョ@'); // => true

対策としては、対象文字列をmb_substr()等を使いあらかじめ1文字ずつに分解しておいて、それを1文字ずつチェックしていけば正しく判定できる。

また、PHP4ではmb_ereg系の関数をこれに使えたみたいだが、鬼車のPHP5では使えないみたい。

単純にSJIS-WINにはあるがSJISにはない文字を含んでいるかどうかを判定しただけなら、それぞれの文字コードに変換した後に比較すれば分かる。
$utf8 = '株';
$sjis = mb_convert_encoding($utf8, 'SJIS', 'UTF-8');
$sjisWin = mb_convert_encoding($utf8, 'SJIS-WIN', 'UTF-8');

var_dump($sjis === $sjisWin); // => true

$utf8 = '㈱';
$sjis = mb_convert_encoding($utf8, 'SJIS', 'UTF-8');
$sjisWin = mb_convert_encoding($utf8, 'SJIS-WIN', 'UTF-8');

var_dump($sjis === $sjisWin); // => false

2009年9月24日木曜日

Rails ActiveRecord::Validationsのエラーメッセージを多国語対応するメモ

RailsでActiveRecordのValidationによって生成されるエラーメッセージを翻訳するためのメモ。


方法その1:I18nを使う

所定のYAMLに翻訳部分を記述しておく方法。現在はこれが一番スマートなようだ。
(フィールド名とその後のメッセージの間に半角スペースが入ってしまう?)

参考:
 Rails 2.2.2でエラーメッセージを日本語化する。|WEBデザイン Tips
 Rails 2.2 の ActiveRecord::Validations#add のソースコードを読む - Ruby on Rails 研究 - Ruby on Rails with OIAX



方法その2:GetTextを使う

ActiveRecord::Errorsのdefault_error_messagesをゴリゴリ書き換える方法。
例えば、基本となるModelを作ってその中でメッセージをセットし、他のモデルはそれを継承する方法でもよいと思う。

class BaseModel < ActiveRecord::Base
 ActiveRecord::Errors.default_error_messages[:invalid] = _("がおかしいよ!")
 ActiveRecord::Errors.default_error_messages[:empty] = _("を入力してね!")
 ・
 ・
end
ただし最新のRailsではDeprecation::warnの対象?

個々のエラー内容の前に出てくる文(デフォルトでは「<n> errors prohibited this object from being saved」と「There were problems with the following fields:」)は、Module: ActionView::Helpers::ActiveRecordHelperにあるとおり、:header_messageと:messageを指定することにより変えられる。
(2009/10/14追記:Ruby on RailsでRuby-GetText-Packageを使う (Rails-2.3.2以降) - よたらぼ 保管庫に書いてある、「エラーメッセージのタイトル部分をカスタマイズ」のやり方なら、個々のformごとに:header_messageと:messageを指定しなくてすむようだ。)


参考:
 エラーメッセージからフィールド名を取り除く
 ActiveRecord::Errorsあたりのローカライズ - ハードコアシステム開発
 validationのエラーメッセージ(error_messages_for)の日本語化 - Slow Dance
(2009/10/14追加:最新のRails/GetTextについての説明になっていた)
 Ruby on RailsでRuby-GetText-Packageを使う (Rails-2.3.2以降) - よたらぼ 保管庫

2009年8月28日金曜日

Railsプラグイン ActiveForm調査メモ

AtcitveFormはテーブルに紐付かないモデルを使って入力フォームを作るためのプラグイン。
データの入れ物とvalidationを担う。

「ActiveForm」という名前のプラグインは複数あるので注意。
Gemでインストールすると、module版のActiveFormがインストールされるが、よく分からなかったのでパス。

どうやら「RealityForge」で公開されたActiveFormが主流のようだ。


最新版?:
 maciej's active_form at master - GitHub


使い方:
 RailsのActiveFormの使い方 - 京の路
 Ruby on Rails プラグイン まとめ wiki - active_formプラグイン
 るびすけの開発日記 ~Ruby on Rails~ - IT業界のための転職サイト -



Rails2.2以降ではエラーが発生する。

undefined method `self_and_descendants_from_active_record' for Xxx:Class

rails2.2でactive_formを導入するときにはまった - オレワカ。を参考に、「self_and_descendants_from_active_record」を追加すると解消した。
svnから持ってくるバージョンでは 「self_and_descendents_from_active_record」 すらも無いので注意。


使用例
#コントローラ
class SearchController < ApplicationController
 def index
  @search = Search.new(params[:search])
  if params[:search]
   @search.valid?
  end
 end
end
#モデル
require 'active_form'

class Search < ActiveForm
 attr_accessor :tag
 validates_presence_of :tag
 validates_length_of :tag, :maximum => 3
 def validate
  # カスタム入力チェックはここで
 end
end
<!-- ビュー -->
<% form_for(:search, @search) do |f| %>
<%= error_messages_for :search, "tag" %>
<%= f.text_field "tag" %>
<% end %>

2008年9月6日土曜日

CakePHP 1.2で bakeするメモ

CakePHP1.2では、bakeはこんな感じで実行できる。

cake bake

cakeコマンドはCAKE_HOME/cake/consoleディレクトリにあるが、bakeはアプリケーションを作りたいディレクトリ上で実行する必要がある。WindowsではCakePHP のおいしい食べ方: [1.2]Easy Bake on Windowsを参考にすると楽。オプションとしてappのパスを指定できた。
cake -app /path/to/app bake


bakeでのModelの作成はDBのテーブルを元にするので、DBにテーブルが1つも無いと怒られる。
テーブルを作ってからbakeすること。
Welcome to CakePHP v1.2.0.7296 RC2 Console
---------------------------------------------------------------
App : app
Path: CAKE_HOME/app
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> M
---------------------------------------------------------------
Bake Model
Path: CAKE_HOME/app/models/
---------------------------------------------------------------
Error: Your database does not have any tables.

bakeでModelを作るとオプションでvalidationも付けられる。
が、maxLengthなど値を指定するルールをbakeでどうやって指定するかわからない。

ブログ アーカイブ

tags