Php mysql\u real\u escape\u字符串是否足以阻止HTML注入?

Php mysql\u real\u escape\u字符串是否足以阻止HTML注入?,php,mysql,html,Php,Mysql,Html,我想知道如何防止HTML注入。我创建了一个允许用户以HTML形式粘贴文章的网站。我使用了mysql\u real\u escape\u sting,但我想知道这是否足以防止HTML注入。我尝试了htmlspecialchars,但是它显示了mysql\u real\u escape\u string的错误不,不是。参考 它不能逃避简单的回答是:不 mysql_real_escape_字符串只帮助您摆脱SQL注入,而不是XSS和html注入。为了避免这些问题,您需要更复杂的输入验证。从看和开始 您

我想知道如何防止HTML注入。我创建了一个允许用户以HTML形式粘贴文章的网站。我使用了
mysql\u real\u escape\u sting
,但我想知道这是否足以防止HTML注入。我尝试了
htmlspecialchars
,但是它显示了mysql\u real\u escape\u string的错误

不,不是。参考

它不能逃避简单的回答是:不

mysql_real_escape_字符串只帮助您摆脱SQL注入,而不是XSS和html注入。为了避免这些问题,您需要更复杂的输入验证。从看和开始

您应该使用以绝对确保防止sql注入

摘自文件(阅读粗体部分)

许多比较成熟的数据库支持预处理语句的概念。它们是什么?可以将它们视为应用程序要运行的SQL的一种编译模板,可以使用变量参数进行自定义。准备好的报表有两大好处:

  • 查询只需要分析(或准备)一次,但可以 使用相同或不同的参数执行多次。什么时候 准备好查询后,数据库将进行分析、编译和 优化it执行查询的计划。对于复杂的查询,此 这一过程可能会占用足够的时间,从而显著减慢进程的速度 应用程序,如果需要多次重复同一查询 具有不同的参数。通过使用预先准备好的语句 应用程序避免重复分析/编译/优化周期。这 这意味着准备好的语句使用更少的资源,因此可以运行 更快
  • 编制报表的参数不需要引用;这个 驱动程序会自动处理这个问题如果应用程序专门使用 编写语句后,开发人员可以确保没有SQL注入 将发生(但是,如果正在生成查询的其他部分 有了未切换的输入,SQL注入仍然是可能的)
准备好的语句非常有用,它们是PDO将为不支持它们的驱动程序模拟的唯一特性。这确保应用程序能够使用相同的数据访问范式,而不管数据库的功能如何

如果您想阻止XSS(跨站点脚本),则无论何时,只要您想向浏览器输出来自用户输入或任何非安全源的内容,都应该使用该功能始终将任何未知源视为不安全源

 echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
不,只准备将数据安全地插入到MySQL字符串声明中,以防止特定上下文中的SQL注入。它不阻止其他注入,如HTML注入或跨站点脚本(XSS)

HTML注入和XSS都发生在不同的上下文中,其中需要注意不同的上下文特殊字符。在HTML中,尤其是
&
”和
界定了不同的HTML上下文。考虑到XSS,您还需要了解不同的JavaScript上下文及其特殊字符


应足以处理前一种攻击,同时可用于JavaScript的安全子集。有关此主题的更多信息,请参阅以及相关问题。

否。事实上,我认为对于高级程序员,您不应该使用
mysql\u real\u escape\u string()
作为拐杖。
对于在DB查询中需要使用的每一个值,要认真考虑可能出现的字符。如果它是一美元,你唯一应该接受的字符是数字、周期和可能的前面的美元符号。如果它是一个名字,你只允许字母、连字符和可能的句号(如约瑟夫A银行的Full名字)。.
确定值可接受的严格字符范围后,编写正则表达式以匹配该值。对于任何不匹配的值,显示虚假错误并将值记录在文本文件中(读取:而不是db)以及用户的IP。经常检查此文件,以便查看用户尝试过但不起作用的值是否为黑客尝试。这不仅会发现您需要调整正则表达式的有效输入,还将揭示试图在您的站点上发现SQL漏洞的黑客的IP。
这种方法确保了
mysql\u real\u escape\u string()可能无法立即解决的新旧SQL漏洞
,将被阻止。

当你说html注入时,你是指sql注入,还是说XSSCan你发布的代码中
htmlspecialchars
mysql\u real\u escape\u string
中抛出错误?这没有多大意义,除非你奇怪地将它们结合在一起。嗨,很抱歉,我是phpmysql的新手web他们让mysql real escape防止注入和其他使用httpspecialchars的行为。我有点困惑,所以我在脚本中尝试了这两种方法。我敢说粗体的句子不完全正确。可以使用单独准备的语句编写应用程序,但仍然容易受到SQL注入的影响。您好,@Mchl。我读了您的评论我想问你这是怎么可能的?我正在使用PDO和预处理语句和异常处理。提前感谢。你仍然可以以不安全的方式创建预处理语句。例如,你可以决定使用
$\u POST
中的未替换值作为列名。粗体句子后面的括号亮起这不是事实。