有没有人可以为复选框,单选按钮或下拉菜单(例如国家/地区,出生年份)进行SQL注入?
另外,假设有人将他们的猫的名字输入文本字段,在将它们插入mysql表之前运行以下代码行是否足够?
$catsName = preg_replace('/[^a-z]/i', '', $_POST['yourCat']);
或者我还需要这个吗?
$catsName = mysql_real_escape_string($_POST['yourCat']);
答案 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注入攻击,这是一种很好的做法。