iguana
iguana copied to clipboard
解析时没有安全检查
我在尝试使用这个库时遇到一些问题,对于json字符串的解析,没有安全检查,比如某个字段类型不正确,不存在,iguana::json::from_json0()会仍然返回true,并且在对象中使用不正确的值. 举个例子: struct test { std::string username; std::string password; long long id; bool error; }; REFLECTION(test, username, password, id, error);
int main(void) { test test1; std::string str1 = "{"username1":"test","password":"test","id": 10.1, "error": false}"; auto ret = iguana::json::from_json0(test1, str1.c_str(), str1.length()); std::cout << test1.username << std::endl; std::cout << test1.password << std::endl; std::cout << test1.id << std::endl; std::cout << std::boolalpha << test1.error << std::endl; std::cout << std::boolalpha << ret << std::endl; return 0; } 以上代码,json字符串不存在username这个key,并且id的类型也不正确,但是解析仍然返回true. 我认为该库无法用于生产环境,因为解析的正确性不应该由使用库的用户来检查.
测试上面的代码时,我用的是vs2019,开启了c++最新标准与实验特性. 希望作者能确认是否是我使用环境的问题,还是本身这个库就不提供这些功能. 谢谢
from_json0这个接口应该存在bug,iguana最初设计的时候不考虑字段和结构体不对应的问题,后面才加的这个兼容接口,看起来这个接口存在bug,我抽空看看问题。
建议还是用from_json接口,保证json和结构体字段一一对应。
好的,谢谢
照你这个说法java的json解析库全部得嗝屁
from_json 严重依赖顺序和结构体的顺序一致,如果是其他语言基本没办法保证整个 问题比较大的
等晚一点再fix这些问题了,现在事情有点多哈,见谅。
TEST_CASE("test from issues") { test test1; std::string str1 = R"({"username1": "test", "password":test, "id": 10.1, "error": false})"; iguana::from_json(test1, str1.c_str(), str1.length()); std::cout << test1.username << std::endl; std::cout << test1.password << std::endl; std::cout << test1.id << std::endl; std::cout << std::boolalpha << test1.error << std::endl; }
目前master上,使用上述的case是会throw的了. @HarryLiIsMe
最新的代码是这样处理这种不存在的key: 如果用户设置了预定义宏:THROW_UNKNOWN_KEY,则会抛出这样的一个异常:Unknown key: username1。 如果用户没有设置这个预定义宏,那么这个unknown key会被忽略,不会抛异常,简言之,这种情况下,允许struct是json的子集。