通用防护xss攻击和sql注入

碰巧的是,在过去的一年中,我不得不处理托管方面的技术支持,以及与我有间接关系的网站的支持。 而且由于管理员经常会在其站点上遭受各种攻击,而又没有机会聘请专家,所以我想到为所有站点提出一个通用的解决方案,可以帮助他们轻松地保护自己的站点。 尽管我仍然无法解决许多小问题,但是,这是目前唯一的解决方案,可以让您从内部保护站点,而无需使用需要从外部安装的各种插件和模块,甚至没有经验的网站开发人员可以在其网站上进行安装和配置。 该解决方案的本质是处理由GET,POST和/或COOKIE方法传输的数据,甚至在处理它们并将它们直接写入数据库之前。

在本文中,我将举例说明特定方法的用法和缺点。

这是代码本身

$jsxss="onabort,oncanplay,oncanplaythrough,ondurationchange,onemptied,onended,onerror,onloadeddata,onloadedmetadata,onloadstart,onpause,onplay,onplaying,onprogress,onratechange,onseeked,onseeking,onstalled,onsuspend,ontimeupdate,onvolumechange,onwaiting,oncopy,oncut,onpaste,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,onblur,onfocus,onfocusin,onfocusout,onchange,oninput,oninvalid,onreset,onsearch,onselect,onsubmit,onabort,onbeforeunload,onerror,onhashchange,onload,onpageshow,onpagehide,onresize,onscroll,onunload,onkeydown,onkeypress,onkeyup,altKey,ctrlKey,shiftKey,metaKey,key,keyCode,which,charCode,location,onclick,ondblclick,oncontextmenu,onmouseover,onmouseenter,onmouseout,onmouseleave,onmouseup,onmousemove,onwheel,altKey,ctrlKey,shiftKey,metaKey,button,buttons,which,clientX,clientY,detail,relatedTarget,screenX,screenY,deltaX,deltaY,deltaZ,deltaMode,animationstart,animationend,animationiteration,animationName,elapsedTime,propertyName,elapsedTime,transitionend,onerror,onmessage,onopen,ononline,onoffline,onstorage,onshow,ontoggle,onpopstate,ontouchstart,ontouchmove,ontouchend,ontouchcancel,persisted,javascript"; $jsxss = explode(",",$jsxss); foreach($_GET as $k=>$v) { if(is_array($v)) { foreach($v as $Kk=>$Vv) { $Vv = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $Vv ); $Vv = str_replace($jsxss,"",$Vv); $Vv = str_replace (array("*","\\"), "", $Vv ); $Vv = strip_tags($Vv); $Vv = htmlentities($Vv, ENT_QUOTES, "UTF-8"); $Vv = htmlspecialchars($Vv, ENT_QUOTES); $_GET[$k][$Kk] = $Vv; } } ELSE { //       xss- $v = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $v ); //   javascript     xss- $v = str_replace($jsxss,"",$v); //     SQL- $v = str_replace (array("*","\\"), "", $v ); //         SQL $v = mysql_real_escape_string( $v ); //   . $v = strip_tags($v); //      HTML- $v = htmlentities($v, ENT_QUOTES, "UTF-8"); $v = htmlspecialchars($v, ENT_QUOTES); // GET  $_GET[$k] = $v; } } 

上面的示例仅处理GET请求。 因此,至少需要用POST和COOKIE重复循环。 不幸的是,我无法在函数中递归执行此解决方案,无法同时传递我们需要的所有数组$ _GET,$ _POST和$ _COOKIE。 而最重要的事情是无法实现的,这种类型的多维数组的递归遍历与函数内部数据的数据传输的特殊性以及变量变量的有限使用有关。

1)$ v = preg_replace(“'<脚本[^>] *?>。*? 'Si”,“”,$ v);

在这里,我们明确删除了不必要的JavaScript代码。 如果您仍然允许直接传递代码本身,而不是为了执行而是为了熟悉,则该函数可能是多余的。 例如在论坛上。

2)$ v = str_replace($ jsxss,“”,$ v);

该功能类似于第一个功能,仅在这种情况下,我们才切出了可用于xss攻击的事件。 您可以略微修改此解决方案,不仅剪切事件本身,而且剪切出他们尝试附加到该事件的内容。 但是我还没有看到它的需要

3)$ v = str_replace(数组(“ *”,“ \\”),“”,$ v);

这些有害字符,尤其是反斜杠,可能会导致您的SQL被黑。 由于该符号本身很少使用,并且其潜在危险性很高,因此我决定将其销毁。

4)$ v = mysql_real_escape_string($ v);

使用此功能可能导致不必要的字符转义,因为最有可能在将数据写入数据库时​​已直接使用了该功能,但是另一方面,它将帮助您保护自己免受sql注入的侵害,并像其他任何方式一样保护数据。 使用它时,必须在连接数据库后使用该函数。 另外,别忘了php 7中没有使用mysql_real_escape_string,而此类功能的使用取决于连接方法。 例如,通过mysqli连接到数据库时,可能需要使用mysqli_real_escape_string函数。

5)$ v = strip_tags($ v);

Strip_tags将有助于删除所有不必要的标签。 不幸的是,必要的也是。 第二个参数可以指定要保留的标签。 但是麻烦的是,有太多必要的标签以至于列出它们是很成问题的,而且最不幸的是,还有这样的标签,网站开发人员必须自己添加这些标签才能在网站上创建某些功能。 当然,指定需要删除而不是不删除的标签会更加方便。 但是我们会满足于拥有的一切。 另外,正则表达式可用于此类决策。

6)$ v = htmlentities($ v,ENT_QUOTES,“ UTF-8”);

7)$ v = htmlspecialchars($ v,ENT_QUOTES);

我认为不需要介绍这两个功能,并且一个功能与另一个功能相似,因此使用其中一个功能就足够了。 然而,它们远非总是合适的。

目前,这就是我设法收集的全部信息。 如果有人对本文有所补充,我将很高兴;)

PS对于那些想要解决方案并愿意使用PDO,模板引擎,不同服务器模块等的用户。 我绝不否认该解决方案有其缺点,在某些地方它会歪曲结论甚至可能影响功能,我在博文开头就写道,该解决方案有其缺点。

这篇文章不是给程序员的,而是给那些缺乏从内部更改代码的知识和经验的站点管理员的。 对于那些不愿或不能为网站的建成支付费用的人。 当开发人员通过某些廉价且通常完全免费的CMS使网站更便宜时,通常会发生这种情况。

为了防止这种情况的发生,您需要在可靠且受信任的CMS上开发站点,并提供高质量的技术支持。 Bitrix是开发此类项目最合适且功能最强大的CMS。 通过https:// wazzup向我们订购。 托管和Bitrix许可,我们准备免费配置和安装商店。

另外,请注意,我们有购买Bitrix许可证的特别优惠,长达6个月的免费托管期。

我们的客户选择Bitrix,因为它是俄罗斯联邦唯一最大的站点管理系统,具有强大的技术支持系统和强大的功能。 与免费和廉价的CMS相比,Bitrix的可靠性不仅取决于时间,还取决于程序员的持续合格技术支持,而CMS的开发和支持是由不断变化的发烧友进行的,没有太多经验。

Source: https://habr.com/ru/post/zh-CN470193/


All Articles