Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.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 如何清理和存储WordPress中包含HTML正则表达式模式的用户输入_Php_Html_Wordpress_Security_Html Sanitizing - Fatal编程技术网

Php 如何清理和存储WordPress中包含HTML正则表达式模式的用户输入

Php 如何清理和存储WordPress中包含HTML正则表达式模式的用户输入,php,html,wordpress,security,html-sanitizing,Php,Html,Wordpress,Security,Html Sanitizing,我正在研究WordPress插件,它的一个特性是能够将用户输入的HTML正则表达式模式存储到DB中,然后在设置页面上显示它 我的方法实际上是有效的,但我想知道该代码是否足够安全: 这是用户输入的模式: <div(.+?)class='sharedaddy sd-sharing-enabled'(.*?)>(.+?)<\div><\div><\div> 这就是它在WordPress数据库中的实际存储方式: s:22:"custom_exclude_

我正在研究WordPress插件,它的一个特性是能够将用户输入的HTML正则表达式模式存储到DB中,然后在设置页面上显示它

我的方法实际上是有效的,但我想知道该代码是否足够安全:

这是用户输入的模式:

<div(.+?)class='sharedaddy sd-sharing-enabled'(.*?)>(.+?)<\div><\div><\div>
这就是它在WordPress数据库中的实际存储方式:

s:22:"custom_exclude_pattern";s:109:"&lt;div(.+?)class=&quot;sharedaddy sd-sharing-enabled&quot;(.*?)&gt;(.+?)&lt;\div&gt;&lt;\div&gt;&lt;\div&gt;";
这就是设置页面上显示输出的方式:

<input type="text" name="custom_exclude_pattern" value="<?php echo str_replace('"',"'",html_entity_decode($print_options['custom_exclude_pattern'])); ?>" size="30" />

我希望我明白了重点,如果没有,那么请纠正我:您正试图根据存储在数据库中的相同模式,为输入字段动态插入一个模式,对吗?
嗯,我个人认为模式对可用性有很好的帮助,因为用户知道他的输入格式不正确,无需每次提交和刷新。

模式的最大问题是,HTML代码可以在客户端修改。我相信唯一安全的解决方案是检查服务器端输入的正确性。。。客户端过程不可能比服务器端过程更安全

好吧,如果你想让你的用户输入一个正则表达式,你可以做一些像prepared statement+
htmlentities($input,entu COMPAT,“UTF-I”)
清理输入,然后执行相反的操作,即
html\u entity\u decode($dataFromDb,ENT\u COMPAT,“UTF-8”)。一个必须的是准备好的语句,所有其他的方法来处理恶意输入可以以多种不同的方式组合在一起

从评论中可以看出,您似乎关心两个不同的问题(可能不知道我将在一分钟内提到的第三个问题),并且正在为这两个问题寻找一个解决方案:SQL注入跨站点脚本。你必须分别对待每一个人。我恳求你去

如何防止SQL注入 通常情况下,这是针对PHP应用程序的。WordPress支持预先准备好的语句,因此您也不必弄清楚如何使用PDO或MySQLi。(但是,他们的驱动程序中的任何漏洞都会影响你的插件。请确保彻底阅读
$wpdb
文档

在将它们传递给一个准备好的语句之前,您将得到一个被屏蔽的数据

跨站点脚本 在撰写本文时(2015年6月),您需要考虑两种一般情况:

  • 不允许用户向该输入提交任何HTML、CSS等
  • 用户可以向这个输入提交一些HTML、CSS等,但我们不希望他们能够通过这样做来攻击我们
  • 第一个问题非常简单,可以解决:

    echo htmlentities($dbresult['field'], ENT_QUOTES | ENT_HTML5, 'UTF-8');
    
    第二个问题有点棘手。它涉及到只允许某些标记,而不允许意外地允许其他标记在用户浏览器中运行Javascript。当前XSS防御的黄金标准是允许某些HTML

    重要! 无论您有什么要求,您都应该始终在输出上应用XSS防御,而不是在将内容插入数据库之前。最近,Wordpress core出现了一个错误,这是因为决定在存储之前逃逸,而不是在呈现之前逃逸。通过提供足够长的注释,攻击者可以触发MySQL转义文本上的截断错误,允许他们绕过防御

    好处:从
    unserialize()
    这就是它在WordPress数据库中的实际存储方式:

    s:22:"custom_exclude_pattern";s:109:"&lt;div(.+?)class=&quot;sharedaddy sd-sharing-enabled&quot;(.*?)&gt;(.+?)&lt;\div&gt;&lt;\div&gt;&lt;\div&gt;";
    
    s:22:“自定义排除模式”;s:109:“div(+?)class=“sharedaddy sd共享已启用”(.*)(.++)\div\div\div”;

    存储此数据时,您似乎正在使用
    serialize()
    ,检索数据时,可能正在使用
    unserialize()
    请小心
    unserialize()
    ;如果您让用户对字符串拥有任何控制权,他们可以将其插入到您的代码中,这也可能导致远程代码执行


    远程代码执行,作为记录,意味着他们可以接管你的整个网站,也可能接管你博客的服务器。如果用户有可能直接更改此记录,我强烈建议使用json\u encode()json\u decode()
    取而代之。

    确切地说,从什么角度来保护?如果你说的是SQL注入,那么不,你必须使用准备好的语句。@Dagon从任何可能危及站点安全的地方开始。Xss、SQL注入等等。@NinoŠkopac感谢Nino,在这种情况下,我想WordPress使用
    更新选项来准备安全的SQL查询nias。我的问题实际上更具体,我如何在插入数据库之前以及从数据库中提取并在浏览器中作为HTML输出之后,以正确的方式将包含一些HTML正则表达式模式的用户输入初始化。不要进行清理,使用准备好的语句。如果您担心XSS,请在输出时转义HTML实体。谢谢Scott.Perfec我不回答!只是习惯性地指出,在我的代码中,我在插入DB之前使用了
    htmlentities
    ,在检索时使用
    html\u entity\u decode
    。好吧,在插入属性之前,你不需要对它们进行解码。相反,在网页上显示之前,请将其裸体存储并编码。