我正在为我的老板建立一个PHP内部网。一个简单的客户,订单,报价系统。它将被拒绝从互联网访问,仅供3人使用。我不太关心安全性,因为我在验证时。 Javascript在所有计算机上都被禁用。
我遇到的问题是:
:;[]"'
等任何内容的表单。我的问题是:
如果员工在步骤1中反复输入任何数据,则每次将htmlspecialchars()应用于数据时,他们将在步骤1和4之间继续移动。
So that:- &
becomes:- &
becomes:- &
becomes:- &
等。
如何阻止htmlspecialchars()多次应用于已清理过的数据?
谢谢, 亚当
答案 0 :(得分:5)
检查manual page on htmlspecialchars:
string htmlspecialchars(string $ string [,int $ quote_style = ENT_COMPAT [,string $ charset [, bool $ double_encode = true ]]])
$double_encode
选项应该是您要找的。 p>
在正确设置的数据流中,此根本不应该是的可能性,除非有来自用户或第三方服务的数据可能已经或不能包含HTML编码的字符。 (并不是说我在职业生涯中没有建立一些不正确的数据流。但这就是为什么我知道它为什么如此重要以至于它们干净且定义明确。: - )
答案 1 :(得分:4)
您应该只在HTML输出中使用htmlspecialchars
,而不是在其他任何地方。
<input name="var" value="<?php echo htmlspecialchars($var)?>">
如果$var
包含&符号,那么在HTML中它会输出编码值:
<input name="var" value="this&that">
但是,用户只会在其输入字段中看到this&that
,并且在提交后,$_GET['var']
将为this&that
,而不是编码版本。
在PHP方面,你可能想要做的唯一事情就是删除斜线,如果有魔术引号:
if (get_magic_quotes_gpc())
$var = stripslashes($_POST['var']);
else
$var = $_POST['var'];
从那里你应该将原始数据存储在数据库中,而不是HTML编码版本。要避免SQL注入,如果您使用的是普通的mysql函数,请使用mysql_real_escape_string
,或者使用PDO。
答案 2 :(得分:-3)
So that:- &
becomes:- &
becomes:- &amp;
becomes:- &amp;amp;
你完全错了。 试试吧,看看
<form>
<input name="a" value="<?=htmlspecialchars($_GET["a"])?>">
<input type=submit>
</form>