Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL注入问题_Php_Mysql_Sql Injection - Fatal编程技术网

Php MySQL注入问题

Php MySQL注入问题,php,mysql,sql-injection,Php,Mysql,Sql Injection,我最近一直在用PHP编写我的网站,我为自己在查询中使用输入之前对输入进行消毒的良好实践感到自豪。一切都很顺利,直到我的朋友说我需要清理我的输入。当我试图向他解释这是经过消毒的时候,他告诉我他已经在我数据库的“用户”表中找到了所有东西。我不知道怎么做,所以我想我会发布我做错了什么,使我的消毒不起作用。以下是他利用的PHP代码: start_mysql(); // Starts the databases stuff, etc. $id = mysql_real_escape_string($_G

我最近一直在用PHP编写我的网站,我为自己在查询中使用输入之前对输入进行消毒的良好实践感到自豪。一切都很顺利,直到我的朋友说我需要清理我的输入。当我试图向他解释这是经过消毒的时候,他告诉我他已经在我数据库的“用户”表中找到了所有东西。我不知道怎么做,所以我想我会发布我做错了什么,使我的消毒不起作用。以下是他利用的PHP代码:

start_mysql(); // Starts the databases stuff, etc.

$id = mysql_real_escape_string($_GET['id']);
$game = mysql_query("SELECT * FROM `games` WHERE `id` = $id LIMIT 0, 1");
他所做的只是更改id参数,使他能够在我的数据库上使用SQL注入。我以为mysql\u real\u escape\u字符串逃过了所有这样的字符,但显然我错了。我用一个普通字符串做了一些测试,看看会发生什么,它就是这么说的

URL:/game.php?id='或''='

所以,我的简单问题是,我做错了什么?

您需要使用。问题出在这段代码中:

WHERE `id` = $id

您直接将用户输入插入到SQL语句中。这为SQL注入攻击打开了大门。

您没有使用参数化查询


允许这样做,尽管该库可能不受欢迎。

强制转换ID。如果它是字符串,则将强制转换为0。 $id=(int)$\u GET['id']

此外,MySQL支持在查询中用引号括起字符串和数字

$game = mysql_query("SELECT * FROM `games` WHERE `id` = '$id' LIMIT 0, 1");

您需要将转义字符串放在单引号中:

WHERE `id` = '$id' 

由于
id
是一个整数参数,并且在SQL中没有用单引号将其括起来,因此
$id
的值将直接发送到查询中。如果需要整数
id
,则应验证
$\u GET['id']
的值是否为有效整数

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

mysql_real_escape_string()只会过滤某些字符,如果您真的想防止注入攻击,请参阅另一篇堆栈溢出文章,该文章建议您使用准备好的语句:

编辑:还可以查看Slaks和Michael关于用单引号包装变量的帖子

祝你好运


H

很可能您的配置有magic_quote_gpc,这是PHP中一种古老的尝试,可以让脚本神奇地安全。事实证明,它有多个缺陷,后来被弃用,并计划在我最后一次听说它时在5.4中完全删除

如果您有权访问php.ini配置,则应该禁用它。否则,您可以修改脚本以将其考虑在内,并对输入进行清理

所有这些都记录在这里:


否则,mysqli\u real\u escape\u string()没有问题。

您无法使用
mysql\u real\u escape\u string()阻止SQL注入。
。它用于转义特殊字符,如单引号(
),双引号(
)等


为了防止SQL注入,您必须使用PHP中的PDO语句和过滤函数来清理用户数据。

您的服务器日志中有哪些URL?为什么不问问您的朋友他使用了什么请求字符串?我也很想知道。他使用了从internet下载的“Havij”程序。用户输入周围用引号括起来并不正确防止注入攻击,因为用户可以提供自己的结束语。在PHP中,参数化查询称为“准备好的语句”林克:这是错误的。我没想到你已经逃跑了。用Slaks来回答。跳过越狱会打开安全漏洞。@Louis-我同意。我的回答错在他已经逃跑了。像他那样使用
mysql\u real\u escape\u string
是使用参数绑定api的完美替代。它们不应该一起使用。我希望我能早点实现。我想我应该开始编辑:P@Matt,不用担心,巴德,我花了一段时间才学会过滤注入攻击的“正确”方法,我偶然发现了那篇堆栈溢出的文章,就像“天哪,我做错了!”。但是现在你知道了,而且“知道是成功的一半”:)哈哈。无论如何,谢谢你的回复。这样看起来也好看多了。
$id = intval($_GET['id']);