Php SQL注入|更改id值

Php SQL注入|更改id值,php,sql,input,xss,sql-injection,Php,Sql,Input,Xss,Sql Injection,我遇到了sql注入问题。“我的页面”显示表格的数据,如下所示: <input type="checkbox" name="id[]" value="<?php echo $row['id']; ?>" /><?php echo $row['data']; ?><br /> 如何确保提交的值是该特定行的id,而不是页面中“注入”的随机数 显然,我会开始检查id是否返回true到is\u numeric()/通过mysql\u real\u es

我遇到了sql注入问题。“我的页面”显示表格的数据,如下所示:

<input type="checkbox" name="id[]" value="<?php echo $row['id']; ?>" /><?php echo $row['data']; ?><br />

如何确保提交的值是该特定行的id,而不是页面中“注入”的随机数

显然,我会开始检查id是否返回true到
is\u numeric()
/通过
mysql\u real\u escape\u string()。

然后,我想到了两个选择:

  • 添加带有$row['data']副本的隐藏输入,以便 在任何
    mysql\u query()之前检查id和数据之间的对应关系

  • 将行的id从一个自动递增的数字更改为一个大的随机数,这样我就可以降低幸运命中的几率

我弄错了吗?还有更好的主意吗?
谢谢你的帮助

你不能。您的两种选择都存在根本缺陷:

  • 一个可以更改复选框值的程序可以很好地更改隐藏输入的值
  • 您的“随机ID”仍然可以在Firebug或类似工具上看到
您不必担心用户如何发送数据,而应该担心数据是否有效以及用户是否拥有给定操作的权限


另外,它不是我最喜欢的,因为它将返回十六进制和指数表示法的
true
。我建议您使用或简单地执行
(int)
强制转换,例如:

if (!isset($_POST['id'])) die('invalid data');
$id = (int) $_POST['id'];
if ($id == 0) die('invalid id');
非数字字符串转换为
0
,自动递增字段通常将
1
作为第一个值。如果
0
是有效值,则需要调整上述代码,例如:

if (!isset($_POST['id']) || !ctype_digit($_POST['id'])) die('invalid data');
$id = (int) $_POST['id'];
然后,检查数据库中是否存在给定的ID。进行适当的权限检查,就这样


服务器如何获取数据并不重要,重要的是数据是否有效以及用户是否有权执行给定的操作。您在前端/界面中所做的任何事情都可以很容易地被黑客或任何中等经验的web开发人员更改和操纵

专注于限制非授权访问并保持数据库的完整性。无论请求是从您的页面、被篡改的页面还是通过终端发出的,所有标题和发布的数据都可以很容易地复制,看起来像是从您的页面发出的请求


在所有这些之后,我不确定是否可以称之为“SQL注入”。应用程序的函数需要一些包含整数值的输入。现在剩下的是检查是否提供了必要的输入,并且输入是否有效。所有用户输入都必须被视为不安全的,并在被放入查询之前进行适当的验证和转义

另外,看看哪一个可以很好地处理值转义。
mysql.*
扩展和
mysql\u real\u escape\u string
函数已被弃用,且极易出现人为错误


关于防止SQL注入,问题注释中的内容是一本很好的读物。

我将从阅读开始,非常感谢您的详尽解释!我几乎没有发现mysql API被弃用了。。。我知道,就目前而言,使用mysql还不是一个安全问题,而是未来需要抛弃的东西,对吗?@Greg实际上使用
mysql.*
已经被弃用了十多年,但是的。。这并不是说mysql是邪恶的,而是人们如何使用它。它很容易被误用。您可以使用PDO连接到mysql服务器,阅读我在答案中链接的micro PDO教程只需一两个小时,而尽早学习它将使您在将来避免很多麻烦
=]
一般的建议是,如果您正在启动一个新的应用程序或刚刚开始学习,最好从最新的扩展开始,而不是从那些旧的不推荐的东西开始<代码>:)