消除MySQL的用户输入

时间:2012-08-02 14:12:30

标签: php mysql code-injection

  

可能重复:
  The ultimate clean/secure function

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

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

以下是令人讨厌的代码块,当我在 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服务器版本对应的手册,以便在'\'附近使用正确的语法;第1行的status IN(0,1)'

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

此致

3 个答案:

答案 0 :(得分:2)

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

How can I prevent SQL injection in PHP?

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

对我来说,您的id列似乎是整数类型,并且您尝试将其与'369\''进行比较?

id列与'369'进行比较是有效的(至少在mysql中),但不是将整数与非整数字符串进行比较。