【问题标题】:How can i prevent sql injection but keep " and '?我怎样才能防止sql注入但保留“和”?
【发布时间】:2011-06-22 07:15:45
【问题描述】:

如何防止php中的sql注入但仍然显示“和'?我正在使用的那一刻

$input = strip_tags($input);
$input = htmlentities($input);

但是输出是 \" 和 \'。无论如何我可以在没有斜杠的情况下显示 " 和 ' 但将它们保留在那里这样我就不会被注入?

【问题讨论】:

  • 在对数据库执行命令之前将'替换为''(两次单引号)

标签: php sql security sql-injection html-entities


【解决方案1】:

您展示的方法不是防止SQL注入的正确方法!

始终使用您正在使用的数据库提供的清理方法,例如mysql_real_escape_string() 如果您使用标准 mysql 库。消毒方法不会改变最终结果中的任何字符。

或者,在 PDO 或 mysqli 中使用准备好的语句 - 如果您正确绑定传入的数据,它们会自动输入卫生。

【讨论】:

  • 好的,谢谢,我会试试的。我只需要在mysql中插入/删除东西时这样做吗?
  • @Cameron 是的,这种清洁方法是 mysql 特有的。您还需要做其他事情,例如当在 HTML 页面中输出数据或将它们作为电子邮件发送时,但这个特定的东西仅适用于 mysql。
  • 那么,如果我想在将它们放入数据库之前回显这些内容,是否可以在插入数据之前省略 mysql_real_escape_string?它现在显示 \\\' 和 \\\" 出于某种原因!
  • 你必须使用 mysql 作为 mysql_real_escape_string 的数据库链接还是你也可以使用 odbc 链接?谢谢
  • @Drewdin "wrapper" 表示您用来连接数据库的数据库库。如果您不确定,请提出一个单独的问题,并显示一些代码 - 肯定会有人告诉您您所做的事情是否安全。
【解决方案2】:

首先,该代码没有去除反斜杠,当然它们仍然存在。使用 stripslashes() 去掉反斜杠,但不要这样做。 如果您在数据库中看到这些斜线,并且您已经使用了 mysql_real_escape_string,那么您很可能已经打开了 magic_quotes_gpc,而您只是添加了另一组斜线。先删除那些自动添加的,然后再应用 mysql_real_escape_string,它们不会以这种方式显示,但仍会存在并在查询数据库时安全使用。

【讨论】:

  • 谢谢!这很有帮助!
  • 我刚刚将这个添加到 htaccess 文件中:php_flag magic_quotes_gpc off
【解决方案3】:
【解决方案4】:

粗心大意没有灵丹妙药。

这些斜线本身也不能阻止 SQL 注入。它们的存在表明另一个问题,magic_quotes。魔术引号是 PHP2 中的一项便利功能,从未打算用作安全功能。 (在 1997 年左右,当数据库不支持多字节字符集时,它们是安全的)。

无论如何,禁用magic_quotes。使用手动转义 (mysql_real_escape_string) 或更好但更方便的 PDO 准备语句。

如果你想偷懒,仍然禁用magic_quotes。但是使用 $_GET = array_map("mysql_real_escape_string", $_GET); 并在脚本开始时和建立数据库连接后对 $_POST 和 $_REQUEST 执行相同的操作。
然后应用htmlentities(stripslashes($input)) 写入输出以消除多余的反斜杠。

【讨论】:

  • @Cameron:这是php.ini 中的设置。如果您按照此处评论中的php_value 提示php.net/manual/de/security.magicquotes.disabling.php,您可以通过 .htaccess 更改它
  • 我用的是共享主机,可以吗?
  • @Cameron:您必须对其进行测试。它适用于 mod_php 服务器。使用 FastCGI 设置,您必须安装或修改个人 php.ini
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2011-09-22
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多