1

有没有办法有人可以为复选框、单选按钮或下拉菜单(例如国家、出生年份)进行 sql 注入?

另外,假设,如果有人在文本字段中输入他们的猫的名字,在我将它们插入 mysql 表之前运行以下代码行是否足够?

$catsName = preg_replace('/[^a-z]/i', '', $_POST['yourCat']);

或者我还必须这样做吗?

$catsName = mysql_real_escape_string($_POST['yourCat']);
4

4 回答 4

6

单选按钮、复选框等在 HTML 代码中有一个值选项,可以使用 firebug 轻松更改(还有许多其他类似的工具)。因此,最好清理用户提供的所有输入。

至于第二个问题,mysql_real_escape_string就够了。不需要做preg_replace

于 2011-07-10T07:55:07.810 回答
0

广告 1) SQL 注入可以在任何地方尝试。表单以名称/值对列表的形式传输,无论它是复选框、下拉列表还是其他形式。因此,对于您的下拉“国家”,我也可以向您发送任意值。

广告 2) 始终使用您的 DBMS 驱动程序函数进行转义和参数绑定。

于 2011-07-10T07:55:52.753 回答
0

总是假设客户是一个邪恶的天才,而且比你聪明。

为避免 SQL 注入,请始终使用 mysql_real_escape_string 转义客户端数据,或者更好的是,使用为您完成此操作的数据库包装器。

您的第一个正则表达式仍然有用,但不适用于 SQL 注入。您可能会阻止 HTML 注入 - 如果您曾经在网页上逐字显示输入,则可以阻止任何邪恶的事情,例如某些流氓 javascript。

于 2011-07-10T08:00:43.933 回答
0

进行 SQL 注入的能力不取决于输入的类型,它取决于您如何使用接收到的值。任何 HTML 输入控件和生成的表单提交都可以手动编辑以包含任何内容。因此,必须对任何输入进行清理和减少,以仅包含您需要的信息。

因此,如果您使用如下复选框...

if ($_POST['checkbox'] == 'on') { $val = 1; } else { $ val = 0; }
mysql_query("UPDATE table SET checkbox=$val");

你安全了。另一方面,如果您决定直接存储从用户收到的值并进行比较...

mysql_query("UPDATE table SET checkbox={$_POST['checkbox']}")
...
if ($row['checkbox'] == 'on') { /* enable something */ }   

那么“你所有的数据都将属于黑客”:)

至于第二个问题,在这种特殊情况下preg可能就足够了,但是如果您更改正则表达式或修改不正确,则可能会变得不够用。始终对提供给数据库的数据进行转义是一种很好的做法,以确保此类错误不会使您的代码容易受到 SQL 注入的攻击。

于 2011-07-10T08:01:03.953 回答