【问题标题】:PHP: Problem in a SQL statement when using a String ParameterPHP:使用字符串参数时 SQL 语句中的问题
【发布时间】:2009-02-21 10:11:35
【问题描述】:
$befal = mysql_query("SELECT * FROM users WHERE username = $_GET[username]");
$rad = mysql_fetch_assoc($befal);

等于

警告:mysql_fetch_assoc():提供的参数不是第 4 行 C:\profile.php 中的有效 MySQL 结果资源

我在用户名字段中有一个名为 Admin 的用户,但它仍然不起作用。 profile.php?user=Admin...

如果我使用 ID,这将有效:

$befal = mysql_query("SELECT * FROM users WHERE user_id = $_GET[id]");
$rad = mysql_fetch_assoc($befal);

可能是什么问题?

谢谢

【问题讨论】:

  • 不要忘记在数据库查询中使用数据之前对其进行清理。
  • 您应该检查 mysql_query() 的返回值,如果失败,请查看 mysql_error()。这应该让您了解查询失败的原因

标签: php mysql


【解决方案1】:

Errr...这是被黑客入侵的秘诀。我想向您介绍SQL injection,以very funny yet poignant cartoon为特征。

试试这个吧。

$username = mysql_escape_string($_GET['username']);
$query = mysql_query("SELECT * FROM users WHERE username = '$username'");

【讨论】:

  • +1 虽然我可能会提出 mysqli。而且漫画很棒。 哈哈
  • 我已经放弃了 mysqli。太不稳定,没有人在修复错误。
  • 嗯。诚然,我没有做足够的 PHP 来遇到 mysqli 中的任何错误。不过,我相信它适用于这种微不足道的场景。 ;-) 那么也许是 PDO。无论如何,我都赞成准备好的/参数化的陈述。
【解决方案2】:

试试这样:

$befal = mysql_query("SELECT * FROM users WHERE username = '$_GET[username]'");

您必须将字符串参数封装在撇号中。

[更新]

就像cletusOlaf 指出的那样,使用上面的sql 语句,您很容易发生SQL 注入。查看他们发布的答案,了解我的意思。

【讨论】:

  • @Dreas Grech:我建议您将大胖警告放在代码上方。我已经用鼠标按下了否决按钮,因为它建议工作但本质上是错误的代码。
【解决方案3】:

既然你已经得到了答案,请尝试输入

Something' OR '1' = '1

作为用户名 - 您已经成功创建了一个不错的 SQL-injectable 应用程序。

【讨论】:

  • 我应该先使用 mysql_real_escape_string 来解决这个问题吗?
  • 抱歉,我不深入了解 php 函数 - cletus 建议使用 mysql_escape_string。也可以在这里查看:stackoverflow.com/questions/1973/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多