Flutter插件验证功能插件shelf_host_validation的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter插件验证功能插件shelf_host_validation的使用

Sheld Host Validation

中间件通过验证来自传入请求的Host和Referer头来保护Shelf和DartFrog服务器免受DNS重新绑定攻击。如果请求不包含白名单中的Host或Referer头,shelf_host_validation 将返回一个HTTP 403禁止错误。该插件灵感来源于https://github.com/brannondorsey/host-validation

安装

dart pub add shelf_host_validation

使用

参数:

  • [hosts] 是允许的主机列表,可以是正则表达式或字符串。
  • [referers] 是允许的Referer列表,可以是正则表达式或字符串。
  • [mode] 是[ValidationMode],可以是两者之一或全部。
  • [errorResponse] 是在验证失败时返回的[Response]。
作为Shelf中间件
import 'package:shelf_host_validation/shelf_host_validation.dart';

var handler = const Pipeline()
    .addMiddleware(
      validateHost(
        hosts: ['trusted-host.com'],  // 允许的主机列表
        referers: [                    // 允许的Referer列表
          'http://trusted-host.com/login.php',
          RegExp(r'^https:\/\/'),
        ],
      ),
    )
    .addMiddleware(logRequests())  // 添加日志记录中间件
    .addHandler(_echoRequest);     // 处理函数
作为DartFrog中间件
import 'package:shelf_host_validation/shelf_host_validation.dart';

Handler enforceSSL(Handler handler) {
  return handler.use(
    fromShelfMiddleware(
      validateHost(
        hosts: ['trusted-host.com'],  // 允许的主机列表
        referers: [                   // 允许的Referer列表
          'http://trusted-host.com/login.php',
          RegExp(r'^https:\/\/'),
        ],
      ),
    ),
  );
}

示例

在你的Shelf API中添加中间件

通过简单地添加:

.addMiddleware(validateHost(host: ['localhost:3000'])),

你可以定义自定义的错误响应,通过设置errorResponse参数:

.addMiddleware(
    enforceSSL(
        errorResponse: Response(
            403,
            body: '只能使用HTTPS发送数据到此API',
        ),
    ),
),

你也可以在DartFrog中使用中间件,通过以下方式:

Handler maxContentLengthValidator(Handler handler) {
    return handler.use(fromShelfMiddleware(enforceSSl()));
}
完整示例
import 'package:shelf_host_validation/shelf_host_validation.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;

void main() async {
  final handler = const Pipeline()
      .addMiddleware(
        validateHost(
          hosts: ['YOUR_HOST_URL'],  // 替换为你的主机URL
          referers: [                // 允许的Referer列表
            RegExp(r'^https:\/\/'),
          ],
          errorResponse: Response(
              403,
              body: '只能使用HTTPS发送数据到此API',
          ),
        ),
      )
      .addMiddleware(logRequests())  // 添加日志记录中间件
      .addHandler(_echoRequest);     // 处理函数

  final server = await shelf_io.serve(handler, 'localhost', 8080);

  // 启用内容压缩
  server.autoCompress = true;

  print('Serving at http://${server.address.host}:${server.port}');
}

Response _echoRequest(Request request) => Response.ok('Request for "${request.url}"');

更多关于Flutter插件验证功能插件shelf_host_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件验证功能插件shelf_host_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用shelf_host_validation插件的示例代码。请注意,shelf_host_validation这个插件名称听起来更像是用于Dart后端框架Shelf的一个验证库,而不是一个直接用于Flutter(Flutter主要用于构建移动应用)的插件。然而,假设这个插件是为了某种形式的验证(可能是网络请求验证),并且它适用于Flutter项目中的Dart代码,以下是一个可能的集成和使用方式。

由于shelf_host_validation在Flutter生态系统中可能不是一个广为人知的插件,我将基于一个假设的API和验证流程来编写示例代码。如果shelf_host_validation实际上是一个Flutter插件,并且存在于pub.dev上,你应该首先通过以下命令添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  shelf_host_validation: ^x.y.z  # 替换为实际的版本号

然后运行flutter pub get来获取依赖。

以下是一个Flutter项目的示例,展示了如何使用一个假设的验证插件来处理网络请求的验证:

1. 添加依赖并获取

确保你的pubspec.yaml文件中包含了对shelf_host_validation(或任何实际存在的验证库)的依赖。

2. 编写验证逻辑

假设shelf_host_validation提供了某些验证函数,我们可以编写一个Dart文件来封装这些验证逻辑。例如,创建一个validation_service.dart文件:

import 'package:shelf_host_validation/shelf_host_validation.dart' as validation; // 假设的导入路径

class ValidationService {
  // 示例验证函数,使用shelf_host_validation的假设API
  static bool validateData(Map<String, dynamic> data) {
    // 假设validation库有一个validate函数,用于验证数据
    // 这里是伪代码,具体实现取决于shelf_host_validation的实际API
    return validation.validate(data) == null; // 如果没有错误,返回true
  }
}

3. 在Flutter组件中使用验证服务

在你的Flutter组件中,你可以调用这个验证服务来处理用户输入或网络请求的数据。例如,在main.dart中:

import 'package:flutter/material.dart';
import 'validation_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Validation Example'),
        ),
        body: ValidationForm(),
      ),
    );
  }
}

class ValidationForm extends StatefulWidget {
  @override
  _ValidationFormState createState() => _ValidationFormState();
}

class _ValidationFormState extends State<ValidationForm> {
  final _formKey = GlobalKey<FormState>();
  String _name = '';
  String _email = '';
  bool _isFormValid = false;

  void _validateAndSubmit() {
    if (_formKey.currentState?.validate() ?? false) {
      _formKey.currentState?.save();

      // 使用ValidationService进行验证
      bool isValid = ValidationService.validateData({
        'name': _name,
        'email': _email,
      });

      setState(() {
        _isFormValid = isValid;
      });

      if (_isFormValid) {
        // 处理有效的表单提交,例如发送网络请求
        print('Form is valid and ready to be submitted.');
      } else {
        // 处理无效的表单
        print('Form validation failed.');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextFormField(
              decoration: InputDecoration(labelText: 'Name'),
              validator: (value) {
                if (value == null || value.isEmpty) {
                  return 'Name is required.';
                }
                return null;
              },
              onSaved: (value) {
                _name = value;
              },
            ),
            TextFormField(
              decoration: InputDecoration(labelText: 'Email'),
              validator: (value) {
                if (value == null || value.isEmpty || !value.contains('@')) {
                  return 'Please enter a valid email address.';
                }
                return null;
              },
              onSaved: (value) {
                _email = value;
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _validateAndSubmit,
              child: Text('Submit'),
            ),
            if (!_isFormValid) ...[
              SizedBox(height: 10),
              Text('Validation failed. Please check your input.')
            ]
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 实际插件:请确保shelf_host_validation确实是一个存在的Flutter插件,并且你使用的是正确的导入路径和API。
  2. 错误处理:在实际应用中,你应该添加更多的错误处理和用户反馈。
  3. 安全性:对于敏感数据(如密码),确保在客户端和服务器端都进行适当的验证和加密。

由于shelf_host_validation可能不是实际存在的Flutter插件,以上代码是一个基于假设的示例。如果你正在寻找一个特定的验证库,请确保查阅其官方文档以获取正确的使用方法和API。

回到顶部