因此,我知道应该在输出或显示数据时对数据进行清理,而不是在接收或存储数据时进行清理。这就是我现在正在做的:
echo htmlspecialchars($name, ENT_QUOTES);
我的问题是,如果我要获取$ _GET参数并检查数据库中的参数,是否仍要清理并逃脱?例如:
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
那么htmlspecialchars
是必需的还是我应该$name = $_GET['name']
做?
谢谢。
答案 0 :(得分:2)
PDO使它比您做起来更加容易:
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([ 'name' => $_GET['name'] ]);
就是这样。完成。
使用占位符值时,尤其是进行匹配时,请不要转义。 htmlspecialchars
在HTML上下文中仅 相关,否则会造成损害。如果要以JSON,电子邮件或其他任何方式显示数据,请针对该上下文和该上下文进行转义,仅 。
如果某人的名字类似于“ A&W”,那么当您进行搜索时,您将修改输入内容并实际搜索“ A& W”,而这并不是他们的名字。他们将得到零匹配,然后他们会询问您您的网站出了什么问题。
您仅需对输入数据进行 操作,以删去可能干扰搜索匹配的所有字符,例如有人偶然引入了 的前导和尾随空格。
答案 1 :(得分:1)
请勿使用htmlspecialchars()
。 bind()
完成所有所需的转义和引用操作。
PHP包含一系列令人困惑的转义符-
<input>
,<textarea>
,<a>
-仅转义"&<>
<pre>
)-用于处理行尾mysql*
例程。mysqli*
例程中转义时-至少'"\
在将文本存储到MySQL表中时,通常的最佳选择是使字符串仅转义到足以通过解析器的地方。随着处理的进行,这种逃逸消失了。保留重音符号等。
PHP的PDO和mysqli具有“绑定”方式,可以为您完成所有工作。相反,如果您使用PHP的“插值”,例如
$sql = "SELECT * FROM t WHERE x = {$_GET['x']}";
您没有逃脱,也没有SQL注入保护。 除非您已经以某种方式检查了参数,否则不要以这种方式编写代码。
对于HTML,您需要一组不同的转义符。考虑一下<
。这引入了标签。那么,如何显示“小于”?好吧,您需要它的“ html实体”:<
。这导致&
出现问题;因此&
。
答案 2 :(得分:1)
所以需要htmlspecialchars还是我应该只做$ name = $ _GET ['name']?
不,不需要。
按原样保留输入数据 ,与输出介质无关。为安全地嵌入HTML,不应准备。
如果明天您需要一些API,PDF或桌面应用程序的JSON格式的数据怎么办?
答案 3 :(得分:0)
出于数据完整性的目的,您仍应该验证输入,例如:确保输入或多或少是出于应用程序稳定性的期望。但是,由于您使用的是预备语句,因此无需急需“清理”(也称为“损坏”)数据,因为数据库驱动程序对数据进行了更严格的封装。
htmlspecialchars()
使数据可以安全地包含在HTML文档中,并且仅应在将数据输出到HTML文档中时使用。在插入数据库之前执行此操作或多或少会污染您的数据,以用于除HTML文档以外的任何其他。