引用应该在MySQL中保存转义?

时间:2012-06-03 20:23:55

标签: php mysql

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

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

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

  3. 轻松谈论这个话题。

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

    感谢

2 个答案:

答案 0 :(得分:2)

任何程序员必须学习的基本内容是 context 的含义。

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

那是什么一回事?这真的很容易。上下文是一个简单的事实,系统中的某些东西可能意味着某些东西完全不同。

例如,在您的情况下,PHP字符串可能意味着与MySQL完全不同的东西。你不能只是传递字符串并期望一切顺利运行 - 它不会。 所以,既然你知道上下文意味着什么,那么你需要了解其他重要的东西。您始终需要将旧上下文中的值转换为较新的上下文。 始终

同样,在你的情况下,它是mysql_real_escape_string(),但是一个警告;转换函数是特定于上下文的,因此,例如,您不能使用mysql_real_escape_string()将字符串从PHP传递到Javascript。同样,您不能只使用addslashes()并期望它能够正常运行。 事实上,我认为addslashes()是一个完全没用且误导性的功能。 使用它,除非你非常确定你在做什么。

答案 1 :(得分:1)

  

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

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

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

  

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

请勿使用prepared statements and parameterized queries

  

我正在使用addslashes和stripslashes

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

stripslashesaddslashes相反。一起使用它们是完全没有意义的。