[ja] Remove original text from translated documents.
This commit is contained in:
@@ -21,4 +21,3 @@ Goはコンパイラ型言語の一種です。インタプリタ型言語の軽
|
||||
## links
|
||||
* [目次](<preface.md>)
|
||||
* 次へ: [Goのインストール](<01.1.md>)
|
||||
|
||||
|
||||
@@ -132,7 +132,6 @@ Go言語では、Cや他の言語と同じように、他の型の属性やフ
|
||||
|
||||
図2.7 StudentとHumanの継承方法
|
||||
|
||||
我们看到Student访问属性age和name的时候,就像访问自己所有用的字段一样,对,匿名字段就是这样,能够实现字段的继承。是不是很酷啊?还有比这个更酷的呢,那就是student还能访问Human这个字段作为字段名。请看下面的代码,是不是更酷了。
|
||||
Studentがageとnameの属性にアクセスする際、あたかも自分のフィールドであるかのようにアクセスしたのをご覧いただけるかと思います。そうです。匿名フィールドというのはこういうものです。フィールドの継承を実現できるのです。これってクールじゃないですか?もっとクールにする方法もありますよ。studentはHumanのフィールド名でアクセスできます。下のコードを御覧ください。ほら、とってもクールでしょ?
|
||||
|
||||
mark.Human = Human{"Marcus", 55, 220}
|
||||
|
||||
@@ -29,4 +29,3 @@
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [マルチスレッド](<02.7.md>)
|
||||
* 次へ: [Webの基礎](<03.0.md>)
|
||||
|
||||
|
||||
@@ -9,4 +9,3 @@ Webのプログラミングの基礎を勉強することはあなたにとっ
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [第二章概要](<02.8.md>)
|
||||
* 次へ: [webでの作業方法](<03.1.md>)
|
||||
|
||||
|
||||
@@ -7,4 +7,3 @@
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [Goのhttpパッケージ詳細](<03.4.md>)
|
||||
* 次へ: [フォーム](<04.0.md>)
|
||||
|
||||
|
||||
@@ -23,4 +23,3 @@ HTTPプロトコルはステートレスなプロトコルです。ではどの
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [第三章概要](<03.5.md>)
|
||||
* 次へ: [フォームの入力を処理する](<04.1.md>)
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
Web開発の原則はユーザが入力したいかなる情報も信用してはならないということです。そのため、ユーザの入力した情報を検証しフィルターすることは非常に重要になってきます。ブログやニュースの中でどこそこのホームページがハッキングされたりセキュリティホールが存在するといったことをよく聞くかもしれません。これらの大部分はユーザの入力した情報に対してホームページが厳格な検証を行わなかった事によるものです。そのため、安全なWebプログラムを書くために、フォームの入力を検証する意義は非常に大きいのです。
|
||||
|
||||
|
||||
Webアプリケーションを書く時は主に2つの方面のデータ検証があります。ひとつはページ上でのjsによる検証で(現在この方面では多くのプラグインがあります。例えばValidationJSプラグインなどがそうです)、もうひとつはサーバ側での検証です。この節ではどのようにサーバでの検証を行うか解説します。
|
||||
|
||||
## 必須フィールド
|
||||
@@ -17,6 +16,8 @@ Webアプリケーションを書く時は主に2つの方面のデータ検
|
||||
## 数
|
||||
たとえば、フォームからある人の年齢が50歳や10歳といった具体的な値を必要としていて、"おっさん"とか"若者"というようなものでなかったとします。このようにフォームの入力フィールドの中で数字のみを許容するようにさせたい場合、整数かどうかを判断するために、まずint型に変換を行ってから処理を行います。
|
||||
|
||||
正の整数を判断しようとする場合は、まずint型に変換してから処理を行います
|
||||
|
||||
getint,err:=strconv.Atoi(r.Form.Get("age"))
|
||||
if err!=nil{
|
||||
//数の変換でエラーが発生。つまり、数字ではありません。
|
||||
@@ -45,8 +46,7 @@ Webアプリケーションを書く時は主に2つの方面のデータ検
|
||||
}
|
||||
|
||||
## 英文
|
||||
あるユーザの英語名を知りたいときなど、フォームの要素から英語の値を取り出したい場合は、astaxieであってasta谢ではないはずです。
|
||||
(訳注:「谢」はピンインでxieと書く)
|
||||
あるユーザの英語名を知りたいときなど、フォームの要素から英語の値を取り出したい場合は、astaxieであってasta谢ではないはずです。(訳注:「谢」はピンインでxieと書く)
|
||||
|
||||
簡単な正規表現を使ってデータを検証することができます:
|
||||
|
||||
@@ -66,12 +66,11 @@ Webアプリケーションを書く時は主に2つの方面のデータ検
|
||||
|
||||
|
||||
## 携帯電話番号
|
||||
ユーザが入力した携帯電話番号が正しいか判断したい場合は以下の正規表現で検証できます:
|
||||
ユーザが入力した携帯電話番号が正しいか判断したい場合は以下の正規表現で検証できます(訳注:中国の携帯電話番号):
|
||||
|
||||
if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{4,8})$`, r.Form.Get("mobile")); !m {
|
||||
return false
|
||||
}
|
||||
(訳注:中国の携帯電話番号)
|
||||
|
||||
## プルダウンメニュー
|
||||
フォームの中の`<select>`要素が生成するプルダウンメニューにおいて、ハッカーは時々このプルダウンメニューに無い項目を偽造してあなたに送りつけるかもしれません。このような場合値がもともと設定されたものであることを判断するにはどうすればよいでしょうか?
|
||||
@@ -131,9 +130,9 @@ selectには以下の要素があるとします:
|
||||
|
||||
上の`Slice_diff`という関数には私のオープンソースのライブラリが含まれます(sliceとmapを操作するライブラリ)[https://github.com/astaxie/beeku](https://github.com/astaxie/beeku)
|
||||
|
||||
|
||||
## 日付と時間
|
||||
ユーザが入力した日時が有効か確認したいとします。例えば、ユーザがスケジュールで8月45日にパーティを開く予定を入力したり、未来の時間を誕生日にしてみたりといった場合です。
|
||||
ユーザが入力した日時が有効か確認したいとします。例えば
|
||||
、ユーザがスケジュールで8月45日にパーティを開く予定を入力したり、未来の時間を誕生日にしてみたりといった場合です。
|
||||
|
||||
Goではtimeの処理パッケージを提供しています。ユーザの入力した年月日を目的の時間に変換してから、判断を行います。
|
||||
|
||||
@@ -143,7 +142,7 @@ Goではtimeの処理パッケージを提供しています。ユーザの入
|
||||
timeを取得した後、多くの時間関数の操作を行うことができます。具体的な判断は自身の要件に合わせて調整してください。
|
||||
|
||||
## 身分証明書番号
|
||||
フォームに入力された身分証を検証する場合、正規表現を使っても簡単に検証できます。しかし身分証明書番号は15桁と18桁があるので2つとも検証しなければなりません。
|
||||
フォームに入力された身分証を検証する場合、正規表現を使っても簡単に検証できます。しかし身分証明書番号は15桁と18桁があるので2つとも検証しなければなりません。(訳注:中国では身分証明書とともに個人を特定する国民背番号があります。)
|
||||
|
||||
//15桁の身分証明書の検証。15桁はすべて数字です。
|
||||
if m, _ := regexp.MatchString(`^(\d{15})$`, r.Form.Get("usercard")); !m {
|
||||
@@ -154,7 +153,6 @@ timeを取得した後、多くの時間関数の操作を行うことができ
|
||||
if m, _ := regexp.MatchString(`^(\d{17})([0-9]|X)$`, r.Form.Get("usercard")); !m {
|
||||
return false
|
||||
}
|
||||
//(訳注:中国では身分証明書とともに個人を特定する国民背番号があります。)
|
||||
|
||||
以上よく使用されるサーバ側でのフォーム要素の検証をいくつかご紹介しました。このイントロダクションを通してGoによるデータ検証、特に正規表現での処理に対する理解が深まるよう願っています。
|
||||
|
||||
|
||||
@@ -66,4 +66,3 @@ Goのhtml/templateパッケージはデフォルトでhtmlタグをフィルタ
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [入力値の検証](<04.2.md>)
|
||||
* 次へ: [フォームの複数回送信の防止](<04.4.md>)
|
||||
|
||||
|
||||
@@ -56,4 +56,3 @@ tokenはすでに出力値を持っていますので、連続してページを
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [クロスサイトスクリプティングの予防](<04.3.md>)
|
||||
* 次へ: [ファイルのアップロード処理](<04.5.md>)
|
||||
|
||||
|
||||
@@ -153,4 +153,3 @@
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [フォームの多重送信の防止](<04.4.md>)
|
||||
* 次へ: [概要](<04.6.md>)
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# 4.6 概要
|
||||
这一章里面我们学习了Go如何处理表单信息,我们通过用户登陆、上传文件的例子展示了Go处理form表单信息及上传文件的手段。但是在处理表单过程中我们需要验证用户输入的信息,考虑到网站安全的重要性,数据过滤就显得相当重要了,
|
||||
この一章ではGoでどのようにフォームの情報を処理するか学びました。ユーザのログインから、ファイルのアップロードの例で、Goがformの情報およびファイルをアップロードする手段についてご説明しました。しかし、フォームを処理する過程ではユーザの入力した情報を懸賞する必要があります。ホームページのセキュリティの重要性を考慮すると、データのフィルタリングは相当重要です。そのため、以降の章では異なる方面のデータフィルタリングをご説明します。同時にGoの文字列に対する正規表現についても述べます。
|
||||
|
||||
この一章を通してクライアントとサーバが如何にデータを互いにやりとりするか理解いただけたと思います。クライアントはデータをサーバシステムに渡し、サーバはデータを受け取って結果をクライアントにフィードバックします。
|
||||
@@ -8,4 +7,3 @@
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [ファイルのアップロードの処理](<04.5.md>)
|
||||
* 次へ: [データベースへのアクセス](<05.0.md>)
|
||||
|
||||
|
||||
@@ -12,4 +12,3 @@ Goはどのようなデータベースの使用もbuiltinではサポートさ
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [第四章概要](<04.6.md>)
|
||||
* 次へ: [database/sqlインターフェース](<05.1.md>)
|
||||
|
||||
|
||||
@@ -116,4 +116,3 @@ Goがサポートするsqliteのドライバも比較的多いのですが、大
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [MySQLデータベースの使用](<05.2.md>)
|
||||
* 次へ: [PostgreSQLデータベースの使用](<05.4.md>)
|
||||
|
||||
|
||||
@@ -7,4 +7,3 @@
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [NOSQLデータベースの操作](<05.6.md>)
|
||||
* 次へ: [sessionとデータの保存](<06.0.md>)
|
||||
|
||||
|
||||
@@ -10,4 +10,3 @@ Web開発ではどのようにしてユーザの閲覧家庭のすべてをコ
|
||||
* [目次](<preface.md>)
|
||||
* 前へ: [第五章概要](<05.7.md>)
|
||||
* 次へ: [sessionとcookie](<06.1.md>)
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ XMLはデータと情報のやりとりするための形式として十分普
|
||||
|
||||
あなたが作業員だとして、あなたが管理するすべてのサーバに以下のような内容のxmlの設定ファイルを作成するとします:
|
||||
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<servers version="1">
|
||||
<server>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# 7.2 JSONの処理
|
||||
JSON(Javascript Object Notation)は軽量なデータ記述言語です。文字を基礎とした言語のテキスト形式で、C言語ファミリーに似た習慣を採用しています。JSONとXMLの最も大きな違いはXMLが完全なマークアップ言語であるのに対し、JSONがそうでない点です。JSONはXMLに比べ小さく、早く簡単に解析でき、ブラウザのビルトインの素早い解析のサポートもあり、ネットワークのデータ転送分野により適しています。現在我々が見ることのできる多くのオープンプラットフォームでは基本的にJSONをデータ交換のインターフェースとして採用しています。JSONはWeb開発の中でもこのように重要でありますから、Go言語ではJSONのサポートはどうなっているのでしょうか?Go言語の標準ライブラリはすでに非常に良くJSONをサポートしています。JSONデータに対してとても簡単にエンコード/デコードといった作業を行うことができます。
|
||||
|
||||
|
||||
前の節の操作の例でJSONを使って表示しました。結果は以下の通りです:
|
||||
|
||||
{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"127.0.0.2"}]}
|
||||
|
||||
@@ -45,7 +45,6 @@ Matchパターンは文字列の判断に対してのみ使うことができ、
|
||||
|
||||
我々はよく一種のスクレイピングプログラムが必要となります。下ではスクレイピングを例にどのように正規表現を使って取得したデータに対しフィルタリングまたは切り取りを行うかご説明します:
|
||||
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
||||
@@ -69,7 +69,6 @@ Go言語のテンプレートは`{{}}`を通して適用時に置換する必要
|
||||
上の例でどのようにひとつのオブジェクトのフィールドを出力するか示しました。もしフィールドの中にまたオブジェクトがある場合は、どのようにループしてこれらの内容を出力するのでしょうか?ここでは`{{with ...}}...{{end}}`と`{{range ...}}{{end}}`によってデータを出力することができます。
|
||||
|
||||
- {{range}} はGo言語の中のrangeに似ています。ループしてデータを操作します
|
||||
- {{with}}操作是指当前对象的值,类似上下文的概念
|
||||
- {{with}}操作は現在のオブジェクトの値を指します。コンテキストの概念に似ています。
|
||||
|
||||
詳細な使用方法は以下の例をご覧ください:
|
||||
|
||||
@@ -72,7 +72,6 @@
|
||||
|
||||
- func Fields(s string) []string
|
||||
|
||||
去除s字符串的空格符,并且按照空格分割返回slice
|
||||
s文字列の空白文字を除去し、空白に従って分割されたsliceを返します。
|
||||
|
||||
fmt.Printf("Fields are: %q", strings.Fields(" foo bar baz "))
|
||||
|
||||
@@ -104,9 +104,7 @@ GoにはRESTに対する直接のサポートはありません。しかし、RE
|
||||
http.ListenAndServe(":8088", nil)
|
||||
}
|
||||
|
||||
上面的代码演示了如何编写一个REST的应用,我们访问的资源是用户,我们通过不同的method来访问不同的函数,这里使用了第三方库`github.com/drone/routes`,在前面章节我们介绍过如何实现自定义的路由器,这个库实现了自定义路由和方便的路由规则映射,通过它,我们可以很方便的实现REST的架构。通过上面的代码可知,REST就是根据不同的method访问同一个资源的时候实现不同的逻辑处理。
|
||||
上のコードではどのようにRESTなアプリケーションを書くかご覧いただきました。我々がアクセスするリソースはユーザです。異なるmethodによって異なる関数にアクセスしました。ここではサードパーティライブラリ`github.com/drone/routes`を使用しています。前の章でどのように自分で定義したルータを実現するかご紹介しました。このライブラリは自分で定義したルートと便利なルートのルールを反映させます。
|
||||
これを使って簡単にRESTのフレームワークを実装することができます。
|
||||
上のコードではどのようにRESTなアプリケーションを書くかご覧いただきました。我々がアクセスするリソースはユーザです。異なるmethodによって異なる関数にアクセスしました。ここではサードパーティライブラリ`github.com/drone/routes`を使用しています。前の章でどのように自分で定義したルータを実現するかご紹介しました。このライブラリは自分で定義したルートと便利なルートのルールを反映させます。これを使って簡単にRESTのフレームワークを実装することができます。
|
||||
|
||||
## 概要
|
||||
RESTはフレームワークスタイルの一種です。WWWの成功経験を汲み取っています:ステートレス、リソースを中心とし、HTTPプロトコルとURIプロトコルを十分利用しています。統一したインターフェース定義を提供し、Webサービスを設計する方法の一つとして流行しました。ある意味で、URIとHTTPといった黎明期のInternet標準を強調することで、RESTは大型のアプリケーションプログラムサーバ時代の前のWeb方式に回帰しています。現在GoはRESTに対するサポートはやはり簡単です。自分dね定義したルーティングを通して、異なるmethodに異なるhandleを実装することができます。このようにRESTのフレームワークは実現されています。
|
||||
|
||||
@@ -27,7 +27,6 @@ RPC(Remote Procedure Call Protocol) 、このリモートプロセスのコ
|
||||
## Go RPC
|
||||
Go標準パッケージではすでにRPCをに対するサポートがされています。また、3つのレベルとなるRPC、HTTP、JSONRPCをサポートしています。しかしGoのRPCパッケージは唯一無二のRPCであり、伝統的なRPCシステムとは異なります。これはGoが開発したサーバとクライアント間のやりとりのみをサポートします。なぜなら内部ではGoを採用してエンコードされているからです。
|
||||
|
||||
Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:
|
||||
Go RPCの関数は以下の条件に合致した時のみリモートアクセスされます。そうでないものは無視されます。細かい条件は以下の通り:
|
||||
|
||||
- 関数はエクスポートされていなければなりません。(頭文字が大文字)
|
||||
@@ -93,8 +92,7 @@ httpのサーバコードは以下の通り:
|
||||
|
||||
上の例を見ると、ArithのRPCサーバを登録しており、`rpc.HandleHTTP`関数を使ってこのサービスをHTTPプロトコルに登録し、httpのメソッドを使ってデータを転送することができるとわかります。
|
||||
|
||||
请看下面的客户端代码:
|
||||
下のクライアントのコードをご覧ください。
|
||||
下のクライアントのコードをご覧ください:
|
||||
|
||||
package main
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ SQLインジェクションが発生する原因はプログラムがユーザ
|
||||
password:=r.Form.Get("password")
|
||||
sql:="SELECT * FROM user WHERE username='"+username+"' AND password='"+password+"'"
|
||||
|
||||
如果用户的输入的用户名如下,密码任意
|
||||
もしユーザが以下のようなユーザ名を入力して、パスワードが任意だった場合
|
||||
|
||||
myuser' or 'foo' = 'foo' --
|
||||
|
||||
@@ -48,7 +48,6 @@
|
||||
## 日付と日時のローカライズ
|
||||
タイムゾーンの関係で、同一時刻においても異なる地域でその表示は異なってきます。またLocaleの関係で、時間のフォーマットも全く異なってきます。例えば日本語の環境下では:`2013年 10月24日 水曜日 23時11分13秒 JST`となり、英語の環境下では`Wed Oct 24 23:11:13 CST 2012`のように表示されます。ここでは2つの項目を解決しなければなりません。
|
||||
|
||||
|
||||
1. タイムゾーンの問題
|
||||
2. フォーマットの問題
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ error型はインターフェース型の一つです。定義は:
|
||||
Error() string
|
||||
}
|
||||
|
||||
error是一个内置的接口类型,我们可以在/builtin/包下面找到相应的定义。而我们在很多内部包里面用到的 error是errors包下面的实现的私有结构errorString
|
||||
errorはビルトインのインターフェース型のひとつです。/builtin/パッケージの下に対応する定義を探すことができます。多くの内部パッケージにおいて使用されるerrorはerrorsパッケージ以下で実装されたプライベート構造体errorStringです。
|
||||
|
||||
// errorString is a trivial implementation of error.
|
||||
|
||||
@@ -21,7 +21,6 @@ GDBでよく使うコマンドのいくつかは以下の通りです
|
||||
|
||||
- list
|
||||
|
||||
简写命令`l`,用来显示源代码,默认显示十行代码,后面可以带上参数显示的具体行,例如:`list 15`,显示十行代码,其中第15行在显示的十行里面的中间,如下所示。
|
||||
`l`と省略されます。ソースコードを表示するために使用されます。デフォルトで10行のコードを表示します。後ろに表示する具体的な行をパラメータとして渡すことができます。例えば:`list 15`では10行のコードを表示し、以下のように15行目が10行のうちの中心に表示されます。
|
||||
|
||||
10 time.Sleep(2 * time.Second)
|
||||
|
||||
@@ -167,7 +167,6 @@ redisのリストアはホットバックアップとコールドバックアッ
|
||||
|
||||
## 概要
|
||||
この節ではアプリケーションのバックアップとリストアについてご紹介しました。ファイルのバックアップからデータベースのバックアップまで、どのように災害に対応するかです。また、rsyncを使った異なるシステムでのファイルの同期についてもご紹介しました。MySQLデータベースとredisデータベースのバックアップとリストアです。この節の紹介を通して開発された本番プロダクトの障害に対するひとつの参考になれば幸いです。
|
||||
|
||||
|
||||
## links
|
||||
* [目次](<preface.md>)
|
||||
|
||||
@@ -94,4 +94,3 @@
|
||||
- 14.6 [pprofのサポート](14.6.md)
|
||||
- 14.7 [概要](14.7.md)
|
||||
* 付録A [参考資料](ref.md)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user