我正在尝试使用表单将数据输入MySQL,并且还使用mysql_real_escape_string
来实现此目的。不幸的是我的输出有问题。它显示\
s,或者如果我使用stripslashes
,则会删除所有斜杠。
如果我提交web's forms using backslash \
,我会收到此输出:
"web\'s forms using backslash \\"
看到我得到了一个双反斜杠。但是如果我使用stripslashes
函数,那么它会删除所有斜杠,但也会删除输入的斜杠,输出为
"web's forms using backslash"
这里没有显示反斜杠,但最后应该有一个反斜杠。
问题是如果有人在密码字段和任何其他字段中使用反斜杠,那么反斜杠将被剥离或显示两次。还请告诉我什么是最适合显示输出htmlentities或htmlspecialchars
答案 0 :(得分:4)
You have magic quotes turned on。你需要完全禁用它们,因为它们在安全性方面不好。
将它们从php.ini(首选)设置为off
:
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
或者您可以在运行时禁用它们:
if (get_magic_quotes_gpc())
{
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process))
{
foreach ($val as $k => $v)
{
unset($process[$key][$k]);
if (is_array($v))
{
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
}
else
{
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
答案 1 :(得分:0)
使用mysqli库和Prepared Statements。然后所有角色都作为数据进入,你不需要搞乱所有这些东西。
What characters are NOT escaped with a mysqli prepared statement?
Why is using a mysql prepared statement more secure than using the common escape functions?
答案 2 :(得分:0)
使用“安全”插入数据时出现问题 使用PHP“
将数据输入mysql的方法
你应该使用PDO(新的改进方式)预处理语句,它比前辈(mysql_real_escape_string, etc
)更安全,更快。 Why you Should be using PHP’s PDO for Database Access深入细节。
问题在于,如果有人使用 密码字段中的反斜杠和任何 其他提交,然后反斜杠将 被剥离或展示两次 还请告诉我什么是最好的 显示输出htmlentities或 用htmlspecialchars。
新的改进方法是使用filter。特别是我建议你阅读PHP创建者Rasmus Ledorf的所有这些Performance and Security幻灯片。 http://talks.php.net/一般有很多好的幻灯片,你应该看一下。