Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在准备好的语句中是否需要htmlspecialchars()或htmlspecialchars()?_Php_Mysql - Fatal编程技术网

Php 在准备好的语句中是否需要htmlspecialchars()或htmlspecialchars()?

Php 在准备好的语句中是否需要htmlspecialchars()或htmlspecialchars()?,php,mysql,Php,Mysql,在一篇文章中,它说: 在应用程序中使用预先准备好的语句有许多优点,既有安全性方面的原因,也有性能方面的原因 准备好的语句可以通过将SQL逻辑与提供的数据分离来帮助提高安全性。这种逻辑和数据的分离有助于防止一种非常常见的称为SQL注入攻击的漏洞 通常,在处理特别查询时,在处理从用户收到的数据时需要非常小心这需要使用能够转义所有必要的故障字符的函数,例如单引号、双引号和反斜杠字符。 这在处理准备好的报表时是不必要的。数据的分离允许MySQL自动考虑这些字符,并且不需要使用任何特殊函数对它们进行转义

在一篇文章中,它说:

在应用程序中使用预先准备好的语句有许多优点,既有安全性方面的原因,也有性能方面的原因

准备好的语句可以通过将SQL逻辑与提供的数据分离来帮助提高安全性。这种逻辑和数据的分离有助于防止一种非常常见的称为SQL注入攻击的漏洞

通常,在处理特别查询时,在处理从用户收到的数据时需要非常小心这需要使用能够转义所有必要的故障字符的函数,例如单引号、双引号和反斜杠字符。

这在处理准备好的报表时是不必要的。数据的分离允许MySQL自动考虑这些字符,并且不需要使用任何特殊函数对它们进行转义

这是否意味着我不需要
htmlspecialchars()
htmlspecialchars()
? 但是我假设我需要向用户输入数据添加
strip\u tags()

我说的对吗?

对于
htmlspecialchars()
没有任何变化,因为这是针对HTML的,而不是针对SQL的。您仍然需要正确地转义HTML,最好在实际生成HTML时转义,而不是以某种方式将其绑定到数据库

如果您使用准备好的语句,那么就不再需要
mysql\u[real\uu]escape\u string()
(假设您坚持使用准备好的语句的占位符,并抵制通过字符串操作绕过它的诱惑)

如果您想摆脱
htmlspecialchars()
,那么有一些HTML模板引擎,它们的工作方式与SQL中准备好的语句类似,并且使您不必手动转义所有内容。

,它们用于生成发送到浏览器的HTML输出

准备好的语句用于生成查询/向数据库引擎发送查询

两者都允许数据转义;但它们不会因为相同的用途而消失。
因此,不,准备好的语句(用于SQL查询)不会阻止您正确使用
htmlspecialchars
/
htmlentities
(用于HTML生成)

关于
strip\u标记
:它将从字符串中删除标记,其中
htmlspecialchars
将它们转换为HTML实体。
这两个函数做的事情不一样;你应该根据你的需要/你想得到什么来选择使用哪一种

例如,使用这段代码:

$str = 'this is a <strong>test</strong>';
var_dump(strip_tags($str));
var_dump(htmlspecialchars($str));
在第一种情况下,没有标签;在第二种情况下,正确地逃脱了

并且,通过HTML输出:

$str = 'this is a <strong>test</strong>';
echo strip_tags($str);
echo '<br />';
echo htmlspecialchars($str);
$str='这是一个测试';
回波带标签($str);
回声“
”; echo htmlspecialchars($str);
您将获得:

this is a test
this is a <strong>test</strong>
这是一个测试
这是一个测试

你想要哪一个这是一个重要的问题

我仍然倾向于编码HTML。如果您正在构建某种形式的CMS或web应用程序,则更容易将其存储为编码的HTML,然后根据需要重新编码

例如,当将信息引入由TinyMCE修改的文本区域时,他们建议应该对HTML进行编码,因为HTML规范不允许在文本区域内使用HTML


我还将
从您不需要HTML代码的任何地方剥离\u tags()

在数据库中插入内容时,不需要使用htmlentities()或htmlspecialchars(),不会发生任何不好的情况,如果使用预处理语句,则不会受到SQL注入的攻击。 好的是,现在可以将原始用户输入存储在数据库中

您确实需要在输出中转义内容并将其发送回客户端,-当您从数据库中取出内容时,否则您将很容易受到跨站点脚本攻击和其他不好的东西的攻击。您需要将它们转义为所需的输出格式,如html,因此仍然需要htmlentities等

因此,您可以在将数据放入数据库时转义,而不是在输出数据时转义-但是,您将丢失用户的原始格式,并且转义数据以供html使用,如果您以不同的输出格式使用数据,这可能不会带来回报。

准备SQL注入
htmlspecialchar for XSS(重定向到另一个链接)


第一个问题的正确性和strip_标记取决于您的操作,但也不是必需的。值得注意的是,strip_标记不会更改实体,因此使用无效实体的输入不会被修复,从标记中剥离的HTML也不会是纯文本。
this is a test
this is a <strong>test</strong>
<?php

$str = "this is <script> document.location.href='https://www.google.com';</script>";
echo $str;
$str = "this is <script> document.location.href='https://www.google.com';</script>";
echo htmlspecialchars($str);

<i>output1</i>: this is <script> document.location.href='https://www.google.com';</script> (in output browser)<br />
<i>output2</i>: this is &lt;script&gt; document.location.href='https://www.google.com';&lt;/script&gt; (in view source)<br />