在复选框,单选按钮或下拉菜单上执行mysql_real_escape_string?

时间:2011-07-10 07:51:19

标签: php mysql mysql-real-escape-string

有没有人可以为复选框,单选按钮或下拉菜单(例如国家/地区,出生年份)进行SQL注入?

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

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

或者我还需要这个吗?

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

始终认为客户是一个邪恶的天才,比你聪明。

为了避免SQL注入,总是使用mysql_real_escape_string来转义客户端数据,或者更好的是,使用数据库包装器为你做这件事。

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

答案 3 :(得分: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注入攻击,这是一种很好的做法。