{"id":1805,"date":"2023-11-20T09:58:01","date_gmt":"2023-11-20T12:58:01","guid":{"rendered":"https:\/\/stackcodelab.com\/blog\/?p=1805"},"modified":"2023-12-03T11:11:44","modified_gmt":"2023-12-03T14:11:44","slug":"seguridad-en-aplicaciones-c","status":"publish","type":"post","link":"https:\/\/stackcodelab.com\/blog\/seguridad-en-aplicaciones-c\/","title":{"rendered":"Seguridad en Aplicaciones C#"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La seguridad en aplicaciones C# es fundamental para proteger los datos sensibles de los usuarios y prevenir vulnerabilidades que puedan ser explotadas por atacantes. En este cap\u00edtulo, exploraremos varios aspectos clave de la seguridad en el desarrollo de aplicaciones C#, incluyendo:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Encriptaci\u00f3n de Contrase\u00f1as y Datos Sensibles:<\/strong> Aprender\u00e1s c\u00f3mo almacenar contrase\u00f1as de manera segura utilizando algoritmos de hash y salting. Adem\u00e1s, veremos c\u00f3mo encriptar datos sensibles para protegerlos en reposo y en tr\u00e1nsito.<\/li>\n\n\n\n<li><strong>Validaci\u00f3n de Datos y Prevenci\u00f3n de Inyecci\u00f3n SQL:<\/strong> Exploraremos t\u00e9cnicas para validar y sanear los datos de entrada de los usuarios para prevenir ataques de inyecci\u00f3n SQL, que son una de las principales amenazas a las bases de datos.<\/li>\n\n\n\n<li><strong>Implementaci\u00f3n de Medidas de Seguridad:<\/strong> Discutiremos las mejores pr\u00e1cticas para implementar medidas de seguridad en aplicaciones C#, incluyendo la autenticaci\u00f3n y autorizaci\u00f3n, el uso de HTTPS, la protecci\u00f3n contra ataques comunes como Cross-Site Scripting (XSS) y Cross-Site Request Forgery (CSRF), y m\u00e1s.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">A lo largo de este cap\u00edtulo, abordaremos estos temas con ejemplos pr\u00e1cticos y consejos para fortalecer la seguridad de tus aplicaciones C#. La seguridad es un aspecto cr\u00edtico del desarrollo de software, y comprender c\u00f3mo proteger tus aplicaciones es esencial para mantener la confidencialidad, integridad y disponibilidad de los datos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><strong>Encriptaci\u00f3n de Contrase\u00f1as y Datos Sensibles:<\/strong><\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La encriptaci\u00f3n de contrase\u00f1as y datos sensibles es esencial para proteger la informaci\u00f3n confidencial en tus aplicaciones C#. Aqu\u00ed tienes una explicaci\u00f3n detallada de c\u00f3mo hacerlo:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Importancia de Almacenar Contrase\u00f1as de Manera Segura:<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Almacenar contrase\u00f1as de manera segura es fundamental para proteger las cuentas de usuario y prevenir posibles filtraciones de datos. Cuando las contrase\u00f1as se almacenan sin protecci\u00f3n, los atacantes pueden acceder f\u00e1cilmente a las cuentas de usuario y comprometer la seguridad de una aplicaci\u00f3n. Por eso, es vital utilizar t\u00e9cnicas de encriptaci\u00f3n adecuadas para garantizar que las contrase\u00f1as sean inaccesibles en caso de una brecha de seguridad.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a>M\u00e9todos y Bibliotecas para Encriptar Contrase\u00f1as y Datos Sensibles:<\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En C#, puedes utilizar las siguientes t\u00e9cnicas y bibliotecas para encriptar contrase\u00f1as y datos sensibles:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Hashing de Contrase\u00f1as:<\/strong> Hashing es un proceso irreversible que convierte una contrase\u00f1a en una cadena de caracteres alfanum\u00e9ricos. Puedes utilizar algoritmos de hashing como SHA-256 o bcrypt para almacenar contrase\u00f1as de manera segura. No almacenas la contrase\u00f1a real, sino el hash resultante, lo que hace que sea dif\u00edcil para los atacantes revertir el proceso y obtener la contrase\u00f1a original.<\/li>\n\n\n\n<li><strong>Salting de Contrase\u00f1as:<\/strong> El salting es una t\u00e9cnica que a\u00f1ade datos aleatorios (la \u00absal\u00bb) a la contrase\u00f1a antes de aplicar el hashing. Esto asegura que contrase\u00f1as id\u00e9nticas generen hashes diferentes. Siempre debes utilizar una sal \u00fanica para cada usuario.<\/li>\n\n\n\n<li><strong>Bibliotecas de Hashing y Salting:<\/strong> En C#, puedes utilizar bibliotecas como BCrypt.Net para facilitar el hashing y salting de contrase\u00f1as. Estas bibliotecas manejan la generaci\u00f3n de hashes y sales de manera segura.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><a>Implementaci\u00f3n de Almacenamiento Seguro de Contrase\u00f1as:<\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed hay un ejemplo de c\u00f3mo almacenar contrase\u00f1as de manera segura en una base de datos utilizando hashing y salting con la biblioteca BCrypt.Net:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using BCrypt.Net;\r\n\r\n\/\/ Genera una sal aleatoria \u00fanica para cada usuario\r\nstring salt = BCrypt.Net.BCrypt.GenerateSalt();\r\n\r\n\/\/ Combina la contrase\u00f1a del usuario con la sal\r\nstring hashedPassword = BCrypt.Net.BCrypt.HashPassword(\"passwordDelUsuario\", salt);\r\n\r\n\/\/ Almacena el hashedPassword y la sal en la base de datos\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando un usuario intenta iniciar sesi\u00f3n, puedes verificar su contrase\u00f1a de esta manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Recupera el hashedPassword y la sal de la base de datos para el usuario\r\nstring storedHashedPassword = \"hashedPasswordAlmacenadoEnLaBaseDeDatos\";\r\nstring storedSalt = \"salAlmacenadaEnLaBaseDeDatos\";\r\n\r\n\/\/ Combina la contrase\u00f1a proporcionada por el usuario con la sal almacenada\r\nstring userInputPassword = \"contrase\u00f1aIngresadaPorElUsuario\";\r\nstring combinedPassword = userInputPassword + storedSalt;\r\n\/\/ Verifica si el hash del combinedPassword coincide con el storedHashedPassword\r\nbool isPasswordValid = BCrypt.Net.BCrypt.Verify(combinedPassword, storedHashedPassword);\r\n\r\nif (isPasswordValid)\r\n{\r\n    \/\/ Contrase\u00f1a v\u00e1lida, permite el acceso\r\n}\r\nelse\r\n{\r\n    \/\/ Contrase\u00f1a incorrecta, deniega el acceso\r\n}\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este ejemplo demuestra c\u00f3mo almacenar contrase\u00f1as de manera segura y verificarlas al iniciar sesi\u00f3n. El uso de t\u00e9cnicas de hashing y salting fortalece significativamente la seguridad de las contrase\u00f1as en tus aplicaciones C#.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><strong>Validaci\u00f3n de Datos y Prevenci\u00f3n de Inyecci\u00f3n SQL:<\/strong><\/a><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La validaci\u00f3n de datos y la prevenci\u00f3n de inyecci\u00f3n SQL son fundamentales para garantizar la seguridad de tu aplicaci\u00f3n C# y protegerla contra ataques maliciosos. A continuaci\u00f3n, te proporciono ejemplos de c\u00f3mo realizar la validaci\u00f3n de datos y prevenir la inyecci\u00f3n SQL en tu aplicaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Validaci\u00f3ndeDatos:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La validaci\u00f3n de datos es el proceso de garantizar que los datos ingresados por los usuarios cumplan con ciertos criterios antes de ser procesados. Puedes usar la clase <code>Regex<\/code> en C# para realizar validaciones basadas en expresiones regulares. Aqu\u00ed tienes un ejemplo de validaci\u00f3n de una direcci\u00f3n de correo electr\u00f3nico:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System;\r\nusing System.Text.RegularExpressions;\r\n\r\nclass Program\r\n{\r\n    static bool IsValidEmail(string email)\r\n    {\r\n        string pattern = @\"^&#91;a-zA-Z0-9._%+-]+@&#91;a-zA-Z0-9.-]+\\.&#91;a-zA-Z]{2,}$\";\r\n        return Regex.IsMatch(email, pattern);\r\n    }\r\n\r\n    static void Main()\r\n    {\r\n        string userInput = Console.ReadLine();\r\n        if (IsValidEmail(userInput))\r\n        {\r\n            Console.WriteLine(\"La direcci\u00f3n de correo electr\u00f3nico es v\u00e1lida.\");\r\n        }\r\n        else\r\n        {\r\n            Console.WriteLine(\"La direcci\u00f3n de correo electr\u00f3nico no es v\u00e1lida.\");\r\n        }\r\n    }\r\n}\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, la funci\u00f3n <code>IsValidEmail<\/code> utiliza una expresi\u00f3n regular para validar la direcci\u00f3n de correo electr\u00f3nico ingresada por el usuario.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Prevenci\u00f3n de Inyecci\u00f3n SQL:<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">La prevenci\u00f3n de la inyecci\u00f3n SQL implica evitar que los atacantes inyecten c\u00f3digo SQL malicioso en las consultas a la base de datos. Para hacerlo, debes utilizar consultas parametrizadas o preferiblemente un ORM (Object-Relational Mapping) como Entity Framework Core, que genera consultas seguras autom\u00e1ticamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplo de prevenci\u00f3n de inyecci\u00f3n SQL utilizando Entity Framework Core:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using Microsoft.EntityFrameworkCore;\r\nusing System;\r\nusing System.Linq;\r\n\r\npublic class User\r\n{\r\n    public int UserId { get; set; }\r\n    public string Username { get; set; }\r\n    public string Password { get; set; }\r\n}\r\n\r\npublic class MyDbContext : DbContext\r\n{\r\n    public DbSet&lt;User> Users { get; set; }\r\n\r\n    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\r\n    {\r\n        optionsBuilder.UseSqlServer(\"tuCadenaDeConexi\u00f3nSQL\");\r\n    }\r\n}\r\n\r\nclass Program\r\n{\r\n    static void Main()\r\n    {\r\n        using (var dbContext = new MyDbContext())\r\n        {\r\n            string username = \"usuarioMalicioso'; DROP TABLE Usuarios; --\";\r\n            var user = dbContext.Users\r\n                .FromSqlRaw($\"SELECT * FROM Users WHERE Username = {username}\")\r\n                .FirstOrDefault();\r\n\r\n            if (user != null)\r\n            {\r\n                Console.WriteLine($\"Usuario encontrado: {user.Username}\");\r\n            }\r\n            else\r\n            {\r\n                Console.WriteLine(\"Usuario no encontrado o consulta maliciosa prevenida.\");\r\n            }\r\n        }\r\n    }\r\n}\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo, se utiliza Entity Framework Core con consultas parametrizadas para prevenir la inyecci\u00f3n SQL. Las consultas parametrizadas evitan que el c\u00f3digo malicioso se ejecute en la base de datos al escapar autom\u00e1ticamente los valores proporcionados por los usuarios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es importante implementar tanto la validaci\u00f3n de datos como la prevenci\u00f3n de la inyecci\u00f3n SQL en tu aplicaci\u00f3n C# para garantizar su seguridad y protegerla contra ataques.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><a><strong>Ejemplo: <\/strong><\/a>desarrollo de una aplicaci\u00f3n segura que previene ataques de inyecci\u00f3n SQL, CSRF<strong> y otros.<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El desarrollo de una aplicaci\u00f3n segura que previene ataques de inyecci\u00f3n SQL, CSRF (Cross-Site Request Forgery), XSS (Cross-Site Scripting) y otros ataques es un proceso integral que involucra m\u00faltiples capas de seguridad. A continuaci\u00f3n, te proporcionar\u00e9 un ejemplo simplificado de una aplicaci\u00f3n web ASP.NET Core que utiliza algunas t\u00e9cnicas de seguridad para prevenir estos ataques. Ten en cuenta que este es un ejemplo b\u00e1sico y que, en un entorno de producci\u00f3n, se requerir\u00e1n medidas de seguridad adicionales y una planificaci\u00f3n exhaustiva.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para este ejemplo, asumiremos que ya tienes una aplicaci\u00f3n ASP.NET Core en funcionamiento. Aqu\u00ed hay una breve descripci\u00f3n de c\u00f3mo implementar medidas de seguridad contra estos ataques:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. Prevenci\u00f3n de Inyecci\u00f3n SQL:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aseg\u00farate de utilizar Entity Framework Core o consultas parametrizadas para interactuar con la base de datos. Entity Framework Core genera consultas seguras autom\u00e1ticamente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Ejemplo de uso de Entity Framework Core\r\nvar user = dbContext.Users.FirstOrDefault(u => u.Username == username &amp;&amp; u.Password == password);\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Prevenci\u00f3n de CSRF:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ASP.NET Core ofrece protecci\u00f3n CSRF por defecto a trav\u00e9s de tokens de solicitud antifalsificaci\u00f3n. Debes incluir el token en las solicitudes POST y validar que coincida en el servidor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- En la vista Razor -->\r\n&lt;form method=\"post\">\r\n    @Html.AntiForgeryToken()\r\n    &lt;!-- Resto de campos del formulario -->\r\n&lt;\/form>\r\n\/\/ En el controlador\r\n&#91;HttpPost]\r\n&#91;ValidateAntiForgeryToken]\r\npublic IActionResult MiAccion()\r\n{\r\n    \/\/ Validar el token antifalsificaci\u00f3n aqu\u00ed\r\n    if (!ModelState.IsValid)\r\n    {\r\n        return BadRequest();\r\n    }\r\n    \/\/ Procesar la solicitud\r\n}\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Prevenci\u00f3n de XSS:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utiliza la codificaci\u00f3n de salida para evitar la ejecuci\u00f3n de scripts en las vistas Razor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- En la vista Razor -->\r\n&lt;p>@Html.DisplayFor(model => model.Descripcion)&lt;\/p>\r<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. Otras medidas de seguridad:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Implementa pol\u00edticas de seguridad de encabezado HTTP adecuadas en tu aplicaci\u00f3n.<\/li>\n\n\n\n<li>Realiza validaci\u00f3n de entrada en todos los formularios y campos.<\/li>\n\n\n\n<li>Limita los privilegios y los permisos de acceso a datos para usuarios autenticados.<\/li>\n\n\n\n<li>Utiliza autenticaci\u00f3n y autorizaci\u00f3n basada en roles.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Este ejemplo es solo un punto de partida y no cubre todas las consideraciones de seguridad necesarias en una aplicaci\u00f3n real. La seguridad es un tema amplio y en constante evoluci\u00f3n, por lo que te recomiendo consultar las mejores pr\u00e1cticas de seguridad y, si es posible, contar con la revisi\u00f3n de un experto en seguridad antes de implementar medidas de seguridad en una aplicaci\u00f3n en producci\u00f3n.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La seguridad en aplicaciones C# es fundamental para proteger los datos sensibles de los usuarios y prevenir vulnerabilidades que puedan ser explotadas por atacantes. En este cap\u00edtulo, exploraremos varios aspectos clave de la seguridad en el desarrollo de aplicaciones C#, incluyendo: A lo largo de este cap\u00edtulo, abordaremos estos temas con ejemplos pr\u00e1cticos y consejos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2098,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[34],"tags":[],"class_list":["post-1805","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-y-otras-hierbas"],"uagb_featured_image_src":{"full":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C.jpg",1000,665,false],"thumbnail":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C-150x150.jpg",150,150,true],"medium":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C-300x200.jpg",300,200,true],"medium_large":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C-768x511.jpg",768,511,true],"large":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C.jpg",1000,665,false],"1536x1536":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C.jpg",1000,665,false],"2048x2048":["https:\/\/stackcodelab.com\/blog\/wp-content\/uploads\/2023\/11\/Seguridad-en-Aplicaciones-C.jpg",1000,665,false]},"uagb_author_info":{"display_name":"arquitecto","author_link":"https:\/\/stackcodelab.com\/blog\/author\/arquitecto\/"},"uagb_comment_info":0,"uagb_excerpt":"La seguridad en aplicaciones C# es fundamental para proteger los datos sensibles de los usuarios y prevenir vulnerabilidades que puedan ser explotadas por atacantes. En este cap\u00edtulo, exploraremos varios aspectos clave de la seguridad en el desarrollo de aplicaciones C#, incluyendo: A lo largo de este cap\u00edtulo, abordaremos estos temas con ejemplos pr\u00e1cticos y consejos&hellip;","_links":{"self":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts\/1805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/comments?post=1805"}],"version-history":[{"count":1,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts\/1805\/revisions"}],"predecessor-version":[{"id":1806,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/posts\/1805\/revisions\/1806"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/media\/2098"}],"wp:attachment":[{"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/media?parent=1805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/categories?post=1805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stackcodelab.com\/blog\/wp-json\/wp\/v2\/tags?post=1805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}