Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Read by thought-leaders and decision-makers around the world. Phone Number: +1-650-246-9381 Email: pub@towardsai.net
228 Park Avenue South New York, NY 10003 United States
Website: Publisher: https://towardsai.net/#publisher Diversity Policy: https://towardsai.net/about Ethics Policy: https://towardsai.net/about Masthead: https://towardsai.net/about
Name: Towards AI Legal Name: Towards AI, Inc. Description: Towards AI is the world's leading artificial intelligence (AI) and technology publication. Founders: Roberto Iriondo, , Job Title: Co-founder and Advisor Works for: Towards AI, Inc. Follow Roberto: X, LinkedIn, GitHub, Google Scholar, Towards AI Profile, Medium, ML@CMU, FreeCodeCamp, Crunchbase, Bloomberg, Roberto Iriondo, Generative AI Lab, Generative AI Lab Denis Piffaretti, Job Title: Co-founder Works for: Towards AI, Inc. Louie Peters, Job Title: Co-founder Works for: Towards AI, Inc. Louis-François Bouchard, Job Title: Co-founder Works for: Towards AI, Inc. Cover:
Towards AI Cover
Logo:
Towards AI Logo
Areas Served: Worldwide Alternate Name: Towards AI, Inc. Alternate Name: Towards AI Co. Alternate Name: towards ai Alternate Name: towardsai Alternate Name: towards.ai Alternate Name: tai Alternate Name: toward ai Alternate Name: toward.ai Alternate Name: Towards AI, Inc. Alternate Name: towardsai.net Alternate Name: pub.towardsai.net
5 stars – based on 497 reviews

Frequently Used, Contextual References

TODO: Remember to copy unique IDs whenever it needs used. i.e., URL: 304b2e42315e

Resources

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

Publication

Web Application Security: Top 11 Best Practices for 2021
Latest   Machine Learning

Web Application Security: Top 11 Best Practices for 2021

Last Updated on July 24, 2023 by Editorial Team

Author(s): Sophia Martin

Originally published on Towards AI.

Do you know cybercrime or hacking is quickly becoming more profitable than an illegal drug trade? Yes, you read it right! Every year we see thousands of hacking and security breaching cases in the news in which companies face monetary losses as well as it also spoils their brand reputation.

Have a look at some facts about cybercrime:

  • In the year 2019, IoT (internet of things) devices became significant targets for malware attacks. (source)
  • Email spam is one of the most common methods for cyber-criminals to spread malware. (source)
  • The external network connecting smart homes makes the UK, US, and China more vulnerable to cyber-attacks. (source)
  • Roughly 1 out of 5 files are not protected. (source)
  • Users in the United States open around 1 in 3 phishing emails. (source)
  • Information or data loss accounts for 43% of the costs in the cyber-attacks. (source)
  • More than half of Millennials have experienced cybercrime in the year 2019. (source)

It is clear from these stats that data or information security is a considerable risk in any organization. Here is an infographic depicting the importance of website security:

So, what are the steps for securing your website? Let’s find out in this blog:

1. Always Back-up All Your Website Data

When a malware infection or security breach occurs, and you need to restore your web app after that, it would be disastrous not to store the updated or recent version of your website. When the time comes to live your website again, you will be glad you postponed it. Therefore return your data as much as possible. It is worth noting that most of the hosting service providers will provide backups from their servers if this mishappening happens.

2. Periodically Scan your Website for Vulnerabilities

Security scans and checks should be done regularly to stay on top of the security of your web application. It would be a wise decision to do security scans on your websites at least once every week. In addition to this, you should scan after every change that you have made in your web application.

It is worth noting that various security scanners, even experienced people, will not be able to detect all the security issues. Scanners are either pattern-based or heuristic, and malware is always engineered to be invisible from the scanners. Some security scanners find malware better than others, and on the other hand, some struggle with false positives. Most of the security scanners do not work at all. Moreover, you should still learn about various security flaws & weaknesses.

3. Use a Website Security Platform Like WebARX

WebARX is one of the best tools for monitoring and protection, especially for web app developers. You may be thinking about why developers? Because with the help of WebARX, you can quickly secure your entire client portfolio and protect as many websites as you like.

So you can protect your web applications, save money and time, and stand ahead in the competition (it is always a good practice to add ‘Protected by WebARX’ to the website).

What does WebARX platform include:

WebARX is a web application firewall (WAF) that has a ton of features, and some of the features are:

OWASP (Open Web Application Security Project) base rules: it provides everyday protection for websites.

Smart threat intelligence that monitors your domain’s mentions in various hacker forums, defacement databases and target lists.

Blocking protection that is automated for different malicious traffic, brute-force attacks, and public exploit attacks.

Stats and logs on their cloud-based dashboard for checking up regularly

Defacement, uptime, and blacklist monitoring

State of art software vulnerability monitoring

Security reports about every site

2-factor authentication

Alert integrations for Slack & mail

The WebARX tool can be used on all PHP based web applications, and the prices are quite attractive as well. In addition to this, you can contact any software development company and have your own customized website security platform for better protection from hackers.

4. Conduct website security awareness training within your organization

If you run a business, there are chances that only a few people within your company have a decent understanding of the web application security importance and how it works. Most of the users in your organization have the most basic understanding of this issue, and it can make them even careless. In addition to this, it is also problematic because uneducated users fail to identify various security risks.

By educating your staff and employees, they’ll weaken themselves more easily. Furthermore, speeding up all about web application security is one of the best ways to get everyone in the act of finding and removing various security vulnerabilities. With this in mind, you can consider bringing in a web application security specialist in order to conduct various awareness training for your employees.

By getting all your staff and employee on board and making sure they know what to do if they encounter any software security vulnerability or any other problems, you can strengthen the overall security of your web application development process and get the best possible security

5. Effectively strategize your remediation operations

In recent years, software breach has been on the rise, spiking drastically in the year 2019 when the count was more than doubled from the previous year. This particular trend of software vulnerability shows no signs of giving up anytime soon, which means when you hire a web development company, you have to keep this thing in your mind.

Therefore, to effectively weed out any security flaws in your web apps, you should do a threat assessment which is based on the severity of a vulnerability (CVSS rating), which is how effective your web application is to your actions and other factors. In addition to this, when it comes to open source vulnerabilities, it helps to comprehend if your proprietary code is actually using any weak functionality in a given open source component.

Moreover, if the functionality of an unsafe component is not receiving any calls from your software product, it is considered ineffective; therefore, not a high risk, even if it has a severe rating of CVSS. A smart strategy prioritizes pressure apprehensions in the first place, taking into account various factors at play, and subsequently leaves those at comparatively low risk.

6. Effectively encrypt all your crucial website data

Making encryption of all your data provides you mental peace that your information is safe from hackers and cybercriminals. Then he locked you in danger of falling sensitive traffic information through man-in-the-middle attacks and other forms of intrusion. The IDs and the passwords for the user or other sources of information If you might be endangered treasurest up unto thyself against them, to explain to the country of the future by the text of customers.

If encryption so that it includes all your basic checklist that you are accompanied by a certificate SSL. But now it has become standard HTTPS, and would not be left behind. Hashing friends and being useful. Also, that “It is Crypto does not develop,” he said. Dedicated security team, which will have the right to have her.

7. Manage privileges of your website

All of your organization’s who do not have access to everything. Application security best practices, as well as network security leadership, which encourages us to limit access to only need it.

This is double. The first is that if a hacker can pop in accounting documents, Bob, we would like to be given later to roam freely on sensitive. The second, at other times of the latter, generally in insider threats. In order to avoid abominableness such a character, the white men held that it follows from the principal unless the users work, and the work that they must do the briefing with his. While this can be an act in itself, it may not be necessary, and it is also a good way to fear.

8. Embrace automation to effectively manage the vulnerabilities

Recent applications have a lot of developers who have had their safety in recent years, especially when it comes to vulnerability to business management. Although this transfer of responsibility seems to be the right move, data requires knowledge of its proximity to address vulnerabilities of the code development process for developers is now more than ever challenging.

Since the year 2017, a growing number of weaknesses, as was stated in the notes to make strategic Upcharikrn ops. Given the scale, to force developers to multipliers are automated tools to help maintain the number of alerts that will come your way.

Developers in the past a few years, they are the way to the automated DevOps to be standard when the sun also confirms this. Recently, many companies are trying to secure inclusion in its Dielsi, thus Award for Devsecops squad.

At this point, it can be to change the Ops of the war, helps to avoid the flight of ‘tear, And of sorrows, that there shall come in the sight of release, to try them.

The trial of proprietary code developed during the offer by the Security Application (SAST) can help you find potential vulnerabilities in your code. While this can be affordable to play a role in the security of the blockage of the legs with water, and proprietary code, except it, be so great in the aspect of the overall codebase. If there had not been explored with the open-source automated vulnerability management and security issues for commissioning, we are able to do so.

9. Effectively track all your assets

There is a very famous “you cannot protect what you do not know you have.” Did you not know that these duties as servers or applications to use? If you are using open source components that are in various web apps?

Just go Equifax, the protection of which is the lack of information on the late will be fined $700 for the more than 145 million people, ten times, it is important to be more fun than to remember and what does not run software that the apps. And the face of the credit rating agency had failed when it could be barely distinguished client vulnerable to patch up the open-source Apache struts-in components web portals, and it is believed that they were unaware that it is used.

In addition to the memory of the disaster of your head or of the good things to come. Now you can help them to keep the path of the just is right, after all. For this reason, he advises that it will be an automated process to feel that it is like a Sisyphean task organization to continue its growth. While you are at, it will take time for the kinds of things that are known to be of great importance gifts, and lesser importance and varied. Will serve to remedy this, and then the risk is your judgment.

10. Perform a threat assessment

The need for security, which is already suffering, we must begin to know and how to reduce them. They are able to freely make use of the power to burst in the use of things, who, a moment? Do we have current security measures to prevent or detect this attack? What does it not require other instruments?

These are the questions that are asked while going for the threat assessment, if not even the peril to the sum involved. However, this would out have realistic expectations for the expectation of the things which we can not accomplish this mission safely. This means that even though we may think of us as the maximum level of security, nothing is ever possible. I do not think there is a need for a certain rule and measure, both to be worthy, our horses, which we have a long, actually the last one. Pushing many signs can be safely ignored. Remember that security is a marathon, not a sprint.

It is granted that you can not risk the probability formula x = result of the first attack risk. The other way to think of evil is not so, the case, that it is more probable that if the verses of poetry. The chances of a whale, for it, would be to rub a little of the heavens if any evil. Alternatively, a hike through the bites of mosquitoes, therefore, is to try to get enough to be annoying, it is likely that at the end of the world.

11. Stay on top of your security patching

You patch up the latest versions of your operating system? What about the third-party software? Chances are, you are next. But the question is how do you explain yourself?

Maintains projects such as patches and updates with commercial or open-source software vendors to his city, one of the most important steps you can take to ensure the security of its software. Furthermore, because they were searched by security vulnerability researchers and reported to them by their product or project planning and security as well as public consumption database published in the National Vulnerability Database (NVD) is. Ideally, it created a fix before publication and is pushed out, which gives users the chance to secure in their software.

Of course, if he did this, the lakes would not be available, the more the assurance of safety to the highest step of the way in which we had not. That said, this kind of updating your application to be at the top of the security if the best practice on the day of the week.

Let’s Wrap Up:

In this blog, we have seen various points that you need to follow if you want to enhance the security level of your website. A vulnerable website can be detrimental to any organization. It can impact you in terms of monetary loss as well as reputation loss. You can hire a web development company that follows all crucial security checklists before delivering you the website. In addition to this, you can also take the above-mentioned measures to protect your web applications from hackers.

Join thousands of data leaders on the AI newsletter. Join over 80,000 subscribers and keep up to date with the latest developments in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

Published via Towards AI

Feedback ↓

Sign Up for the Course
`; } else { console.error('Element with id="subscribe" not found within the page with class "home".'); } } }); // Remove duplicate text from articles /* Backup: 09/11/24 function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag elements.forEach(el => { const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 2) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); */ // Remove duplicate text from articles function removeDuplicateText() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, strong'); // Select the desired elements const seenTexts = new Set(); // A set to keep track of seen texts const tagCounters = {}; // Object to track instances of each tag // List of classes to be excluded const excludedClasses = ['medium-author', 'post-widget-title']; elements.forEach(el => { // Skip elements with any of the excluded classes if (excludedClasses.some(cls => el.classList.contains(cls))) { return; // Skip this element if it has any of the excluded classes } const tagName = el.tagName.toLowerCase(); // Get the tag name (e.g., 'h1', 'h2', etc.) // Initialize a counter for each tag if not already done if (!tagCounters[tagName]) { tagCounters[tagName] = 0; } // Only process the first 10 elements of each tag type if (tagCounters[tagName] >= 10) { return; // Skip if the number of elements exceeds 10 } const text = el.textContent.trim(); // Get the text content const words = text.split(/\s+/); // Split the text into words if (words.length >= 4) { // Ensure at least 4 words const significantPart = words.slice(0, 5).join(' '); // Get first 5 words for matching // Check if the text (not the tag) has been seen before if (seenTexts.has(significantPart)) { // console.log('Duplicate found, removing:', el); // Log duplicate el.remove(); // Remove duplicate element } else { seenTexts.add(significantPart); // Add the text to the set } } tagCounters[tagName]++; // Increment the counter for this tag }); } removeDuplicateText(); //Remove unnecessary text in blog excerpts document.querySelectorAll('.blog p').forEach(function(paragraph) { // Replace the unwanted text pattern for each paragraph paragraph.innerHTML = paragraph.innerHTML .replace(/Author\(s\): [\w\s]+ Originally published on Towards AI\.?/g, '') // Removes 'Author(s): XYZ Originally published on Towards AI' .replace(/This member-only story is on us\. Upgrade to access all of Medium\./g, ''); // Removes 'This member-only story...' }); //Load ionic icons and cache them if ('localStorage' in window && window['localStorage'] !== null) { const cssLink = 'https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css'; const storedCss = localStorage.getItem('ionicons'); if (storedCss) { loadCSS(storedCss); } else { fetch(cssLink).then(response => response.text()).then(css => { localStorage.setItem('ionicons', css); loadCSS(css); }); } } function loadCSS(css) { const style = document.createElement('style'); style.innerHTML = css; document.head.appendChild(style); } //Remove elements from imported content automatically function removeStrongFromHeadings() { const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6, span'); elements.forEach(el => { const strongTags = el.querySelectorAll('strong'); strongTags.forEach(strongTag => { while (strongTag.firstChild) { strongTag.parentNode.insertBefore(strongTag.firstChild, strongTag); } strongTag.remove(); }); }); } removeStrongFromHeadings(); "use strict"; window.onload = () => { /* //This is an object for each category of subjects and in that there are kewords and link to the keywods let keywordsAndLinks = { //you can add more categories and define their keywords and add a link ds: { keywords: [ //you can add more keywords here they are detected and replaced with achor tag automatically 'data science', 'Data science', 'Data Science', 'data Science', 'DATA SCIENCE', ], //we will replace the linktext with the keyword later on in the code //you can easily change links for each category here //(include class="ml-link" and linktext) link: 'linktext', }, ml: { keywords: [ //Add more keywords 'machine learning', 'Machine learning', 'Machine Learning', 'machine Learning', 'MACHINE LEARNING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ai: { keywords: [ 'artificial intelligence', 'Artificial intelligence', 'Artificial Intelligence', 'artificial Intelligence', 'ARTIFICIAL INTELLIGENCE', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, nl: { keywords: [ 'NLP', 'nlp', 'natural language processing', 'Natural Language Processing', 'NATURAL LANGUAGE PROCESSING', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, des: { keywords: [ 'data engineering services', 'Data Engineering Services', 'DATA ENGINEERING SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, td: { keywords: [ 'training data', 'Training Data', 'training Data', 'TRAINING DATA', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, ias: { keywords: [ 'image annotation services', 'Image annotation services', 'image Annotation services', 'image annotation Services', 'Image Annotation Services', 'IMAGE ANNOTATION SERVICES', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, l: { keywords: [ 'labeling', 'labelling', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, pbp: { keywords: [ 'previous blog posts', 'previous blog post', 'latest', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, mlc: { keywords: [ 'machine learning course', 'machine learning class', ], //Change your article link (include class="ml-link" and linktext) link: 'linktext', }, }; //Articles to skip let articleIdsToSkip = ['post-2651', 'post-3414', 'post-3540']; //keyword with its related achortag is recieved here along with article id function searchAndReplace(keyword, anchorTag, articleId) { //selects the h3 h4 and p tags that are inside of the article let content = document.querySelector(`#${articleId} .entry-content`); //replaces the "linktext" in achor tag with the keyword that will be searched and replaced let newLink = anchorTag.replace('linktext', keyword); //regular expression to search keyword var re = new RegExp('(' + keyword + ')', 'g'); //this replaces the keywords in h3 h4 and p tags content with achor tag content.innerHTML = content.innerHTML.replace(re, newLink); } function articleFilter(keyword, anchorTag) { //gets all the articles var articles = document.querySelectorAll('article'); //if its zero or less then there are no articles if (articles.length > 0) { for (let x = 0; x < articles.length; x++) { //articles to skip is an array in which there are ids of articles which should not get effected //if the current article's id is also in that array then do not call search and replace with its data if (!articleIdsToSkip.includes(articles[x].id)) { //search and replace is called on articles which should get effected searchAndReplace(keyword, anchorTag, articles[x].id, key); } else { console.log( `Cannot replace the keywords in article with id ${articles[x].id}` ); } } } else { console.log('No articles found.'); } } let key; //not part of script, added for (key in keywordsAndLinks) { //key is the object in keywords and links object i.e ds, ml, ai for (let i = 0; i < keywordsAndLinks[key].keywords.length; i++) { //keywordsAndLinks[key].keywords is the array of keywords for key (ds, ml, ai) //keywordsAndLinks[key].keywords[i] is the keyword and keywordsAndLinks[key].link is the link //keyword and link is sent to searchreplace where it is then replaced using regular expression and replace function articleFilter( keywordsAndLinks[key].keywords[i], keywordsAndLinks[key].link ); } } function cleanLinks() { // (making smal functions is for DRY) this function gets the links and only keeps the first 2 and from the rest removes the anchor tag and replaces it with its text function removeLinks(links) { if (links.length > 1) { for (let i = 2; i < links.length; i++) { links[i].outerHTML = links[i].textContent; } } } //arrays which will contain all the achor tags found with the class (ds-link, ml-link, ailink) in each article inserted using search and replace let dslinks; let mllinks; let ailinks; let nllinks; let deslinks; let tdlinks; let iaslinks; let llinks; let pbplinks; let mlclinks; const content = document.querySelectorAll('article'); //all articles content.forEach((c) => { //to skip the articles with specific ids if (!articleIdsToSkip.includes(c.id)) { //getting all the anchor tags in each article one by one dslinks = document.querySelectorAll(`#${c.id} .entry-content a.ds-link`); mllinks = document.querySelectorAll(`#${c.id} .entry-content a.ml-link`); ailinks = document.querySelectorAll(`#${c.id} .entry-content a.ai-link`); nllinks = document.querySelectorAll(`#${c.id} .entry-content a.ntrl-link`); deslinks = document.querySelectorAll(`#${c.id} .entry-content a.des-link`); tdlinks = document.querySelectorAll(`#${c.id} .entry-content a.td-link`); iaslinks = document.querySelectorAll(`#${c.id} .entry-content a.ias-link`); mlclinks = document.querySelectorAll(`#${c.id} .entry-content a.mlc-link`); llinks = document.querySelectorAll(`#${c.id} .entry-content a.l-link`); pbplinks = document.querySelectorAll(`#${c.id} .entry-content a.pbp-link`); //sending the anchor tags list of each article one by one to remove extra anchor tags removeLinks(dslinks); removeLinks(mllinks); removeLinks(ailinks); removeLinks(nllinks); removeLinks(deslinks); removeLinks(tdlinks); removeLinks(iaslinks); removeLinks(mlclinks); removeLinks(llinks); removeLinks(pbplinks); } }); } //To remove extra achor tags of each category (ds, ml, ai) and only have 2 of each category per article cleanLinks(); */ //Recommended Articles var ctaLinks = [ /* ' ' + '

Subscribe to our AI newsletter!

' + */ '

Take our 85+ lesson From Beginner to Advanced LLM Developer Certification: From choosing a project to deploying a working product this is the most comprehensive and practical LLM course out there!

'+ '

Towards AI has published Building LLMs for Production—our 470+ page guide to mastering LLMs with practical projects and expert insights!

' + '
' + '' + '' + '

Note: Content contains the views of the contributing authors and not Towards AI.
Disclosure: This website may contain sponsored content and affiliate links.

' + 'Discover Your Dream AI Career at Towards AI Jobs' + '

Towards AI has built a jobs board tailored specifically to Machine Learning and Data Science Jobs and Skills. Our software searches for live AI jobs each hour, labels and categorises them and makes them easily searchable. Explore over 10,000 live jobs today with Towards AI Jobs!

' + '
' + '

🔥 Recommended Articles 🔥

' + 'Why Become an LLM Developer? Launching Towards AI’s New One-Stop Conversion Course'+ 'Testing Launchpad.sh: A Container-based GPU Cloud for Inference and Fine-tuning'+ 'The Top 13 AI-Powered CRM Platforms
' + 'Top 11 AI Call Center Software for 2024
' + 'Learn Prompting 101—Prompt Engineering Course
' + 'Explore Leading Cloud Providers for GPU-Powered LLM Training
' + 'Best AI Communities for Artificial Intelligence Enthusiasts
' + 'Best Workstations for Deep Learning
' + 'Best Laptops for Deep Learning
' + 'Best Machine Learning Books
' + 'Machine Learning Algorithms
' + 'Neural Networks Tutorial
' + 'Best Public Datasets for Machine Learning
' + 'Neural Network Types
' + 'NLP Tutorial
' + 'Best Data Science Books
' + 'Monte Carlo Simulation Tutorial
' + 'Recommender System Tutorial
' + 'Linear Algebra for Deep Learning Tutorial
' + 'Google Colab Introduction
' + 'Decision Trees in Machine Learning
' + 'Principal Component Analysis (PCA) Tutorial
' + 'Linear Regression from Zero to Hero
'+ '

', /* + '

Join thousands of data leaders on the AI newsletter. It’s free, we don’t spam, and we never share your email address. Keep up to date with the latest work in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

',*/ ]; var replaceText = { '': '', '': '', '
': '
' + ctaLinks + '
', }; Object.keys(replaceText).forEach((txtorig) => { //txtorig is the key in replacetext object const txtnew = replaceText[txtorig]; //txtnew is the value of the key in replacetext object let entryFooter = document.querySelector('article .entry-footer'); if (document.querySelectorAll('.single-post').length > 0) { //console.log('Article found.'); const text = entryFooter.innerHTML; entryFooter.innerHTML = text.replace(txtorig, txtnew); } else { // console.log('Article not found.'); //removing comment 09/04/24 } }); var css = document.createElement('style'); css.type = 'text/css'; css.innerHTML = '.post-tags { display:none !important } .article-cta a { font-size: 18px; }'; document.body.appendChild(css); //Extra //This function adds some accessibility needs to the site. function addAlly() { // In this function JQuery is replaced with vanilla javascript functions const imgCont = document.querySelector('.uw-imgcont'); imgCont.setAttribute('aria-label', 'AI news, latest developments'); imgCont.title = 'AI news, latest developments'; imgCont.rel = 'noopener'; document.querySelector('.page-mobile-menu-logo a').title = 'Towards AI Home'; document.querySelector('a.social-link').rel = 'noopener'; document.querySelector('a.uw-text').rel = 'noopener'; document.querySelector('a.uw-w-branding').rel = 'noopener'; document.querySelector('.blog h2.heading').innerHTML = 'Publication'; const popupSearch = document.querySelector$('a.btn-open-popup-search'); popupSearch.setAttribute('role', 'button'); popupSearch.title = 'Search'; const searchClose = document.querySelector('a.popup-search-close'); searchClose.setAttribute('role', 'button'); searchClose.title = 'Close search page'; // document // .querySelector('a.btn-open-popup-search') // .setAttribute( // 'href', // 'https://medium.com/towards-artificial-intelligence/search' // ); } // Add external attributes to 302 sticky and editorial links function extLink() { // Sticky 302 links, this fuction opens the link we send to Medium on a new tab and adds a "noopener" rel to them var stickyLinks = document.querySelectorAll('.grid-item.sticky a'); for (var i = 0; i < stickyLinks.length; i++) { /* stickyLinks[i].setAttribute('target', '_blank'); stickyLinks[i].setAttribute('rel', 'noopener'); */ } // Editorial 302 links, same here var editLinks = document.querySelectorAll( '.grid-item.category-editorial a' ); for (var i = 0; i < editLinks.length; i++) { editLinks[i].setAttribute('target', '_blank'); editLinks[i].setAttribute('rel', 'noopener'); } } // Add current year to copyright notices document.getElementById( 'js-current-year' ).textContent = new Date().getFullYear(); // Call functions after page load extLink(); //addAlly(); setTimeout(function() { //addAlly(); //ideally we should only need to run it once ↑ }, 5000); }; function closeCookieDialog (){ document.getElementById("cookie-consent").style.display = "none"; return false; } setTimeout ( function () { closeCookieDialog(); }, 15000); console.log(`%c 🚀🚀🚀 ███ █████ ███████ █████████ ███████████ █████████████ ███████████████ ███████ ███████ ███████ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ Towards AI is looking for contributors! │ │ Join us in creating awesome AI content. │ │ Let's build the future of AI together → │ │ https://towardsai.net/contribute │ │ │ └───────────────────────────────────────────────────────────────────┘ `, `background: ; color: #00adff; font-size: large`); //Remove latest category across site document.querySelectorAll('a[rel="category tag"]').forEach(function(el) { if (el.textContent.trim() === 'Latest') { // Remove the two consecutive spaces (  ) if (el.nextSibling && el.nextSibling.nodeValue.includes('\u00A0\u00A0')) { el.nextSibling.nodeValue = ''; // Remove the spaces } el.style.display = 'none'; // Hide the element } }); // Add cross-domain measurement, anonymize IPs 'use strict'; //var ga = gtag; ga('config', 'G-9D3HKKFV1Q', 'auto', { /*'allowLinker': true,*/ 'anonymize_ip': true/*, 'linker': { 'domains': [ 'medium.com/towards-artificial-intelligence', 'datasets.towardsai.net', 'rss.towardsai.net', 'feed.towardsai.net', 'contribute.towardsai.net', 'members.towardsai.net', 'pub.towardsai.net', 'news.towardsai.net' ] } */ }); ga('send', 'pageview'); -->