以下代码允许用户以简单的英语输入短语,然后将其作为“$ site”添加到数据库中。如果用户输入撇号,则短语将在撇号前面以反斜杠存储。如何在变量前面没有反斜杠的情况下将变量“$ site”添加到数据库中?
提前致谢,
约翰
print "<div class=\"siteadd\">
<form action='process.php?find=$find1' method='post'>
Add a book to this topic: <input name='site' type='text' size='50'>
<input type='submit' value='Submit'>
</form>
</div>";
然后,在process.php上:
$site = str_replace($remove_array, "", $_POST['site']);
$site = strtolower($site);
$site = mysql_real_escape_string($site);
$illegal = array("/", "\"");
$site = str_replace($illegal, '', $site);
mysql_query("INSERT INTO `$find` VALUES (NULL, '$site',1,0)");
答案 0 :(得分:6)
我认为出于安全原因,PHP会添加反斜杠。详细了解magic quotes。因为你正在使用正确的函数来转义传递给mysql查询的字符串,所以你不必依赖PHP的虚拟转义。
在脚本的开头,检查magic_quotes
是否已打开,如果是,请删除斜杠:
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
顺便说一下,在您的代码中,$find
变量来自不受信任的来源,也应该进行转义/过滤。
答案 1 :(得分:1)
调用mysql_real_escape_string()
可能是原因(http://us2.php.net/mysql_real_escape_string),但您可能还在服务器上启用了魔术引号(http://php.net/manual/en/security.magicquotes.php)。
答案 2 :(得分:1)
使用mysqli::prepare
,然后在生成的bind_param
上使用mysqli_stmt
。这也会阻止其他类型的SQL注入。