MW211 EXIT

devlog
PHP/セキュリティ対策
2012年11月12日
ぶっちゃけ、セキュリティ対策って以下のことですよね?

【クロスサイトスクリプティング(XSS)対策】
  以下の五つの文字を、画面表示時に以下に置換して表示する
  ・「'」→「'」
  ・「"」→「"」
  ・「&」→「&」
  ・「<」→「&lt;」
  ・「>」→「&gt;」

【SQLインジェクション対策】
  以下の三つの文字を、SQL実行時に以下に置換して実行する
  ・「'」→「\'」
  ・「"」→「\"」
  ・「\」→「\\」
  もしくは、以下の一つの文字を、SQL実行時に以下に置換して実行する
  ・「'」→「''」
  #この場合は、残りの二つは機能的にSQLインジェクションを防止できていること
分類:PHP
PHP/mb_strcut()の端数は切り上げられます
2012年11月11日
mb_strcut()のパラメータにマイナス値を指定してあげると、
右から抜き出すことが可能だが、端数が出た場合には端数も切り上げて抽出してしまう。
よって、指定したサイズよりも+1取得される場合がありうる。

mb_strcut(,-4)の場合
  あいうえお   →  いうえお
  あいうえおA  →  いうえおA

┌──────────────────────────────────────┐
│$抽出 = mb_strcut($文字, -4);                                               │
│if (mb_strwidth($抽出) > 4) {                                               │
│    $出力先 = '...' . mb_strcut($抽出, -3);                                 │
│} else {                                                                    │
│    $出力先 = '..' . $抽出;                                                 │
│}                                                                           │
└──────────────────────────────────────┘

ちなみに、左から普通に切り出した時も同じです。
mb_strcut(,0,4)の場合
  あいうえお   →  あいうえ
  Aあいうえお  →  Aあいうえ
分類:PHP
C/フォーマット指定子(数字付)・番外編
2012年11月10日
さて、これまでのまとめを踏まえて以下はいったいなんなのか?
┌──────────────────────────────────────┐
│%0d                                                                         │
└──────────────────────────────────────┘
「整数部の最小桁数が0」と認識されるのか?
「ゼロパディングだけどその桁数は0」と認識されるのか?
はたまたどちらでもないのか?

実際に実験してみたところ「%d」と変わらなかった。

空文字になるかと思ったがそんなことはなかった。
「%2d」に「123」を入れても「123」になるのと同じだしね。

「0」の場合「0」になるのだから、ゼロパディングが効いているのか?と思ったが
「%d」でも「0」の場合は「0」だった。
だいたいゼロパディングの桁数が0なんだから、「0」とか関係ないし。。。

っていうか「%01d」でも同じじゃないか。

ということで
┌──────────────────────────────────────┐
│「%d」=「%0d」=「「%01d」                                                 │
└──────────────────────────────────────┘
と見てよろしいのでしょうか?
分類:C/C++
C/フォーマット指定子(数字付)
2012年11月09日
だいたい、以下をおさえればよい。後はこれの組み合わせ。
┌──────────────────────────────────────┐
│%2d                                                                         │
└──────────────────────────────────────┘
整数部の数字は整数部の表示領域の桁数を表す。
上記の場合だと、「12」「 1」となる。
ちなみに三桁だとこれを無視して「123」となる(切り捨てられた方が怖いか)。

┌──────────────────────────────────────┐
│%-2d                                                                        │
└──────────────────────────────────────┘
あまり使わないかもしれないが、上記における「 1」を「1 」、
つまり左詰めにしたい場合は「-」を付ける。
ちなみに負の符号(マイナス)は特に指定しなくても勝手に表示されるから
「-」という記号はこの用途に使えているようだ。

┌──────────────────────────────────────┐
│%+d                                                                         │
└──────────────────────────────────────┘
逆に正の符号(プラス)は普段は表示されないものなので、敢えて表示したい場合には
指定が必要で、そのものずばりの「+」でOK。

┌──────────────────────────────────────┐
│%02d                                                                        │
└──────────────────────────────────────┘
先頭に「0」を付けるとゼロパディングとなる。「01」とか「00」とかだ。
「12」とか「123」とかは前出同様に勝手に表示される。

┌──────────────────────────────────────┐
│%.2f                                                                        │
└──────────────────────────────────────┘
小数点以下の数字は、小数部の桁数を表す。「1.23」「4.00」みたいな感じだ。

┌──────────────────────────────────────┐
│%.0f                                                                        │
└──────────────────────────────────────┘
小数点以下はいらない、整数部だけでよいという場合は「0」を指定してしまえばよい。
ちなみに、小数部はデフォルトでゼロパディングなので
整数におけるゼロパディング指定的なものが不要ということになる。
分類:C/C++
C言語/続・アライメントサイズの確認
2012年11月08日
┌──────────────────────────────────────┐
│struct {                                                                    │
│    char  a;                                                                │
│    int   b;                                                                │
│} z;                                                                        │
│printf("%d", sizeof(z));  →8(1+空3+4)                                    │
└──────────────────────────────────────┘
のように、int型の直前にアライメント端数があると、空き地を設けてくれるわけだが
┌──────────────────────────────────────┐
│struct {                                                                    │
│    int   b;                                                                │
│    char  a;                                                                │
│} z;                                                                        │
│printf("%d", sizeof(z));  →8(4+1+空3)                                    │
└──────────────────────────────────────┘
実は、構造体の末尾でも同じことがいえる。

つまり、構造体のサイズはアライメントの倍数であることが保証されるわけだ。

よって、以下の数式で構造体配列の配列数を正しく求めることもできる。
┌──────────────────────────────────────┐
│配列数 = sizeof(配列) / sizeof(配列[0]);                                    │
└──────────────────────────────────────┘
分類:C/C++
C/sscanf()の挙動
2012年11月07日
┌──────────────────────────────────────┐
│単語数 = sscanf(対象文字列, "%d,%d,%d", 取得A, 取得B, 取得C);               │
└──────────────────────────────────────┘
上記のような感じで、対象文字列が以下の場合の結果は
  ・「1,2,3」の場合  →単語数=3、取得A-B-C=1-2-3  正常な場合
  ・「1,2」の場合    →単語数=2、取得A-B-C=1-2-0  成功したところは取得できる
  ・「1,2,」の場合   →単語数=2、取得A-B-C=1-2-0  成功したところは取得できる
  ・「1,2,a」の場合  →単語数=2、取得A-B-C=1-2-0  成功したところは取得できる
  ・「1,,3」の場合   →単語数=1、取得A-B-C=1-0-0  成功したところは取得できる
  ・「1,a,3」の場合  →単語数=1、取得A-B-C=1-0-0  成功したところは取得できる
  ・「,2,3」の場合   →単語数=0、取得A-B-C=0-0-0  冒頭でこけたら全滅する
  ・「a,2,3」の場合  →単語数=0、取得A-B-C=0-0-0  冒頭でこけたら全滅する
  ・「」の場合       →単語数=0、取得A-B-C=0-0-0  空文字は例外とはならない
  ・「a」の場合      →単語数=0、取得A-B-C=0-0-0  該当なしも例外とはならない
  ・「1,2,3,4」の場合→単語数=3、取得A-B-C=1-2-3  実は正常な場合と区別できず
  ・「(NULL)」の場合 →例外発生
※取得A-B-Cは「%d-%d-%d」で出力したものです
分類:C/C++
C/フォーマット指定子
2012年11月06日
入力系フォーマット指定子
┌──┬───────────────────────────────────┐
│%c  │char型                                                                │
│%s  │文字列                                                                │
├──┼───────────────────────────────────┤
│%d  │整数(10進・符号あり)                                                  │
│%u  │整数(10進・符号なし)                                                  │
│%o  │整数( 8進)                                                            │
│%x  │整数(16進)                                                            │
├──┼───────────────────────────────────┤
│%ld │long型整数(10進・符号あり)                                            │
│%lu │long型整数(10進・符号なし)                                            │
│%lo │long型整数( 8進)                                                      │
│%lx │long型整数(16進)                                                      │
├──┼───────────────────────────────────┤
│%f  │小数                                                                  │
│%lf │double型小数                                                          │
└──┴───────────────────────────────────┘
他に「%e」「%g」もある

出力系フォーマット指定子
┌──┬───────────────────────────────────┐
│%c  │char型                                                                │
│%s  │文字列                                                                │
├──┼───────────────────────────────────┤
│%d  │整数(10進・符号あり)                                                  │
│%u  │整数(10進・符号なし)                                                  │
│%o  │整数( 8進)                                                            │
│%x  │整数(16進)                                                            │
├──┼───────────────────────────────────┤
│%hhd│char型整数(10進・符号あり)                                            │
│%hhu│char型整数(10進・符号なし)                                            │
├──┼───────────────────────────────────┤
│%hd │short型整数(10進・符号あり)                                           │
│%hu │short型整数(10進・符号なし)                                           │
├──┼───────────────────────────────────┤
│%ld │long型整数(10進・符号あり)                                            │
│%lu │long型整数(10進・符号なし)                                            │
│%lo │long型整数( 8進)                                                      │
│%lx │long型整数(16進)                                                      │
├──┼───────────────────────────────────┤
│%f  │小数                                                                  │
│%lf │double型小数                                                          │
└──┴───────────────────────────────────┘
分類:C/C++
設計/小数部を含む整数の用語定義
2012年11月05日
「123」とかのことを「整数」と記載した場合、
「123.45」とかのことをなんと記載しようかと悩んだ。

「0.45」って小数部が付いてるから「小数付整数」?
いやいや「小数点付整数」?

なんかしっくりこない。

そこで本格的に調べてみた。

結論は…。


「小数」


え?
「小数」ってのは「整数部+小数点+小数部」のことらしい。
「小数」と聞いてなんとなく思い浮かぶ「0.1」とかは、「純小数」といい、
我らが「123.45」(こいつは「帯小数」というらしい)と合わせて
「小数」っていうんだって。

なんだか、すげーあいまいなまま生きてきたんだなぁ。
分類:設計
C/【未解決】strlen()の柔軟性
2012年11月04日
やみくもに「strlen()」を使っていいものか?

末尾の「\0」を探してサイズを算出してくれるんなら
多少大目にサイズが算出されてもいいんじゃない?
#自分の領域にうっかり「\0」がなくても、
  となりの領域に「\0」があればそこまでのサイズを算出してくれそうだし。。。

でも、莫大なサイズだったらどうしよう?
#ってそんなに「\0」が続かない領域ってあるの?

っていうかたまたま全領域の末尾だったら「\0」がなくてってこともありうるなぁ
#全領域の末尾あたりで作業することってそんなにあるのかな?

ってなことを考えた。

もし仮に、「strlen()」をやみくもに使っていいのであれば、
なんだか出自の知れないポインタをとりあえず「strlen()」でサイズを計ってから
処理するってこともできるし。。。

でも、となりの領域に侵入した時点でアウトみたい。
#でも、実験したら場合によりけりみたいだけど(結論的にはアウトなんでしょう)。

正確な情報を知りたいものだ。
分類:C/C++、【未解決】
PostgreSQL/INSERT件数
2012年11月03日
「INSERT INTO 出力先 SELECT 入力元」みたいな、INSERT文を実行した場合、
実際に何件挿入されたか気になるところ。

実行直前と直後にそれぞれ「SELECT COUNT(*)」で件数を取得して差分をとるという
地道な方法以外に件数を簡単に取得する方法はないものか

PL/pgSQLだったら、以下で挿入件数を取得できる。
┌──────────────────────────────────────┐
│GET DIAGNOSTICS 変数(INTEGER型) = ROW_COUNT;                                │
└──────────────────────────────────────┘
分類:PostgreSQL
前へ 1 … 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 … 156 次へ