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


Performing a mysql_real_escape_string on checkboxes, radio buttons or drop-down menus?

是否有人可以为复选框,单选按钮或下拉菜单(如国家,出生年份)做sql注入?

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

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

或者我还需要这个吗?

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

单选按钮、复选框等在HTML代码中有一个值选项,可以很容易地使用firebug进行更改(还有许多其他类似的工具)。所以,最好对用户提供的所有输入进行消毒。

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

Ad 1) sql注入可以在任何地方尝试。表单是作为名称/值对列表传输的,无论它是一个复选框、下拉框还是其他什么。对于下拉框"country"我可以给你发送任意值

Ad 2)总是使用DBMS驱动函数进行转义和参数绑定。

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

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

你的第一个正则表达式仍然是有用的,但不是SQL注入。你可能要防止的是HTML注入——如果你曾经在网页上逐字显示输入,你可以防止任何邪恶的东西,比如一些流氓javascript。

执行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注入的攻击。