use*_*157 -6 php variables sql-injection function
可能重复: 如何在mysql插入语句中包含PHP变量
如何使用此函数清除从URL中提取的变量?假设我有$id变量,它是从"www.mydomain.com/single-page?id=534"中提取的,我想在MySQL select语句中使用它之前让它变得安全.
<?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'));
}
}
?>
Run Code Online (Sandbox Code Playgroud)
小智 7
为了防止SQL注入攻击,您应该在构造查询时转义从用户获得的数据,例如:
$query = "SELECT * FROM `users` WHERE `id` = '" .
mysql_real_escape_string($_POST['id']) . "'";
Run Code Online (Sandbox Code Playgroud)
(注意值周围的单引号.)
一个更好的主意却是使用准备的SQL语句.魔术引号无论如何都被弃用了,所以不需要stripslashes()超级全局和所有这些诡计.
另外,请htmlspecialchars()仅在输出时使用.现在,您实际上正在使用仍在使用的变量中的HTML实体.