Sucedió que durante el año pasado tuve que lidiar con el soporte técnico para el alojamiento, así como con el soporte para sitios con los que tengo una relación bastante indirecta. Y como los administradores a menudo enfrentan todo tipo de ataques en sus sitios, aunque no tienen la oportunidad de contratar a un especialista, se me ocurrió encontrar una solución única y universal para todos los sitios que los ayudaría a proteger su sitio sin mucho esfuerzo. Y aunque todavía hay muchos inconvenientes y matices que aún no he podido resolver, sin embargo, esta es la única solución en este momento que le permite asegurar el sitio desde el interior sin recurrir a todo tipo de complementos y módulos que deben instalarse desde el exterior y que incluso El desarrollador de sitios web sin experiencia puede instalar y configurar en su sitio. La esencia de esta solución es procesar los datos transmitidos por los métodos GET, POST y / o COOKIE, incluso antes de que se procesen y escriban directamente en la base de datos.
En este artículo daré ejemplos del uso y las desventajas de un método en particular.
Aquí está el código en sí
$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 {
El ejemplo anterior solo maneja las solicitudes GET. Por lo tanto, el bucle debe repetirse con al menos POST y COOKIE. Desafortunadamente, no pude ejecutar esta solución de forma recursiva en la función y pasar todos los arreglos $ _GET, $ _POST y $ _COOKIE que necesitábamos al mismo tiempo. Y lo más importante que no se pudo realizar fue un recorrido recursivo de matrices multidimensionales de este tipo, que está asociado con la peculiaridad de la transferencia de datos dentro de la función, así como el uso limitado de variables variables.
1) $ v = preg_replace ("'<script [^>] *?>. *? ' Si", "", $ v);
Aquí eliminamos el código de JavaScript explícitamente innecesario. Una función puede resultar superflua si todavía le permite pasar directamente el código en sí, no para su ejecución, sino para su familiarización. Por ejemplo en los foros.
2) $ v = str_replace ($ jsxss, "", $ v);La función es similar a la primera, solo en este caso eliminamos los eventos que se pueden usar para ataques xss. Puede modificar ligeramente esta solución y cortar no solo el evento en sí, sino también el contenido que intentan adjuntarle. Pero aún no he visto la necesidad de hacerlo.
3) $ v = str_replace (array ("*", "\\"), "", $ v);Y estos caracteres dañinos, especialmente la barra diagonal inversa, pueden hacer que su SQL sea pirateado. Dado que el símbolo en sí se usa muy raramente, y su peligro potencial es bastante alto, decidí destruirlo de raíz.
4) $ v = mysql_real_escape_string ($ v);El uso de esta función puede causar un escape innecesario de caracteres, porque lo más probable es que ya se use directamente al escribir datos en la base de datos, pero por otro lado, lo ayudará a protegerse de la inyección de SQL y proteger sus datos como ningún otro. Al usarlo, debe usar la función después de conectarse a la base de datos. Además, no olvidemos que mysql_real_escape_string no se usa en php 7, y el uso de dichas funciones depende del método de conexión. Por ejemplo, cuando se conecta a la base de datos a través de mysqli, es posible que deba usar la función mysqli_real_escape_string.
5) $ v = strip_tags ($ v);Strip_tags ayudará a eliminar todas las etiquetas innecesarias. Lamentablemente, los necesarios también. El segundo parámetro puede especificar las etiquetas que desea dejar. Pero el problema es que hay tantas etiquetas necesarias que enumerarlas es bastante problemático y, lo que es más lamentable, también hay etiquetas que los desarrolladores del sitio agregan por su cuenta para crear ciertas funciones en el sitio. Por supuesto, sería mucho más conveniente especificar las etiquetas que deben eliminarse y no dejarse. Pero nos contentaremos con lo que tenemos. Además, se pueden usar expresiones regulares para tales decisiones.
6) $ v = htmlentities ($ v, ENT_QUOTES, "UTF-8");
7) $ v = htmlspecialchars ($ v, ENT_QUOTES);Creo que estas dos funciones no necesitan presentarse y una es similar a la otra, por lo que es suficiente usar una de ellas. Sin embargo, están lejos de ser siempre apropiados.
Por el momento, eso es todo lo que pude recoger. Si alguien tiene algo para complementar este artículo, solo me alegraré;)
PD Para aquellos que desean una solución y ofrecen usar PDO, motores de plantillas, diferentes módulos de servidor, etc. De ninguna manera niego que esta solución tenga sus inconvenientes, y en algún lugar distorsionará la conclusión e incluso puede afectar la funcionalidad, para lo cual escribí al comienzo de la publicación que la solución tiene sus inconvenientes.
Esta publicación no es para programadores, es para administradores del sitio que carecen del conocimiento y la experiencia para cambiar el código desde adentro. Para aquellos que no quieren, o no pueden, pagar por la finalización de los sitios. Lo que sucede a menudo cuando un desarrollador hace que los sitios web sean más baratos en algunos CMS económicos y, a menudo, completamente gratuitos.
Y para evitar que esto suceda, debe desarrollar sus sitios en un CMS confiable y confiable, con soporte técnico de alta calidad. El CMS más adecuado y funcional para desarrollar tales proyectos es Bitrix. Pedidos de nosotros en
https: // wazzup . Hosting y licencia de Bitrix, estamos listos para configurar e instalar la tienda de forma gratuita.
Además, tenga en cuenta que tenemos una oferta especial para la compra de una licencia de Bitrix, hasta 6 meses de alojamiento es gratuito.
Nuestros clientes eligen Bitrix, ya que este es el único sistema de administración de sitios más grande en la Federación Rusa con un gran sistema de soporte técnico y una potente funcionalidad. La fiabilidad de Bitrix está determinada no solo por el tiempo, sino también por el constante soporte técnico calificado de los programadores, en contraste con el CMS gratuito y económico, cuyo desarrollo y soporte lo realizan entusiastas en constante cambio, sin mucha experiencia.