如果我不小心加倍逃离一个字符串,数据库会受到伤害吗?双重逃逸是否可能对DB造成伤害?
对于这个问题的目的,让我没有使用存储过程或参数化查询
例如说,假设我得到以下输入:
bob's bike
我逃脱即:
bob\'s bike
但我的代码是可怕的,并再次逃脱它:
现在bob\\\'s bike
,如果我插入到数据库中,在DB的值将是
bob\'s bike
这虽然不是我想要的东西,不会伤害DB。假设我采取了所有其他必要的安全预防措施,是否有可能双重逃脱对数据库执行某种恶意操作?
如果我不小心加倍逃离一个字符串,数据库会受到伤害吗?双重逃逸是否可能对DB造成伤害?
对于这个问题的目的,让我没有使用存储过程或参数化查询
例如说,假设我得到以下输入:
bob's bike
我逃脱即:
bob\'s bike
但我的代码是可怕的,并再次逃脱它:
现在bob\\\'s bike
,如果我插入到数据库中,在DB的值将是
bob\'s bike
这虽然不是我想要的东西,不会伤害DB。假设我采取了所有其他必要的安全预防措施,是否有可能双重逃脱对数据库执行某种恶意操作?
在安全性方面,单次逃脱同样有害/无害,因为双重逃逸。
最大的问题是,你需要双unescape。否则,如果你只有single-unescape,你最终会在数据库输出中出现反斜杠。
例如,如果通过unescape()函数运行bob\\\'s bike
,它将输出bob\'s bike
,然后将打印到页面,除非您再次忽略它。但是不要多次嘲笑,因为这可以消除有意的反斜杠(并且可能造成更多伤害)。
这个问题与PHP的魔术引号功能有什么关系吗?只是好奇...
假设我采取其他一切 必要的安全防范措施
硬编码SQL和/或参数值到应用程序不应该被认为是“采取必要的安全防范措施”,因为你永远是主题到SQL注入攻击(在Web应用程序的情况下)。
如果可以,最好使用存储过程,如果这不是一个选项,至少应该使用参数化查询(绑定变量是另一个术语)。
但是要回答你的问题,在数据库中存储bob\'s bike
本身并不会造成任何伤害,但要小心考虑上面提到的其他问题,从安全角度来看,它们非常重要。