Hi Yusuke I think ast.literal_eval is better than json.load.
Thanks a lot! Takeshi 2014-11-10 8:04 GMT+08:00 Yusuke Iwase <iwase.yusu...@gmail.com>: > Hi > > I'm just trying to make and test the same modification. > Thanks. > > I think ofctl_rest.py needs to be compatible with hexadecimal value > or ascii byte array (e.g. "\x00\x00\x00\x01" in Experimenter) > in order to keep usability. > But json.loads can not get hexadecimal value or ascii byte array. > > I suggest to use another function, e.g. ast.literal_eval() in > ofctl_rest.py. > > > How about this? > I modified your patch. > > --------------------------- > > It is not safe to use eval function because input data(request body) is > not checked > For example, someone can send this data to remove all files in the > directory > "import('os').system('rm -rf .')" > > I suggest to use json.loads to parse the request body if the data is json > format > or disable builtin functions like: > eval(req.body, {"__builtins__":None}) > > In this patch, ast.literal_eval() is used to evaluate REST body, > because ofctl_rest needs to be compatible with hexadecimal value > or ascii byte array (e.g. "\x00\x00\x00\x01" in Experimenter) > in order to keep usability. > > Signed-off-by: Takeshi <a86487...@gmail.com> > Signed-off-by: IWASE Yusuke <iwase.yusu...@gmail.com> > --- > ryu/app/ofctl_rest.py | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/ryu/app/ofctl_rest.py b/ryu/app/ofctl_rest.py > index 125554f..338d59e 100644 > --- a/ryu/app/ofctl_rest.py > +++ b/ryu/app/ofctl_rest.py > @@ -16,6 +16,7 @@ > import logging > > import json > +import ast > from webob import Response > > from ryu.base import app_manager > @@ -155,7 +156,7 @@ class StatsController(ControllerBase): > flow = {} > else: > try: > - flow = eval(req.body) > + flow = ast.literal_eval(req.body) > except SyntaxError: > LOG.debug('invalid syntax %s', req.body) > return Response(status=400) > @@ -326,7 +327,7 @@ class StatsController(ControllerBase): > > def mod_flow_entry(self, req, cmd, **_kwargs): > try: > - flow = eval(req.body) > + flow = ast.literal_eval(req.body) > except SyntaxError: > LOG.debug('invalid syntax %s', req.body) > return Response(status=400) > @@ -380,7 +381,7 @@ class StatsController(ControllerBase): > > def mod_meter_entry(self, req, cmd, **_kwargs): > try: > - flow = eval(req.body) > + flow = ast.literal_eval(req.body) > except SyntaxError: > LOG.debug('invalid syntax %s', req.body) > return Response(status=400) > @@ -413,7 +414,7 @@ class StatsController(ControllerBase): > > def mod_group_entry(self, req, cmd, **_kwargs): > try: > - group = eval(req.body) > + group = ast.literal_eval(req.body) > except SyntaxError: > LOG.debug('invalid syntax %s', req.body) > return Response(status=400) > @@ -448,7 +449,7 @@ class StatsController(ControllerBase): > > def mod_port_behavior(self, req, cmd, **_kwargs): > try: > - port_config = eval(req.body) > + port_config = ast.literal_eval(req.body) > except SyntaxError: > LOG.debug('invalid syntax %s', req.body) > return Response(status=400) > @@ -493,7 +494,7 @@ class StatsController(ControllerBase): > return Response(status=404) > > try: > - exp = eval(req.body) > + exp = ast.literal_eval(req.body) > except SyntaxError: > LOG.debug('invalid syntax %s', req.body) > return Response(status=400) > -- > 1.9.1 > > > > The patches for rest_firewall.py and rest_qos.py looks good to me. > > Thanks. > > On 2014年11月09日 20:41, Yi Tseng wrote: > > It is not safe to use eval function because input data(request body) is > not checked > > > > For example, someone can send this data to remove all files in the > directory > > > > "import('os').system('rm -rf .')" > > > > I suggest to use json.loads to parse the request body if the data is > json format > > > > or disable builtin functions like: > > > > eval(req.body, {"__builtins__":None}) > > > > Signed-off-by: Takeshi <a86487...@gmail.com <mailto:a86487...@gmail.com > >> > > --- > > ryu/app/ofctl_rest.py | 12 ++++++------ > > ryu/app/rest_firewall.py | 4 ++-- > > ryu/app/rest_qos.py | 2 +- > > 3 files changed, 9 insertions(+), 9 deletions(-) > > > > diff --git a/ryu/app/ofctl_rest.py b/ryu/app/ofctl_rest.py > > index 125554f..94cbeb2 100644 > > --- a/ryu/app/ofctl_rest.py > > +++ b/ryu/app/ofctl_rest.py > > @@ -155,7 +155,7 @@ class StatsController(ControllerBase): > > flow = {} > > else: > > try: > > - flow = eval(req.body) > > + flow = json.loads(req.body) > > except SyntaxError: > > LOG.debug('invalid syntax %s', req.body) > > return Response(status=400) > > @@ -326,7 +326,7 @@ class StatsController(ControllerBase): > > > > def mod_flow_entry(self, req, cmd, **_kwargs): > > try: > > - flow = eval(req.body) > > + flow = json.loads(req.body) > > except SyntaxError: > > LOG.debug('invalid syntax %s', req.body) > > return Response(status=400) > > @@ -380,7 +380,7 @@ class StatsController(ControllerBase): > > > > def mod_meter_entry(self, req, cmd, **_kwargs): > > try: > > - flow = eval(req.body) > > + flow = json.loads(req.body) > > except SyntaxError: > > LOG.debug('invalid syntax %s', req.body) > > return Response(status=400) > > @@ -413,7 +413,7 @@ class StatsController(ControllerBase): > > > > def mod_group_entry(self, req, cmd, **_kwargs): > > try: > > - group = eval(req.body) > > + group = json.loads(req.body) > > except SyntaxError: > > LOG.debug('invalid syntax %s', req.body) > > return Response(status=400) > > @@ -448,7 +448,7 @@ class StatsController(ControllerBase): > > > > def mod_port_behavior(self, req, cmd, **_kwargs): > > try: > > - port_config = eval(req.body) > > + port_config = json.loads(req.body) > > except SyntaxError: > > LOG.debug('invalid syntax %s', req.body) > > return Response(status=400) > > @@ -493,7 +493,7 @@ class StatsController(ControllerBase): > > return Response(status=404) > > > > try: > > - exp = eval(req.body) > > + exp = json.loads(req.body) > > except SyntaxError: > > LOG.debug('invalid syntax %s', req.body) > > return Response(status=400) > > diff --git a/ryu/app/rest_firewall.py b/ryu/app/rest_firewall.py > > index 01eb6e2..4e52b1f 100644 > > --- a/ryu/app/rest_firewall.py > > +++ b/ryu/app/rest_firewall.py > > @@ -492,7 +492,7 @@ class FirewallController(ControllerBase): > > > > def _set_rule(self, req, switchid, vlan_id=VLANID_NONE): > > try: > > - rule = eval(req.body) > > + rule = json.loads(req.body) > > except SyntaxError: > > FirewallController._LOGGER.debug('invalid syntax %s', > req.body) > > return Response(status=400) > > @@ -516,7 +516,7 @@ class FirewallController(ControllerBase): > > > > def _delete_rule(self, req, switchid, vlan_id=VLANID_NONE): > > try: > > - ruleid = eval(req.body) > > + ruleid = json.loads(req.body) > > except SyntaxError: > > FirewallController._LOGGER.debug('invalid syntax %s', > req.body) > > return Response(status=400) > > diff --git a/ryu/app/rest_qos.py b/ryu/app/rest_qos.py > > index 057a3fd..537639f 100644 > > --- a/ryu/app/rest_qos.py > > +++ b/ryu/app/rest_qos.py > > @@ -499,7 +499,7 @@ class QoSController(ControllerBase): > > > > def _access_switch(self, req, switchid, vlan_id, func, waiters): > > try: > > - rest = eval(req.body) if req.body else {} > > + rest = json.loads(req.body) if req.body else {} > > except SyntaxError: > > QoSController._LOGGER.debug('invalid syntax %s', req.body) > > return Response(status=400) > > -- > > 1.9.1 > > > > > > > > > > > ------------------------------------------------------------------------------ > > > > > > > > _______________________________________________ > > Ryu-devel mailing list > > Ryu-devel@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/ryu-devel > > >
------------------------------------------------------------------------------
_______________________________________________ Ryu-devel mailing list Ryu-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ryu-devel