Php 如何清理和存储WordPress中包含HTML正则表达式模式的用户输入
我正在研究WordPress插件,它的一个特性是能够将用户输入的HTML正则表达式模式存储到DB中,然后在设置页面上显示它 我的方法实际上是有效的,但我想知道该代码是否足够安全: 这是用户输入的模式: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_
<div(.+?)class='sharedaddy sd-sharing-enabled'(.*?)>(.+?)<\div><\div><\div>
这就是它在WordPress数据库中的实际存储方式:
s:22:"custom_exclude_pattern";s:109:"<div(.+?)class="sharedaddy sd-sharing-enabled"(.*?)>(.+?)<\div><\div><\div>";
这就是设置页面上显示输出的方式:
<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:"<div(.+?)class="sharedaddy sd-sharing-enabled"(.*?)>(.+?)<\div><\div><\div>";
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
。好吧,在插入属性之前,你不需要对它们进行解码。相反,在网页上显示之前,请将其裸体存储并编码。