46746
Flaskでアプリを作っています。

```

    @app.route('/my-route')
    def my_route():
      id = request.args.get('id')
    
```

とコードを書きました。 例えばlocalhost:8000/my-route?id=aDj1948と
urlを書いて実行できます。request.argsのパラメータが正しい型か制御文字を含んでいないか、故意に書き換えられるようになっていないかの３点をvalidationをidパラメータに対してかけたいです。  
Formの中身に対してのvalidationの方法しか検索しても見つからず、やりたいことを実装するにはどのようにコードを書けばいいのでしょうか？
CC BY-SA 4.0
2018-07-19T15:24:34.210
46735
2018-07-20T06:04:33.497
29379
question
python flask
パラメータに対してvalidationをかけたい
> request.argsのパラメータが  
>  1. 正しい型か  
>  2. 制御文字を含んでいないか、  
>  3. 故意に書き換えられるようになっていないか  
>  の３点をvalidationをidパラメータに対してかけたいです。

ご質問の1、2については、  
本家のstackoverflowに類似の質問がありました。

[How to validate URL parameters in Flask
app?](https://stackoverflow.com/questions/29568540/how-to-validate-url-
parameters-in-flask-app)

上記の質問では、[voluptuous](https://github.com/alecthomas/voluptuous)というライブラリを使う方法で解決されたようです。

使い方の例としては、以下になります。

```

    from voluptuous import Schema, Required, All, Range, Coerce, MultipleInvalid
    
    schema = Schema({
        # idパラメータは必須で、値が intに変換可能 かつ 1000〜2000の範囲内
        Required('id'): All(Coerce(int), Range(min=1000, max=2000)),
    })
    
    # パラメータが正しい場合
    # schema(request.args)
    schema({'id': '1948'}) # => {'id': 1948}
    
    # パラメータが不正な場合、MultipleInvalid例外が発生
    try:
        schema({'id': 'aDj1948'})
    except MultipleInvalid as e:
        str(e) # => expected int for dictionary value @ data['id']
    
```

ご質問の「3.
故意に書き換えられるようになっていないか」については、改竄をチェックしたいという意味であれば、別途、改竄防止の仕組み(署名のパラメータを追加するなど)を検討する必要があります。
CC BY-SA 4.0
2018-07-19T22:44:07.753
46746
2018-07-19T22:44:07.753
46735
answer
**1. 正しい型か**

`request.args.get`は型指定が可能なので、そこで型指定することでチェックできます。

```

    request.args.get("id", default="", type=str)
    
```

**2. 制御文字を含んでいないか**

今回は、「故意に書き換えられるようになっていないか」のチェックをするのであればそこでチェックできるので不要ですが、制御文字を含んでいるかどうかは正規表現を使えば次のようにかけます。

```

    re.match(r'[\x00-\x1f\x7f-\x9f]' , id)
    
```

**3. 故意に書き換えられるようになっていないか**

まず、どのクライアントからのアクセスであるかを管理しないといけないので、セッションを使う必要があります。セッション毎に送信したidの情報をキャッシュに保存しておいてそれと照合すれば、書き換えられたかどうかのチェックができます。

セッションの使い方については、公式ドキュメント[`flask session`](https://pythonhosted.org/Flask-
Session/)等で勉強してください。
CC BY-SA 4.0
2018-07-20T01:06:08.390
46749
2018-07-20T06:04:33.497
2018-07-20T06:04:33.497
15171
15171
46735
answer