如果我不小心双重转义一个字符串,数据库会受到伤害吗?
出于这个问题的目的,假设我没有使用存储过程或参数化查询
例如,假设我得到以下输入:
鲍勃的自行车
我逃避了这一点:
鲍勃的自行车
但是我的代码很糟糕,并且再次转义:
鲍勃的自行车
现在,如果我将其插入数据库,则数据库中的值将是
鲍勃的自行车
虽然不是我想要的,但不会损害数据库。假设我采取了所有其他必要的安全预防措施,任何双重转义的输入是否有可能对数据库造成恶意?
如果我不小心双重转义一个字符串,数据库会受到伤害吗?
出于这个问题的目的,假设我没有使用存储过程或参数化查询
例如,假设我得到以下输入:
鲍勃的自行车
我逃避了这一点:
鲍勃的自行车
但是我的代码很糟糕,并且再次转义:
鲍勃的自行车
现在,如果我将其插入数据库,则数据库中的值将是
鲍勃的自行车
虽然不是我想要的,但不会损害数据库。假设我采取了所有其他必要的安全预防措施,任何双重转义的输入是否有可能对数据库造成恶意?
假设我采取了所有其他必要的安全预防措施
将 SQL 和/或参数值硬编码到应用程序中不应被视为“采取必要的安全预防措施”,因为您将始终受到 SQL 注入攻击(在 Web 应用程序的情况下)。
如果可以,最好使用存储过程,如果这不是一个选项,至少应该使用参数化查询(绑定变量是另一个术语)。
但是要回答您的问题,存储bob\'s bike
在数据库中本身不会造成任何伤害,但请注意考虑上面提到的其他几点,从安全角度来看,它们至关重要。
就安全性而言,单次转义与双重转义一样有害/无害。
最大的问题是您需要双重转义。否则,如果您只进行单次转义,您将在数据库输出中出现反斜杠。
例如,如果您运行bob\\\'s bike
unescape() 函数,它将输出bob\'s bike
然后打印到页面,除非您再次取消转义。但是不要多次转义,因为这可以删除故意的反斜杠(并且可能会造成更大的伤害)。
这个问题是否与 PHP 的魔术引号功能有关?只是好奇...