我正在寻找一种安全地将字符串插入数据库的方法?

Posted

技术标签:

【中文标题】我正在寻找一种安全地将字符串插入数据库的方法?【英文标题】:I am looking for a way to safely insert a string to a database? 【发布时间】:2011-12-08 07:04:23 【问题描述】:
 $comment= mysql_real_escape_string($comment);

我用这个.. 但它没有帮助。我使用 TinyMCE 将字符串插入到我的数据库中,但在选择时我得到了奇怪的字符...

× ×›×ª×‘ על ידי
\\r\\n

\r\n \r\n

是否在字符串进入数据库之前对其进行解析/enode?!?不发生这种情况?

更新:

进入数据库的文本如下所示:

   t;div class=\"entry\" style=\"padding-top: 20px; padding-right: 20px; padding-bottom: 10px; padding-left: 20px; margin:

0px;\">\r\n

发布于 15.10.2011 11:04 在 游戏, PC by Frado \r\n\r\n

SKIDROW 发布了 Orcs Must Die 的修复程序,请阅读 NFO 了解详情。

\r\n

描述:切片,烧掉, 把它们串起来,然后发射它们——不管你是怎么得到的 完成了,兽人必须在 Robot 的这款奇幻动作策略游戏中死去 娱乐。作为拥有数十种致命武器的强大战争法师, 法术、陷阱触手可及,保卫二十四座堡垒 来自一群凶猛的敌人,包括食人魔、地狱蝙蝠、 当然,还有一大群丑陋的兽人。通过与你的敌人战斗 跨多个难度级别的基于故事的活动,包括 残酷的噩梦模式!

\r\n

\r\n


\r\n

释放 名称:Orcs.Must.Die.Fix-SKIDROW
大小: 39,1 KB
链接: 主页 – Steam – iGN – 游戏预告片 – NFO

\r\n

下载: FiLESONiC - FiLESERVE – NTi

\r\n

\r\n

c02e13;文字装饰:无;填充:0px; margin: 0px;\" title=\"评论Orcs Must Die Fix-SKIDROW\"

href=\"http://www.rlslog.net/orcs-must-die-fix-skidrow/#respond\">评论(0)

\r\n\r\n
\r\n\r\n

上一篇文章: MuscleMag 国际2011年12月-P2P

【参考方案1】:

使用prepared statements 而不是转义,看看是否有帮助。还要检查code pages/ characters 设置是否正确。

【讨论】:

我不知道什么是代码页字符。我只是将我从另一个站点复制的文本插入到 TinyMCE 中……输出看起来很糟糕……【参考方案2】:

这个 (additionally) 看起来您启用了 magic_quotes_gpcDocs。这是一个不安全的服务器设置,它会破坏您的数据。

另见:

get_magic_quotes_gpcDocs Does using magic_quotes() affect the use of mysql_real_escape_string() Magic quotes in php

【讨论】:

我禁用了它.. 它仍然给我带来了很多问题 一旦输出结束..它有 html 标签

未关闭..这会影响我页面上的输出

不要直接将无效的 HTML 插入到数据库中,这样以后就不需要处理无效的 HTML。就这么简单。想想数据如何通过您的应用程序。见IPO Model。 我认为你的答案是最后也是最正确的一个。但是,这不是解决这个问题的方法,因为我使用的是 TinyMCE 谢谢。你的调试看起来不错。【参考方案3】:

其实很简单..

例如,假设我想 2 在我的表中插入一个字符串“欢迎”,那么我必须编写这样的查询:

插入mytable (name) 值(“欢迎”)

如果你是动态插入你的记录意味着用 php 或任何语言然后这样写

$string = "欢迎"; mysql_query("insert into mytable name values ('".$string."')");

为了安全起见,也只需启用魔术引号...请访问以获取更多信息

http://www.php.net/manual/en/function.get-magic-quotes-gpc.php

【讨论】:

如果你关闭引号那么它是不安全的......并且假设你不想打开它......那么你必须在获得值时使用php的addslashes函数当页面提交时 错了。魔术引号是不安全的。它不会转义所有可用于破解 SQL 语句的字符。你也不应该使用addslashes,因为它也有同样的问题。您需要根据问题使用mysql_real_escape_string(),或特定于您正在使用的数据库库的其他命令。不要依靠魔术引号来保证您的安全;你会被黑。【参考方案4】:

两个建议:

    放弃mysql_XXX API。它将在某个时候被废弃,并且它缺乏关键功能,最显着的是参数化查询。如果您不知道什么是参数化查询,请阅读。它们是保持 SQL 连接代码健全的唯一健全方法。对于 PHP,我推荐 PDO - 它有点不那么简单,但值得学习曲线。 确保您的字符集/编码正确。这些天最简单的事情就是对所有事情都使用 Unicode (utf-8)。您需要在数据库本身中设置编码(如果可以的话;在 MySQL 中,您需要为每个表和每个列执行此操作,如果您必须对其进行改造,这可能会很麻烦),连接编码(只需调用SET NAMES UTF-8 建立连接后的第一件事)、php 的内部编码(mb_internal_encoding)和输出编码(mb_http_output)。另外,请确保您实际输出的是 UTF-8;这意味着您的所有源文件和模板也应该以 utf-8 编码保存。

无论您做什么:永远不要将值连接或替换为查询。像这样的代码:mysql_query("SELECT * FROM users WHERE USERNAME = '$username'"); 应该是非法的 - 有太多方法可以用这个来击中自己的脚并引入 SQL 注入漏洞。 (如果你不知道什么是 SQL 注入,也请阅读那个)。

最后;关于如何调试情况的一些提示。

设置 MySQL 查询日志记录。 my.ini 中有一个设置会导致 MySQL 服务器将所有传入的查询转储到日志文件中。您不想在生产服务器上执行此操作,只想暂时启用它,但它是查看实际发送到服务器的内容的好工具。 使用命令行客户端登录 MySQL,查看手动触发相同查询时的输出结果。 调试你的 PHP - 确保你发送到服务器的值是你认为的 - 如果你手头没有调试器,在你的脚本中添加 print 语句总比没有好(只要记住在提交之前删除它们)

【讨论】:

mysql_query("SET NAMES 'utf8'"); ..我用过..但它没有多大帮助 @DmitryMakovetskiyd:是什么让你认为只听一小部分建议就能解决你所有的问题? 好吧,据说 PDO 不能直接针对数据库操作数据。它提供了某种级别的抽象,例如事务开始、提交、回滚。我将表格设置为 UTF,但没有将列设置为 ..我将尝试设置 get_magic 引号...我还将尝试您的其他建议 它像这样输入文本和 html:

99999999999999999

..我认为其中一个标签没有关闭,所以它也拧紧了不包含在输出中的文本..hmmm

以上是关于我正在寻找一种安全地将字符串插入数据库的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将元素插入列表?

从 java 应用程序执行批量插入数据库的不同方法

在 mysqli 中插入许多值的最佳方法?

在 mysqli 中插入许多值的最佳方法?

Jquery插入unicode而不是符号

如何有效地将数据插入索引丰富的 oracle db?