msguard


Namemsguard JSON
Version 0.0.5 PyPI version JSON
download
home_pageNone
SummaryMindStudio Guard Repo
upload_time2025-07-15 00:41:39
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseApache-2.0
keywords ms guard security
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 安装

`pip3 install msguard`

# 使用

假设有如下函数

```py
def find_csv_path(input_dir):
	# 在 input_dir 下找到 csv 文件
	# xxx
```

需要对 `input_dir` 做校验,我们可以使用

## 装饰器用法
```py
from msguard import validate_params, Rule

@validate_params({'input_dir': Rule.input_dir_traverse})
def find_csv_path(input_dir):
	# xxx
```

这样,会在调用函数 `find_csv_path` 前,自动对入参 `input_dir` 进行路径校验。

注意事项:

1. `validate_params` 的入参是一个字典,字典的 key 值一定要和要校验的入参变量名一致,否则不会校验
2. 如果 `input_dir` 不满足条件会直接 raise 错误,如果不希望 raise 可以考虑下列其他使用方法

## 函数内部判断
```py
from msguard import validate_params, Rule

def find_csv_path(input_dir):
	if not Rule.input_dir_traverse.is_satisfied_by(input_dir):
        return
	# xxx
```

`Rule` 承载了所有的常规路径校验,其每一个属性都是一个校验项 `Constraint`,每个校验项会有一个方法叫做 `is_satisfied_by`,用于判断入参是否满足校验。因此 `Rule.input_dir_traverse.is_satisfied_by(input_dir)` 判断 `input_dir` 是否符合 `input_dir_traverse` 的要求。这里的逻辑是,如果不符合,则 `return`。这样,就可以避免直接 raise 导致的程序中断

## argparse 用法
```py
from msguard import validate_args

parser.add_argument('--input-path', type=validate_args(Rule.input_dir_traverse), help="输入目录")
```

我们很多命令行用法都使用的是标准库 `argparse`,该库的 `add_argument` 函数支持一个入参 `type`,可以支持自定义函数校验命令行入参。
安全库提供 `validate_args` 用法,接受一个入参 Constraint,用来限制命令行输入,如果判断通过,则返回输入的路径。在最外层进行安全防护,并传递真实路径杜绝软链接风险。

## 任意函数包裹
```py
import os

import pandas
from msguard import validate_params, Rule


def read_csv_from_dir(input_dir):
    csv_file = os.path.join(input_dir, "a.csv")
    df = validate_params({"filepath_or_buffer": Rule.input_file_read})(pd.read_csv)(csv_file)
```

我们有很多时候会遇到入参不是需要校验的对象,拼接之后的路径需要被校验。除了使用 [装饰器](#装饰器用法) 的方式外,我们可以将任意函数显式地包裹,如果不符合要求则自动报错。
这里我们通过 `validate_params` 装饰了 `pd.read_csv` 的三方库函数,要求它的入参 `"filepath_or_buffer"` 必须满足 `Rule.input_file_read`,否则报错。但是需要注意,这里 `"filepath_or_buffer"` 和 `pd.read_csv` 的第一个入参的变量名是一致的,如果入参名改动,则校验无效。

## 其他场景

除此之外,安全库还包含了其他的常用场景,如
- `open_s`:原 `msopen`,会在创建文件,读取文件时自动进行校验,返回句柄
- `walk_s`:会在遍历目录的时候自动进行最大文件数和深度判断
- `update_env_s`:会在添加环境变量搜索路径的时候,自动的判断是否为绝对路径,不会添加 trailing ":"。防护动态库劫持。

还有其他的用法等待大家的探索


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "msguard",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "ms, guard, security",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/99/33/14fa5b8310d54c050c2d7dd43a1115061c192b49df55925fee690b98122b/msguard-0.0.5.tar.gz",
    "platform": null,
    "description": "# \u5b89\u88c5\n\n`pip3 install msguard`\n\n# \u4f7f\u7528\n\n\u5047\u8bbe\u6709\u5982\u4e0b\u51fd\u6570\n\n```py\ndef find_csv_path(input_dir):\n\t# \u5728 input_dir \u4e0b\u627e\u5230 csv \u6587\u4ef6\n\t# xxx\n```\n\n\u9700\u8981\u5bf9 `input_dir` \u505a\u6821\u9a8c\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\n\n## \u88c5\u9970\u5668\u7528\u6cd5\n```py\nfrom msguard import validate_params, Rule\n\n@validate_params({'input_dir': Rule.input_dir_traverse})\ndef find_csv_path(input_dir):\n\t# xxx\n```\n\n\u8fd9\u6837\uff0c\u4f1a\u5728\u8c03\u7528\u51fd\u6570 `find_csv_path` \u524d\uff0c\u81ea\u52a8\u5bf9\u5165\u53c2 `input_dir` \u8fdb\u884c\u8def\u5f84\u6821\u9a8c\u3002\n\n\u6ce8\u610f\u4e8b\u9879\uff1a\n\n1. `validate_params` \u7684\u5165\u53c2\u662f\u4e00\u4e2a\u5b57\u5178\uff0c\u5b57\u5178\u7684 key \u503c\u4e00\u5b9a\u8981\u548c\u8981\u6821\u9a8c\u7684\u5165\u53c2\u53d8\u91cf\u540d\u4e00\u81f4\uff0c\u5426\u5219\u4e0d\u4f1a\u6821\u9a8c\n2. \u5982\u679c `input_dir` \u4e0d\u6ee1\u8db3\u6761\u4ef6\u4f1a\u76f4\u63a5 raise \u9519\u8bef\uff0c\u5982\u679c\u4e0d\u5e0c\u671b raise \u53ef\u4ee5\u8003\u8651\u4e0b\u5217\u5176\u4ed6\u4f7f\u7528\u65b9\u6cd5\n\n## \u51fd\u6570\u5185\u90e8\u5224\u65ad\n```py\nfrom msguard import validate_params, Rule\n\ndef find_csv_path(input_dir):\n\tif not Rule.input_dir_traverse.is_satisfied_by(input_dir):\n        return\n\t# xxx\n```\n\n`Rule` \u627f\u8f7d\u4e86\u6240\u6709\u7684\u5e38\u89c4\u8def\u5f84\u6821\u9a8c\uff0c\u5176\u6bcf\u4e00\u4e2a\u5c5e\u6027\u90fd\u662f\u4e00\u4e2a\u6821\u9a8c\u9879 `Constraint`\uff0c\u6bcf\u4e2a\u6821\u9a8c\u9879\u4f1a\u6709\u4e00\u4e2a\u65b9\u6cd5\u53eb\u505a `is_satisfied_by`\uff0c\u7528\u4e8e\u5224\u65ad\u5165\u53c2\u662f\u5426\u6ee1\u8db3\u6821\u9a8c\u3002\u56e0\u6b64 `Rule.input_dir_traverse.is_satisfied_by(input_dir)` \u5224\u65ad `input_dir` \u662f\u5426\u7b26\u5408 `input_dir_traverse` \u7684\u8981\u6c42\u3002\u8fd9\u91cc\u7684\u903b\u8f91\u662f\uff0c\u5982\u679c\u4e0d\u7b26\u5408\uff0c\u5219 `return`\u3002\u8fd9\u6837\uff0c\u5c31\u53ef\u4ee5\u907f\u514d\u76f4\u63a5 raise \u5bfc\u81f4\u7684\u7a0b\u5e8f\u4e2d\u65ad\n\n## argparse \u7528\u6cd5\n```py\nfrom msguard import validate_args\n\nparser.add_argument('--input-path', type=validate_args(Rule.input_dir_traverse), help=\"\u8f93\u5165\u76ee\u5f55\")\n```\n\n\u6211\u4eec\u5f88\u591a\u547d\u4ee4\u884c\u7528\u6cd5\u90fd\u4f7f\u7528\u7684\u662f\u6807\u51c6\u5e93 `argparse`\uff0c\u8be5\u5e93\u7684 `add_argument` \u51fd\u6570\u652f\u6301\u4e00\u4e2a\u5165\u53c2 `type`\uff0c\u53ef\u4ee5\u652f\u6301\u81ea\u5b9a\u4e49\u51fd\u6570\u6821\u9a8c\u547d\u4ee4\u884c\u5165\u53c2\u3002\n\u5b89\u5168\u5e93\u63d0\u4f9b `validate_args` \u7528\u6cd5\uff0c\u63a5\u53d7\u4e00\u4e2a\u5165\u53c2 Constraint\uff0c\u7528\u6765\u9650\u5236\u547d\u4ee4\u884c\u8f93\u5165\uff0c\u5982\u679c\u5224\u65ad\u901a\u8fc7\uff0c\u5219\u8fd4\u56de\u8f93\u5165\u7684\u8def\u5f84\u3002\u5728\u6700\u5916\u5c42\u8fdb\u884c\u5b89\u5168\u9632\u62a4\uff0c\u5e76\u4f20\u9012\u771f\u5b9e\u8def\u5f84\u675c\u7edd\u8f6f\u94fe\u63a5\u98ce\u9669\u3002\n\n## \u4efb\u610f\u51fd\u6570\u5305\u88f9\n```py\nimport os\n\nimport pandas\nfrom msguard import validate_params, Rule\n\n\ndef read_csv_from_dir(input_dir):\n    csv_file = os.path.join(input_dir, \"a.csv\")\n    df = validate_params({\"filepath_or_buffer\": Rule.input_file_read})(pd.read_csv)(csv_file)\n```\n\n\u6211\u4eec\u6709\u5f88\u591a\u65f6\u5019\u4f1a\u9047\u5230\u5165\u53c2\u4e0d\u662f\u9700\u8981\u6821\u9a8c\u7684\u5bf9\u8c61\uff0c\u62fc\u63a5\u4e4b\u540e\u7684\u8def\u5f84\u9700\u8981\u88ab\u6821\u9a8c\u3002\u9664\u4e86\u4f7f\u7528 [\u88c5\u9970\u5668](#\u88c5\u9970\u5668\u7528\u6cd5) \u7684\u65b9\u5f0f\u5916\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u4efb\u610f\u51fd\u6570\u663e\u5f0f\u5730\u5305\u88f9\uff0c\u5982\u679c\u4e0d\u7b26\u5408\u8981\u6c42\u5219\u81ea\u52a8\u62a5\u9519\u3002\n\u8fd9\u91cc\u6211\u4eec\u901a\u8fc7 `validate_params` \u88c5\u9970\u4e86 `pd.read_csv` \u7684\u4e09\u65b9\u5e93\u51fd\u6570\uff0c\u8981\u6c42\u5b83\u7684\u5165\u53c2 `\"filepath_or_buffer\"` \u5fc5\u987b\u6ee1\u8db3 `Rule.input_file_read`\uff0c\u5426\u5219\u62a5\u9519\u3002\u4f46\u662f\u9700\u8981\u6ce8\u610f\uff0c\u8fd9\u91cc `\"filepath_or_buffer\"` \u548c `pd.read_csv` \u7684\u7b2c\u4e00\u4e2a\u5165\u53c2\u7684\u53d8\u91cf\u540d\u662f\u4e00\u81f4\u7684\uff0c\u5982\u679c\u5165\u53c2\u540d\u6539\u52a8\uff0c\u5219\u6821\u9a8c\u65e0\u6548\u3002\n\n## \u5176\u4ed6\u573a\u666f\n\n\u9664\u6b64\u4e4b\u5916\uff0c\u5b89\u5168\u5e93\u8fd8\u5305\u542b\u4e86\u5176\u4ed6\u7684\u5e38\u7528\u573a\u666f\uff0c\u5982\n- `open_s`\uff1a\u539f `msopen`\uff0c\u4f1a\u5728\u521b\u5efa\u6587\u4ef6\uff0c\u8bfb\u53d6\u6587\u4ef6\u65f6\u81ea\u52a8\u8fdb\u884c\u6821\u9a8c\uff0c\u8fd4\u56de\u53e5\u67c4\n- `walk_s`\uff1a\u4f1a\u5728\u904d\u5386\u76ee\u5f55\u7684\u65f6\u5019\u81ea\u52a8\u8fdb\u884c\u6700\u5927\u6587\u4ef6\u6570\u548c\u6df1\u5ea6\u5224\u65ad\n- `update_env_s`\uff1a\u4f1a\u5728\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u641c\u7d22\u8def\u5f84\u7684\u65f6\u5019\uff0c\u81ea\u52a8\u7684\u5224\u65ad\u662f\u5426\u4e3a\u7edd\u5bf9\u8def\u5f84\uff0c\u4e0d\u4f1a\u6dfb\u52a0 trailing \":\"\u3002\u9632\u62a4\u52a8\u6001\u5e93\u52ab\u6301\u3002\n\n\u8fd8\u6709\u5176\u4ed6\u7684\u7528\u6cd5\u7b49\u5f85\u5927\u5bb6\u7684\u63a2\u7d22\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "MindStudio Guard Repo",
    "version": "0.0.5",
    "project_urls": {
        "documentation": "https://gitee.com/ascend/msit/tree/master/msprechecker",
        "source": "https://gitee.com/ascend/msit/tree/master/msserviceprofiler/msserviceprofiler",
        "tracker": "https://gitee.com/ascend/msit/issues"
    },
    "split_keywords": [
        "ms",
        " guard",
        " security"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4c0c8ea0ee563c536343b1360c396611181fb58b00b3b65dec7ff2b6989d1cdc",
                "md5": "8acf18f3713310f4c2c448473fac8ab9",
                "sha256": "f82b8245682ac7a44f9dbd1b1ef2d04a24bc80ccb745626e7acdb6e846c7357d"
            },
            "downloads": -1,
            "filename": "msguard-0.0.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8acf18f3713310f4c2c448473fac8ab9",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 31413,
            "upload_time": "2025-07-15T00:41:37",
            "upload_time_iso_8601": "2025-07-15T00:41:37.307303Z",
            "url": "https://files.pythonhosted.org/packages/4c/0c/8ea0ee563c536343b1360c396611181fb58b00b3b65dec7ff2b6989d1cdc/msguard-0.0.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "993314fa5b8310d54c050c2d7dd43a1115061c192b49df55925fee690b98122b",
                "md5": "3ea24b1e9cee6e4e80b0f793fa1fd80c",
                "sha256": "8e299c99bc8435090ce397012fcc541aaca6d9bbf447aa1d18019dd2dd5b5630"
            },
            "downloads": -1,
            "filename": "msguard-0.0.5.tar.gz",
            "has_sig": false,
            "md5_digest": "3ea24b1e9cee6e4e80b0f793fa1fd80c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 19530,
            "upload_time": "2025-07-15T00:41:39",
            "upload_time_iso_8601": "2025-07-15T00:41:39.546903Z",
            "url": "https://files.pythonhosted.org/packages/99/33/14fa5b8310d54c050c2d7dd43a1115061c192b49df55925fee690b98122b/msguard-0.0.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-15 00:41:39",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "msguard"
}
        
Elapsed time: 0.41669s