【问题标题】:Sanitising user input for MySQL [duplicate]清理 MySQL 的用户输入 [重复]
【发布时间】:2012-08-02 14:12:30
【问题描述】:

可能重复:
The ultimate clean/secure function

我的一些编码遇到了一些问题,我不情愿地在我的脚本中发现了可能的 sql 注入,我似乎无法解决这个问题,所以我想知道这里是否有人可以帮忙它。

我可以说我编写脚本很好吗,只是我完全不知道数据库注入是如何发生的,它们是如何工作的或如何防止它们,但是很明显我的清理功能没有按预期工作。

这是有问题的代码块,当我在 id 之后添加以下内容时,它会吐出一个 MySQL 错误,我已经阅读了很多关于这意味着我的代码易受攻击的信息。

&id=369';

所以只是添加一个逗号和一个分号会破坏 MySQL 查询,这是不希望的。这是处理查询和显示数据的代码;

$id = $this->clean($_GET['id']);
#$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_STRING);
$pm_query = mysql_query("SELECT * FROM `staff_pm` WHERE `id` = '{$id}' AND `status` IN(0, 1)") or die(''.mysql_error());

所以我尝试了 PHP 中的一个集成函数,但会吐出相同的 sql 错误,这是我的清理函数,我事先被告知没问题:

function clean( $str )
{
return mysql_real_escape_string( htmlspecialchars( trim( $str ) ) );
}

只是真的想知道您对此事的看法,一直担心我的编码会被正在寻找这些类型漏洞的人利用,我真的想确保它是由从头开始学习一些技术以更好地保护它。

我被告知要转换为 PDO,但转换似乎是一项艰巨的工作,我会等到我重新创建应用程序后再这样做,我将在那里寻找更多的对象-面向对象的方法。

我收到的 SQL 错误是这样的:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '\' 附近使用的正确语法; AND status IN(0, 1)' 在第 1 行

感谢您的帮助,我真的很感激。

问候

【问题讨论】:

  • 不要使用 htmlspecialchars 进行数据库插入,只需使用 escape_string。总是尝试以“原始”格式存储数据,并在您检索数据时进行适当的转换,当您知道数据将用于什么时。如果你把它拉出来并在非网络环境中使用它,你必须撤消 htmlspecialchars 和浪费循环。
  • @MarcB 感谢您的评论,非常感谢!我完全理解并同意您所说的,我会将所有内容原始存储在数据库中,然后在需要时对其进行清理,如果我显示它。谢谢!

标签: php mysql code-injection


【解决方案1】:

这家伙说的是:使用准备好的语句和参数化查询。

How can I prevent SQL injection in PHP?

【讨论】:

  • 您好,看起来很有趣,我一定会阅读整个线程,因为这是我真正需要做的事情,谢谢!
【解决方案2】:

我还建议不要使用过时的 mysql_* 函数,而是使用 PDO。

但要修复现有代码,请使用intval

$id = intval($_GET['id']);

【讨论】:

  • 谢谢马克,是的,我绝对想离开 mysql,因为很多攻击都集中在利用它上,而且我将专注于更加面向对象的焦点让它看起来和感觉更干净。谢谢!
  • 不要在新应用程序中使用mysql_query。正如您刚刚发现的那样,麻烦多于其价值。默认情况下很危险,如果使用得当,mysqli 和 PDO 默认是安全的。
【解决方案3】:

在我看来,您的 id 列是整数类型,而您正试图将其与 '369\'' 进行比较?

比较id 列和'369' 是有效的(至少在mysql 中),但是比较一个整数和一个非整数字符串是无效的。

【讨论】:

  • 感谢您的评论,是的,我将 id 列用作 int,现在我明白为什么它会引发 MySQL 错误。谢谢!
猜你喜欢
  • 2021-12-25
  • 2013-09-14
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多