2

可能重复:
终极清洁/安全功能

我的一些编码遇到了一些问题,我不情愿地在我的脚本中发现了可能的 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 statusIN(0, 1)' 在第 1 行

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

问候

4

3 回答 3

2

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

如何防止 PHP 中的 SQL 注入?

于 2012-08-02T14:16:36.960 回答
1

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

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

$id = intval($_GET['id']);
于 2012-08-02T14:15:17.010 回答
1

对我来说,您的列似乎id是整数类型,而您正试图将其与'369\''?

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

于 2012-08-02T14:17:54.017 回答