可能重复: How to include a PHP variable inside a mysql insert statement
如何使用此函数清除从URL中提取的变量?假设我有$id
变量,它是从“www.mydomain.com/single-page?id=534”中提取的,我想在MySQL select语句中使用之前使其变得安全。 / p>
<?php
class SecureSqlInjection
{
function specificData($val)
{
$val = htmlspecialchars(stripslashes(trim($val)));
$val = str_ireplace("script", "blocked", $val);
$val = mysql_escape_string($val);
return $val;
}
function secureSuperGlobalGET(&$value, $key)
{
if(!is_array($_GET[$key]))
{
$_GET[$key] = htmlspecialchars(stripslashes($_GET[$key]));
$_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]);
$_GET[$key] = mysql_real_escape_string($_GET[$key]);
}
else
{
$c=0;
foreach($_GET[$key] as $val)
{
$_GET[$key][$c] = mysql_real_escape_string($_GET[$key][$c]);
$c++;
}
}
return $_GET[$key];
}
function secureSuperGlobalPOST(&$value, $key)
{
if(!is_array($_POST[$key]))
{
$_POST[$key] = htmlspecialchars(stripslashes($_POST[$key]));
$_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]);
$_POST[$key] = mysql_real_escape_string($_POST[$key]);
}
else
{
$c=0;
foreach($_POST[$key] as $val)
{
$_POST[$key][$c] = mysql_real_escape_string($_POST[$key][$c]);
$c++;
}
}
return $_POST[$key];
}
function secureGlobals()
{
array_walk($_GET, array($this, 'secureSuperGlobalGET'));
array_walk($_POST, array($this, 'secureSuperGlobalPOST'));
}
}
?>
答案 0 :(得分:7)
为了防止SQL注入攻击,您应该在构造查询时转义从用户获得的数据,例如:
$query = "SELECT * FROM `users` WHERE `id` = '" .
mysql_real_escape_string($_POST['id']) . "'";
(注意值周围的单引号。)
更好的主意尚未使用prepared SQL statements。魔术引号无论如何都被弃用了,所以不需要stripslashes()
和超级全局以及所有这些诡计。
另外,请仅在输出时使用htmlspecialchars()
。现在,您实际上正在使用仍在使用的变量中的HTML实体。
答案 1 :(得分:4)
您也可以将变量转换为整数,因为您的ID只包含数字:
$id = (int)$_GET['id'];
如果传递字符串“?id = asdoi”,$ id将获得值0。
答案 2 :(得分:2)