擅长:python、mysql、java
<p>正如您所描述的,从技术上讲,评估repred字符串是安全的,但是,无论如何我都会避免这样做,因为这会带来麻烦:</p>
<ul>
<li><p>可能会出现一些奇怪的情况,您假设只存储已重复的字符串(例如,错误/进入存储的不同路径不会立即报告,这会成为代码注入漏洞,否则可能无法利用)</p></li>
<li><p>即使现在一切正常,假设也可能在某个时刻发生变化,未定义的数据可能会被不知道eval代码的人存储在该字段中。</p></li>
<>你的代码可能会被重用(或者更糟,复制+粘贴)进入你没有考虑的情况。</p></li>
</ul>
<p>正如<a href="https://stackoverflow.com/questions/1112665/safety-of-python-eval/1112684#1112684">Alex Martelli</a>指出的,在python2.6及更高版本中,有ast.literal_评估它可以安全地处理字符串和其他简单的数据类型,如元组。这可能是最安全和最完整的解决方案。在</p>
<p>然而,另一种可能是使用<code>string-escape</code>编解码器。这比eval快得多(根据timeit,大约是eval的10倍),在早期版本中比literal_eval可用,并且应该执行您想要的操作:</p>
<pre><code>>>> s = 'he\nllo\' wo"rld\0\x03\r\n\tabc'
>>> repr(s)[1:-1].decode('string-escape') == s
True
</code></pre>
<p>([1:-1]将去掉repr添加的外部引号。)</p>