Skip to content

Commit 30f517b

Browse files
committed
Merge pull request astaxie#546 from zgordan-vv/ru
Ru
2 parents e42e236 + e9dc2f8 commit 30f517b

File tree

1 file changed

+52
-50
lines changed

1 file changed

+52
-50
lines changed

ru/04.2.md

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,82 @@
1-
# 4.2 Verification of inputs
1+
# 4.2 Проверка введенных данных
22

3-
One of the most important principles in web development is that you cannot trust anything from client side user forms. You have to verify all incoming data before use it. Many websites are affected by this problem, which is simple yet crucial.
3+
Одним из наиболее важных правил веб-разработки является то, что нельзя доверять никаким данным, поступившим из пользовательских форм. Вы должны проверять все входящие данные перед тем, как их использовать. Множество веб-сайтов было затронуто этой очень серьезной проблемой.
44

5-
There are two ways of verify form data that are commonly used. One is JavaScript verification in the front-end, and the other is server verification in the back-end. In this section, we are going to talk about server side verification in web development.
5+
Существует два наиболее часто используемых способа проверить данные. Один - это проверка средствами Javascript на стороне браузера, а второй - проверка на стороне сервера. В этом разделе мы поговорим о проверке данных средствами сервера.
66

7-
## Required fields
87

9-
Sometimes we require that users input some fields but they don't, for example in the previous section when we required a username. You can use the `len` function to get the length of a field in order to ensure that users have entered this information.
8+
## Поля, обязательные к заполнению
9+
10+
Иногда требуется, чтобы пользователь заполнил определенные поля, но он этого не делает; например, в предыдущем разделе, когда нам требовалось имя пользователя. Чтобы получить длину строки в поле и быть уверенными, что пользователь заполнил его, мы можем использовать функцию `len`:
1011

1112
if len(r.Form["username"][0])==0{
12-
// code for empty field
13+
// код, выполняемый, если поле оказалось пустым
1314
}
1415

15-
`r.Form` treats different form element types differently when they are blank. For empty textboxes, text areas and file uploads, it returns an empty string; for radio buttons and check boxes, it doesn't even create the corresponding items. Instead, you will get errors if you try to access it. Therefore, it's safer to use `r.Form.Get()` to get field values since it will always return empty if the value does not exist. On the other hand, `r.Form.Get()` can only get one field value at a time, so you need to use `r.Form` to get the map of values.
16+
`r.Form` обрабатывает незаполненные поля различными способами в зависимости от их типа. Для пустых текстовых полей, текстовых областей и загружаемых файлов она возвращает пустую строку; для радиокнопок и чекбоксов просто не создаются соответствующие значения. Вместо этого при попытке доступа к ним Вы получите ошибку. Поэтому для получения значений безопаснее использовать `r.Form.Get()`, так как эта команда всегда возвращает пустые значения. С другой стороны, `r.Form.Get()` может получить только одно значение за один вызов, поэтому для того, чтобы получить карту значений, нужно использовать `r.Form`.
1617

17-
## Numbers
18+
## Числа
1819

19-
Sometimes you only need numbers for the field value. For example, let's say that you require the age of a user in integer form only, i.e 50 or 10, instead of "old enough" or "young man". If we require a positive number, we can convert the value to the `int` type first, then process it.
20+
Иногда значениями поля могут быть только числа. Например, Вам нужно получить возраст пользователя в целочисленном виде, т.е. 50 или 10, вместо "довольно взрослый" или "молодой человек". Если нам нужно положительное число, мы можем сначала конвертировать значение поля в тип `int`, а затем уже работать с ним:
2021

2122
getint,err:=strconv.Atoi(r.Form.Get("age"))
2223
if err!=nil{
23-
// error occurs when convert to number, it may not a number
24+
// если значение не конвертируется в целое число, то было введено не целое число
2425
}
2526

26-
// check range of number
27+
// проверяем диапазон значений
2728
if getint >100 {
28-
// too big
29+
// слишком много
2930
}
3031

31-
Another way to do this is using regular expressions.
32+
Другой способ проверки - это регулярные выражения:
3233

3334
if m, _ := regexp.MatchString("^[0-9]+$", r.Form.Get("age")); !m {
3435
return false
3536
}
3637

37-
For high performance purposes, regular expressions are not efficient, however simple regular expressions are usually fast enough. If you are familiar with regular expressions, it's a very convenient way to verify data. Notice that Go uses [RE2](http://code.google.com/p/re2/wiki/Syntax), so all UTF-8 characters are supported.
38+
Хотя регулярные выражения неэффективны в плане производительности, простые регулярные выражения довольно быстры. Если Вы с ними знакомы, то их использование может быть довольно-таки удобным способом проверить данные. Имейте в виду, что Go использует [RE2](http://code.google.com/p/re2/wiki/Syntax), что означает, что при работе с регулярными выражениями в Go поддерживаются все символы UTF-8.
3839

39-
## Chinese
40+
## Китайские символы
4041

41-
Sometimes we need users to input their Chinese names and we have to verify that they all use Chinese rather than random characters. For Chinese verification, regular expressions are the only way.
42+
Иногда нам нужно от пользователей, чтобы они вводили свои китайские имена, и нам нужно проверять, что они используют китайские, а не случайные символы. Для осуществления этой задачи регулярные выражения - единственный способ.
4243

4344
if m, _ := regexp.MatchString("^[\\x{4e00}-\\x{9fa5}]+$", r.Form.Get("realname")); !m {
4445
return false
4546
}
4647

47-
## English letters
48+
## Английские буквы
4849

49-
Sometimes we need users to input only English letters. For example, we require someone's English name, like astaxie instead of asta谢. We can easily use regular expressions to perform our verification.
50+
Иногда нужно, чтобы пользователь вводил только английские буквы. Предположим, нам нужно, чтобы пользователь вводил свое имя по-английски, например, astaxie, а не asta谢. Чтобы легко осуществить такую проверку, можно воспользоваться регулярными выражениями:
5051

5152
if m, _ := regexp.MatchString("^[a-zA-Z]+$", r.Form.Get("engname")); !m {
5253
return false
5354
}
55+
( ***Прим. переводчика на русский язык - для русского языка регулярка в данном случае будет выглядеть как "[А-аЯ-яЁё]+$"*** )
5456

55-
## E-mail address
57+
## Адрес E-mail
5658

57-
If you want to know whether users have entered valid E-mail addresses, you can use the following regular expression:
59+
Если Вам нужно узнать, ввел ли пользователь корректный адрес E-mail, можно использовать следующее регулярное выражение:
5860

5961
if m, _ := regexp.MatchString(`^([\w\.\_]{2,10})@(\w{1,}).([a-z]{2,4})$`, r.Form.Get("email")); !m {
60-
fmt.Println("no")
62+
fmt.Println("нет")
6163
}else{
62-
fmt.Println("yes")
64+
fmt.Println("да")
6365
}
6466

65-
## Drop down list
67+
## Выпадающий список
6668

67-
Let's say we require an item from our drop down list, but instead we get a value fabricated by hackers. How do we prevent this from happening?
69+
Допустим, нам нужно получить значение из выпадающего списка, но вместо этого мы получаем значение, сфабрикованное хакерами. Как предотвратить такой случай?
6870

69-
Suppose we have the following `<select>`:
71+
Предположим, у нас есть следующий `<select>`:
7072

7173
<select name="fruit">
72-
<option value="apple">apple</option>
73-
<option value="pear">pear</option>
74-
<option value="banana">banana</option>
74+
<option value="apple">Яблоко</option>
75+
<option value="pear">Груша</option>
76+
<option value="banana">Банан</option>
7577
</select>
7678

77-
We can use the following strategy to sanitize our input:
79+
Для очистки вводимых данных можно использовать следующую стратегию:
7880

7981
slice:=[]string{"apple","pear","banana"}
8082

@@ -85,16 +87,16 @@ We can use the following strategy to sanitize our input:
8587
}
8688
return false
8789

88-
All the functions I've shown above are in my open source project for operating on slices and maps: [https://github.com/astaxie/beeku](https://github.com/astaxie/beeku)
90+
Все функции, котоые я показал выше, есть в моем open source проекте для оперирования срезами и картами: [https://github.com/astaxie/beeku](https://github.com/astaxie/beeku)
8991

90-
## Radio buttons
92+
## Радиокнопки
9193

92-
If we want to know whether the user is male or female, we may use a radio button, returning 1 for male and 2 for female. However, some little kid who just read his first book on HTTP, decides to send to you a 3. Will your program have have exception? As you can see, we need to use the same method as we did for our drop down list to make sure that only expected values are returned by our radio button.
94+
Если нам нужно узнать пол пользователя, мы можем воспользоваться радиокнопками, которые будут возвращать "1" для мужчины и "2" для женщины. Однако, какой-нибудь маленький ребенок, прочитав свою первую книгу по HTTP, захочет послать Вам "3". Будет ли готова Ваша программа обработать это исключение? Как Вы увидите, для того, чтобы узнать, послано ли нам значение из нужного диапазона, мы используем тот же метод, что и для выпадающих списков:
9395

94-
<input type="radio" name="gender" value="1">Male
95-
<input type="radio" name="gender" value="2">Female
96+
<input type="radio" name="gender" value="1">Мужчина
97+
<input type="radio" name="gender" value="2">Женщина
9698

97-
And we use following code to verify the input:
99+
Для проверки мы используем следующий код:
98100

99101
slice:=[]int{1,2}
100102

@@ -105,15 +107,15 @@ And we use following code to verify the input:
105107
}
106108
return false
107109

108-
## Check boxes
110+
## Чекбоксы
109111

110-
Suppose there are some check boxes for user interests, and that you don't want extraneous values here either.
112+
Предположим у нас имеются несколько чекбоксов для получения информации об интересах пользователя, и мы не хотим, чтобы они возвращали непредусмотренные значения.
111113

112-
<input type="checkbox" name="interest" value="football">Football
113-
<input type="checkbox" name="interest" value="basketball">Basketball
114-
<input type="checkbox" name="interest" value="tennis">Tennis
114+
<input type="checkbox" name="interest" value="football">Футбол
115+
<input type="checkbox" name="interest" value="basketball">Баскетбол
116+
<input type="checkbox" name="interest" value="tennis">Теннис
115117

116-
In this case, the sanitization is a little bit different than verifying the button and check box inputs since here we get a slice from the check boxes.
118+
В этом случае проверка входящих данных немного отличается от того, что было с радиокнопками, так как чекбокс возвращает срез значений:
117119

118120
slice:=[]string{"football","basketball","tennis"}
119121
a:=Slice_diff(r.Form["interest"],slice)
@@ -123,19 +125,19 @@ In this case, the sanitization is a little bit different than verifying the butt
123125

124126
return false
125127

126-
## Date and time
128+
## Дата и время
127129

128-
Suppose you want users to input valid dates or times. Go has the `time` package for converting year, month and day to their corresponding times. After that, it's easy to check it.
130+
Предположим, Вы хотите, чтобы пользователи вводили дату и время правильно. Для конвертирования лет, месяцев и дней в соответствующие значения типа 'time' в Go есть пакет `time`. С его помощью можно легко проверить введенную дату.
129131

130132
t := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
131-
fmt.Printf("Go launched at %s\n", t.Local())
133+
fmt.Printf("Go запущен в %s\n", t.Local())
132134

133-
After you have the time, you can use the `time` package for more operations, depending on your needs.
135+
После того, как нам стало известно время, мы можем использовать пакет `time` для решения еще большего числа задач в зависимости от наших потребностей.
134136

135-
In this section, we've discussed some common methods for verifying form data server side. I hope that you now understand more about data verification in Go, especially how to use regular expressions to your advantage.
137+
В этом разделе мы обсудили несколько общих способов проверки данных пользовательских форм на стороне сервера. Я надеюсь, что теперь Вы больше понимаете о проверке данных в Go, особенно о том, как использовать регулярные выражения.
136138

137-
## Links
139+
## Ссылки
138140

139-
- [Directory](preface.md)
140-
- Previous section: [Process form inputs](04.1.md)
141-
- Next section: [Cross site scripting](04.3.md)
141+
- [Содержание](preface.md)
142+
- Предыдущий раздел: [Работа с формами](04.1.md)
143+
- Следующий раздел: [Межсайтовый скриптинг](04.3.md)

0 commit comments

Comments
 (0)