0

我正在开发一个门户网站,我对在 MySQL 表中保存数据有以下几个问题:

  1. 我应该保存 varchar 字段转义吗?我现在使用 mysql_real_escape_string() 来避免字符串注入。

  2. 为什么我应该不转义地保存它们(这是由这个网站上的一个人提出的)以及这对于单引号和双引号等字符如何工作。它不会破坏 SQL 命令吗?

轻松谈论这个话题。

最后一件事......在使用mysql_real_escape_string之前我使用了addslashes和stripslashes,它对我有用(当然,mysql-injection恶意代码的机会,我最近发现并记录了自己)......

谢谢

4

2 回答 2

2

任何程序员必须学习的最基本的东西就是上下文的含义。

我来这里做什么?如果你知道上下文的含义,你就不会问这个问题。现在(我希望)你知道了,你不会问如​​何显示<test>为 HTML,或者如何将变量传递给 javascript。

那么这到底是怎么一回事呢?这真的很容易。上下文是一个简单的事实,系统中的某些东西在其他地方可能意味着完全不同的东西。

例如,在您的情况下,PHP 字符串可能意味着与 MySQL 完全不同的东西。您不能只传递字符串并期望一切顺利进行 - 它不会。因此,既然您知道上下文的含义,您就需要知道其他重要的事情。您总是需要将旧上下文中的值转换为新上下文。总是。

同样,在您的情况下,它是mysql_real_escape_string(),但只是一个警告;转换函数是特定于上下文的,因此,例如,您不能使用mysql_real_escape_string()将字符串从 PHP 传递到 Javascript。同样,您不能只使用addslashes()并期望它起作用。事实上,我认为 addlashes() 是一个完全无用且具有误导性的函数。除非您非常确定自己在做什么,否则不要使用

于 2012-06-03T20:44:58.500 回答
1

我应该保存 varchar 字段转义吗?

不,您应该转义数据,以便 SQL 中具有特殊含义的字符(在数据中)不会给您带来问题。

一旦它通过SQL并存储在数据库中,它将不再被转义。

我现在使用 mysql_real_escape_string() 来避免字符串注入。

不要那样做,而是使用准备好的语句和参数化查询

我正在使用addslashes和stripslashes

addslashes是逃避的基本形式。除非您确切知道数据的目标是什么,否则这是没有意义的。你应该使用更具体的东西存在这样的东西(你是 - mysql_real_escape_string)

stripslashes做相反的事情addslashes。将它们一起使用是完全没有意义的。

于 2012-06-03T20:27:54.200 回答