<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ajibola jr. MSc, Cybersecurity</title>
    <description>The latest articles on Forem by Ajibola jr. MSc, Cybersecurity (@jibbsjunior).</description>
    <link>https://forem.com/jibbsjunior</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F296494%2F5664a66d-6869-4b2f-a659-5666c406bc9a.jpeg</url>
      <title>Forem: Ajibola jr. MSc, Cybersecurity</title>
      <link>https://forem.com/jibbsjunior</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jibbsjunior"/>
    <language>en</language>
    <item>
      <title>AI isn't just replacing you; It's rotting your brain</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Tue, 14 Apr 2026 10:58:55 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/ai-isnt-just-replacing-you-its-rotting-your-brain-2c7c</link>
      <guid>https://forem.com/jibbsjunior/ai-isnt-just-replacing-you-its-rotting-your-brain-2c7c</guid>
      <description>&lt;p&gt;We've moved from the "Information Age" to the "Autopilot Age," and the cost is higher than your monthly subscription if you think about it.&lt;br&gt;
Let me highlight why your greatest tool is becoming your biggest liability.&lt;br&gt;
&lt;strong&gt;1.    The Death of Struggle&lt;/strong&gt;&lt;br&gt;
Growth happens in the 2 hours you spend debugging a single line of code. When you ask an LLM for the fix in 2 seconds, you get the "what" but lose the "why." This means you're not an engineer anymore, you're a copy-paste architect.&lt;br&gt;
&lt;strong&gt;2.    Cognitive Atrophy&lt;/strong&gt;&lt;br&gt;
Think of it like GPS. Even though we have tons of maps on the street in London, we've stopped learning how to read them, and now we're lost without a signal. If you let AI structure your thoughts, write your emails, and solve your logic, your critical thinking muscles are effectively in a cast.&lt;br&gt;
&lt;strong&gt;3.    The Feedback Loop of Mid&lt;/strong&gt;&lt;br&gt;
AI is trained on the average of human output. When you rely on it, your ceiling becomes the "average." You might be faster, but you're becoming efficiently mediocre.&lt;br&gt;
&lt;strong&gt;4.    Algorithmic Docility&lt;/strong&gt;&lt;br&gt;
In Cybersecurity, we know the biggest vulnerability is a user who doesn't question things. If you've stopped fact-checking the "black box," you've already been social-engineered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Final Thought:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use AI as a power tool, not a crutch. The moment you stop struggling is the moment you stop growing. Don't let the machine overthink you🤠&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>cybersecurity</category>
      <category>softwareengineering</category>
      <category>discuss</category>
    </item>
    <item>
      <title>AI Isn't Taking Your Job; It's Changing the Math of the Tech Team</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:04:18 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/ai-isnt-taking-your-job-its-changing-the-math-of-the-tech-team-a7a</link>
      <guid>https://forem.com/jibbsjunior/ai-isnt-taking-your-job-its-changing-the-math-of-the-tech-team-a7a</guid>
      <description>&lt;p&gt;Over the last few years, there has been a wave of pandemonium regarding AI taking over jobs. Every time we see a headline about layoffs like Google's 12k cuts in 2023 or more recent movements at Oracle, the immediate reaction is "The robots are here to replace us."&lt;/p&gt;

&lt;p&gt;But if we look beneath the surface, the reality is much more nuanced. As a software engineer currently swerving into the cybersecurity space, I've been watching this shift closely. Here's why the "AI is taking our jobs" narrative tells only half the story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Over-hiring" Hangover&lt;/strong&gt;&lt;br&gt;
Firstly, we have to be honest about the context. In 2020, during the pandemic, big tech companies overhired at an unsustainable rate to keep up with the digital boom. What we are seeing now isn't just an "AI replacement" phase. It's a market correction. Many of the roles being cut today were a result of that rapid expansion, long before LLMs became a household name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The New Equation:&lt;/strong&gt; 1 Senior + AI = 3 Developers. Companies are using AI to streamline processes, not necessarily to delete departments. Think of it this way:&lt;/p&gt;

&lt;p&gt;Imagine an IT department with 100 engineers: 50 Seniors, 20 Mid-levels, 10 Juniors, and 10 Entry-levels. When a Senior Engineer masters AI tools, their productivity doesn't just increase by 10%; it multiplies. A senior guy using AI can now deliver the output of one senior plus two mid-levels.&lt;/p&gt;

&lt;p&gt;By doing this, companies can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduce the Backlog:&lt;/strong&gt; Tasks that used to take weeks now take days.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shorten Delivery Dates:&lt;/strong&gt; Products move to market faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lean Out the Team:&lt;/strong&gt; Unfortunately, this often means the entry-level and junior roles, the ones typically doing the heavy lifting on boilerplate code, are the first to be cut.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Good News: A New Job Economy:&lt;/strong&gt;&lt;br&gt;
While some doors are closing, others are being kicked wide open. We shouldn't turn all our attention to the cuts; we need to look at where the talent is moving.&lt;/p&gt;

&lt;p&gt;New platforms like &lt;strong&gt;Outlier&lt;/strong&gt; and &lt;strong&gt;OneForma&lt;/strong&gt; are prime examples of the burgeoning AI-training industry. People are literally getting paid to train, refine, and audit the very models that are changing our industry. AI is creating a demand for specialized roles that didn't exist three years ago, especially in data validation and ethical oversight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts: Get Smart or Stay Salty&lt;/strong&gt;&lt;br&gt;
AI is here to stay, whether we like it or not. Its future isn't about taking jobs from people. It's about helping people deliver tasks swiftly, improving decision-making, and ideally, promoting a better work-life balance.&lt;/p&gt;

&lt;p&gt;The responsibility now lies with us. You can either utilize these tools to become a &lt;strong&gt;multiplier&lt;/strong&gt; in your field or be salty about the change. As we lean into this new era, we also have a responsibility to use these tools ethically and securely, especially as the stakes in cybersecurity continue to rise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What do you think? Is AI a threat to your specific role, or have you already found ways to make it your "force multiplier"?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's discuss in the comments below.👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A quick guide to Python's Dictionary</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Mon, 23 Feb 2026 11:26:15 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/a-quick-guide-to-pythons-dictionary-361k</link>
      <guid>https://forem.com/jibbsjunior/a-quick-guide-to-pythons-dictionary-361k</guid>
      <description>&lt;p&gt;A dictionary is one of the most significant data structures in Python; it is literally a dictionary, mutable, not a sequence type, but it can be adapted for sequence processing. &lt;/p&gt;

&lt;p&gt;How do we make a dictionary?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
empty_dictionary = {}
dictionary = {"man": "woman", "boy": "girl", "tall": "short", "giant": "dwarf"}
staff_address = {"Jibbs": "London", "KB": "Milton Keynes", "MJ": "Stoke-on-Trent"}
phone_numbers = {"Jibbs": 473747383, "KB": 483943929, 'MJ': 39394930}
staff_id = {34: "JB", 23: "KB", 21: "MJ"}
indexes = {23: 43, 43: 75, 38: 87}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the above examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first one is an empty dictionary, constructed with an empty pair of curly braces. &lt;/li&gt;
&lt;li&gt;The second and third ones use keys and values that are both strings. &lt;/li&gt;
&lt;li&gt;In the fourth one, the keys are strings while the values are integers.&lt;/li&gt;
&lt;li&gt;In the fifth example, the key is an integer while the values are strings.&lt;/li&gt;
&lt;li&gt;In the last example, both keys and values are integers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used the last two examples to establish that reverse layout (key -&amp;gt; numbers, values -&amp;gt; strings), as well as number -&amp;gt; number combinations, are possible.&lt;/p&gt;

&lt;p&gt;A dictionary is not a list (I'll cover lists in a separate article), it's a set of key-value pairs, and the following applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The key can be any immutable data type, e.g., integer, float, or even a string. never a list.&lt;/li&gt;
&lt;li&gt;Each key must be unique, as it's not possible to have more than one key of the same value.&lt;/li&gt;
&lt;li&gt;Functions like len() work for dictionaries too; it returns the number of key-value elements in the dictionary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, it's time to work with our examples.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let's print the second dictionary as a whole using the &lt;em&gt;print()&lt;/em&gt; function:
&lt;code&gt;print(dictionary)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;output: {'man': 'woman', 'boy': 'girl', 'tall': 'short', 'giant': 'dwarf'}&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Getting a single element from the dictionary:
&lt;code&gt;print(dictionary['giant'])&lt;/code&gt;
&lt;code&gt;output =&amp;gt; dwarf&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;print(dictionary['long'])&lt;/code&gt;&lt;br&gt;
&lt;code&gt;output =&amp;gt; KeyError: 'long'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What just happened? We tried to get a nonexistent key from the dictionary, but an exception was thrown; it's nothing to worry about. Here's a workaround to fix the error.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;print(dictionary.get('long'))&lt;/code&gt;&lt;br&gt;
&lt;code&gt;output =&amp;gt; None&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This means a &lt;code&gt;dictionary['key']&lt;/code&gt; will raise an error if the key is missing, while &lt;code&gt;dictionary.get('key')&lt;/code&gt; will return None.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Looping through a dictionary
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for elem in dictionary:
    print(elem, '=&amp;gt;', dictionary[elem])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;output: man =&amp;gt; woman&lt;br&gt;
boy =&amp;gt; girl&lt;br&gt;
tall =&amp;gt; short&lt;br&gt;
giant =&amp;gt; dwarf&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Print the dictionary length using len()&lt;br&gt;
&lt;code&gt;print(len(dictionary))&lt;/code&gt;&lt;br&gt;
&lt;code&gt;output: 4&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse a dictionary using the keys() method&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for key in dictionary.keys():
    print(key, '=&amp;gt;', dictionary[key])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;output: man =&amp;gt; woman&lt;br&gt;
boy =&amp;gt; girl&lt;br&gt;
tall =&amp;gt; short&lt;br&gt;
giant =&amp;gt; dwarf&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browse the dictionary using the items() method
This method returns a tuple where each tuple is a key-value pair
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for word, opposite in dictionary.items():
    print(key, '=&amp;gt;', opposite)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;output: man =&amp;gt; woman&lt;br&gt;
boy =&amp;gt; girl&lt;br&gt;
tall =&amp;gt; short&lt;br&gt;
giant =&amp;gt; dwarf&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can you print only the keys or the values? Of course, here's the solution:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#To get only the keys 
for key in dictionary.keys():
    print(key)

#To get only the values
for value in dictionary.values():
    print(value)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Modifying dictionaries
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dictionary['man'] = "New Man"
print(dictionary)
Output: {'man': 'New Man', 'boy': 'girl', 'tall': 'short', 'giant': 'dwarf'}

#Adding new keys to the dictionary
dictionary['far'] = "near"
print(dictionary)
Output: {'man': 'New Man', 'boy': 'girl', 'tall': 'short', 'giant': 'dwarf', 'far': 'near'}

#Adding new keys using the _update()_ method

dictionary.update({'dim': 'dull'})
print(dictionary)
Output: {'man': 'New Man', 'boy': 'girl', 'tall': 'short', 'giant': 'dwarf', 'far': 'near', 'dim': 'dull'}

#Removing a key
del dictionary['tall']
print(dictionary)
Output: {'man': 'New Man', 'boy': 'girl', 'giant': 'dwarf', 'far': 'near', 'dim': 'dull'}

#Using the _popitem()_ method
dictionary.popitem() #Please note, if you use this method on Python version &amp;lt; 3.6, it'll remove a random element from the dictionary
print(dictionary)
Output: {'man': 'New Man', 'boy': 'girl', 'giant': 'dwarf', 'far': 'near'}

#Check if an element exists using the _in_ keyword
if "man" in dictionary:
   print("yes")
else:
   print("no")
Output: yes

#Check if an element doesn't exists using the _not in_ keyword
if "close" not in dictionary:
   print("yes")
else:
   print("no")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dictionary is a mutable data type.&lt;/li&gt;
&lt;li&gt;It's literally a dictionary.&lt;/li&gt;
&lt;li&gt;It can be created using a pair of curly braces {}&lt;/li&gt;
&lt;li&gt;You can check the existence of a Python dictionary using the &lt;em&gt;in()&lt;/em&gt;   or &lt;em&gt;not in&lt;/em&gt; keyword.&lt;/li&gt;
&lt;li&gt;You can use a &lt;em&gt;for&lt;/em&gt; loop to loop through a dictionary.&lt;/li&gt;
&lt;li&gt;You can copy its content using the &lt;em&gt;copy()&lt;/em&gt; method.&lt;/li&gt;
&lt;li&gt;You can remove an element from a dictionary using the &lt;em&gt;del&lt;/em&gt; keyword.&lt;/li&gt;
&lt;li&gt;You can loop through a dictionary's keys and values using the &lt;em&gt;items()&lt;/em&gt; keyword&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>security</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The USB that Changed Warfare: Lessons from Stuxnet</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Sun, 25 Jan 2026 15:19:03 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/the-usb-that-changed-warfare-lessons-from-stuxnet-34jh</link>
      <guid>https://forem.com/jibbsjunior/the-usb-that-changed-warfare-lessons-from-stuxnet-34jh</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Stuxnet Case Study:&lt;/strong&gt; The "&lt;em&gt;Ghost&lt;/em&gt;" in the Machine&lt;br&gt;
The Setup: Stuxnet was a highly complex worm designed to sabotage Iran’s uranium enrichment centrifuges. Unlike most attacks, it didn't come through the &lt;em&gt;internet&lt;/em&gt;; it was likely introduced via a p_hysical USB drive_, bypassing the &lt;strong&gt;Firewall&lt;/strong&gt; entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fail (Where an IDS could have helped):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lateral Movement:&lt;/strong&gt; Once inside, Stuxnet moved through the internal network searching for specific Siemens industrial controllers. A Host-based IDS (HIDS) could have flagged the unusual file replications and internal "scanning" behavior.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Man-in-the-Middle (The Stealth):&lt;/strong&gt; The most genius (and terrifying) part? Stuxnet recorded "normal" operating data and played it back to the operators’ screens. While the centrifuges were physically tearing themselves apart, the monitors showed everything was "Perfect".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anomaly Detection:&lt;/strong&gt; An Anomaly-based IDS might have noticed that while the reported data was normal, the network traffic patterns used to send those "fake" reports were new or slightly off-timing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The "Stuxnet-Style" Lateral Movement Rule&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Stuxnet was famous for moving laterally through networks using the &lt;em&gt;SMB (Server Message Block)&lt;/em&gt; protocol. You can write a rule to detect suspicious SMB traffic that might indicate an attacker is trying to replicate themselves across your internal servers.&lt;/p&gt;

&lt;p&gt;A Snort rule consists of a header (defining the action, protocol, and IP/port) and options (defining the specific payload or behavior to detect).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An example of the rule you could use&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;alert tcp $HOME_NET any -&amp;gt; $HOME_NET 445 (msg:"LATERAL MOVEMENT - Potential SMB Self-Replication Attempt"; flow:to_server,established; content:"|ff|SMB"; content:"|75|"; distance:1; within:1; classtype:trojan-activity; sid:1000002; rev:1;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A brief explanation about the rule&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Header (alert tcp $HOME_NET any -&amp;gt; $HOME_NET 445): This focuses on internal traffic (home network to home network) over port 445, which SMB uses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;flow:to_server,established: This ensures the rule only triggers on a successful, established connection, reducing false positives from random noise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;content:"|ff|SMB": This looks for the hexadecimal signature of an SMB header in the packet payload.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;classtype:trojan-activity: This categorizes the alert so your security team knows it's a potential malware infection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sid:1000002: A unique Snort ID. Custom rules should always start at 1,000,000+ to avoid clashing with official rulesets.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Moral of the story:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Stuxnet used four "Zero Day" vulnerabilities. As a Software Engineer, have this at the back of your mind; Even a perfect code won't save you if the attacker knows a hole you don't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This is the ultimate example of "Air Gapped" security failure. it proves that "no internet connection" doesn't mean "no risk"&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What are your thoughts?&lt;/em&gt; Leave them below 👇&lt;/p&gt;

</description>
      <category>infosec</category>
      <category>cybersecurity</category>
      <category>msccybersecurity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Cybersecurity 101</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Fri, 23 Jan 2026 21:02:53 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/cybersecurity-101-jp2</link>
      <guid>https://forem.com/jibbsjunior/cybersecurity-101-jp2</guid>
      <description>&lt;p&gt;I spent years as a &lt;strong&gt;Software Engineer&lt;/strong&gt; before starting my &lt;em&gt;MSc&lt;/em&gt; in &lt;strong&gt;Cybersecurity&lt;/strong&gt;. The biggest lesson? Most devs write functional code that is a "welcome mat" for &lt;strong&gt;hackers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here are &lt;strong&gt;3 common mistakes&lt;/strong&gt; that are probably sitting in your repo right now: 🧵&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hardcoding Secrets: It sounds obvious, but "temporary" &lt;strong&gt;API&lt;/strong&gt; keys in source code often become permanent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: Use environment variables or a dedicated Secret Manager from day one. Don't let a &lt;strong&gt;.env&lt;/strong&gt; file leak into your public GitHub.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trusting User Input: If you aren't sanitizing every string that hits your database, you’re asking for an SQL injection.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Fix: Use parameterized queries. Never "stitch" strings together to build a query. 🛡️&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The "It’s Just a Side Project" Mentality: &lt;strong&gt;Hackers&lt;/strong&gt; don't care if your app has 10 users or 10,000. &lt;strong&gt;Vulnerabilities&lt;/strong&gt; are automated—bots find them before you even finish your coffee.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Which one are you most guilty of? Let's discuss. 👇&lt;/p&gt;

</description>
      <category>security</category>
      <category>discuss</category>
      <category>cybersecurity</category>
      <category>api</category>
    </item>
    <item>
      <title>Intrusion Detection System (IDS) and why a firewall alone won't save you from attacks</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Fri, 23 Jan 2026 17:28:07 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/intrusion-detection-system-ids-and-why-a-firewall-alone-wont-save-you-from-attacks-1fib</link>
      <guid>https://forem.com/jibbsjunior/intrusion-detection-system-ids-and-why-a-firewall-alone-wont-save-you-from-attacks-1fib</guid>
      <description>&lt;p&gt;Let's talk about the Intrusion Detection System (IDS) and why a firewall isn't enough to prevent you from attacks. &lt;/p&gt;

&lt;p&gt;If a Firewall is the bouncer at your network's front door, an Intrusion Detection System (IDS) is the "digital Sherlock Holmes" inside the party. 🕵️‍♂️💻&lt;/p&gt;

&lt;p&gt;Most people think a firewall is enough. It's not. Here’s why your network needs a nosy neighbour: 🧵&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;br&gt;
🧱 Firewall: Blocks or allows guests based on the list (IPs/Ports).&lt;br&gt;
🔎 IDS: Watches everyone inside the party. It doesn't stop them, but if someone starts picking a lock or hiding in a closet, it screams for help.&lt;/p&gt;

&lt;p&gt;It’s a surveillance camera, not a barrier.&lt;/p&gt;

&lt;p&gt;There are two main types we study in my Cybersecurity MSc:&lt;br&gt;
🌐 NIDS (Network-based): Scans all traffic flowing through the house.&lt;br&gt;
🖥️ HIDS (Host-based): A private eye sitting on a single computer, watching for file changes/unauthorised logins. Most robust systems use the two to prevent blind spots.&lt;/p&gt;

&lt;p&gt;How does it "see" threats?&lt;br&gt;
1️⃣ Signature-based: Like a "Most Wanted" list. If a known hacker's signature matches, the alarm rings.&lt;br&gt;
2️⃣ Anomaly-based: It learns what "normal" behaviour looks like. If I usually log in at 9 AM and suddenly someone logs in as me at 3 AM from a new IP? Alert!&lt;/p&gt;

&lt;p&gt;💡 The Pro Tip: If you want your IDS to actually do something, upgrade to an IPS (Intrusion Prevention System) It doesn't just bark; it bites (blocks the threat in real time).&lt;/p&gt;

&lt;p&gt;Have you ever set up an IDS, e.g., Snort or Suricata? Let’s talk about the nightmare of false positives!👇&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>systems</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Vanilla JS or Framework?</title>
      <dc:creator>Ajibola jr. MSc, Cybersecurity</dc:creator>
      <pubDate>Sun, 19 Apr 2020 10:49:20 +0000</pubDate>
      <link>https://forem.com/jibbsjunior/vanilla-js-or-framework-22k4</link>
      <guid>https://forem.com/jibbsjunior/vanilla-js-or-framework-22k4</guid>
      <description>&lt;p&gt;This question keeps popping up in the mind of almost every front-end or full-stack developer, especially the newbies. They will be like, 'Which one should I go for?' Vanilla JS or framework? Vanilla JS is when you write pure JavaScript, for example:&lt;br&gt;
const trigger = document.querySelector('.element'); &lt;br&gt;
trigger.addEventListener('click', (e)=&amp;gt;{&lt;br&gt;
/* some code here */&lt;br&gt;
}&lt;br&gt;
The thing is, using a framework might not be the best option for a beginner. If you are just starting out, starting from vanilla JS will be a great one for you because when you jump straight to a framework, there are some things working in there you won't have the idea of how they work or the logic behind them, plus you're going to find it difficult to tie your head around it. Now let's highlight the advantage and disadvantage of using both.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vanilla js (advantage)
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bitdegree.org%2Ftutorials%2Fwp-content%2Fuploads%2F2018%2F12%2Fnode-js-interview-questions-logo-2-266x300.png" alt="js" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The beauty of knowing vanilla JS is that you can learn any web framework, e.g., React, Angular, Vue, Backbone and so on.&lt;/li&gt;
&lt;li&gt;Using vanilla JS for your app will put your mind at rest because your app won't depend on crazy quick-changing JS ecosystems.&lt;/li&gt;
&lt;li&gt;Vanilla js (disadvantage)&lt;/li&gt;
&lt;li&gt;The only disadvantage we have with vanilla JS is the limited time; we have to start writing our code from scratch. Imagine before you start writing const div = document.getElementById('element'); and so on, just to achieve a click event; it is somehow terrible and time-consuming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayhq92j6gqah96j44813.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayhq92j6gqah96j44813.jpg" alt="js-cofee" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Framework (advantage)&lt;/li&gt;
&lt;li&gt;The pretty big advantage of choosing a framework is that there is ease of time in doing a lot of things.&lt;/li&gt;
&lt;li&gt;It has a lot of pretty predefined functions you can use without you having to write 50 lines of JS.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhackernoon.com%2Fdrafts%2Fotda32fo.png" alt="react" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1q5g5a4m2wocolyctpvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1q5g5a4m2wocolyctpvr.png" alt="angular" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw6c177a6r4lelux3x80.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw6c177a6r4lelux3x80.jpeg" alt="vue" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Framework (disadvantage)&lt;/li&gt;
&lt;li&gt;Some frameworks are very bulky when it comes to functions with large set of powerful features and a codebase, e.g., Angular.&lt;/li&gt;
&lt;li&gt;Using a framework without having the in-depth knowledge of vanilla JS might not be a good one for you because some things will look like magic to you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So if you are just starting as a developer, i will advice you start from vanilla js then once you're very comfortable with vanillaJs, pick up any framework of your choice and learn it with ease.&lt;/p&gt;

&lt;p&gt;Please, do not hesitate to share your opinion in the comment box below...&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.clipart.email%2F9122c9d6213db078f25a6a1116ae7e6d_dd-animated-thank-you-image-thank-you-for-your-attention-clipart-_408-251.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.clipart.email%2F9122c9d6213db078f25a6a1116ae7e6d_dd-animated-thank-you-image-thank-you-for-your-attention-clipart-_408-251.gif" alt="Thanks for reading..." width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>angular</category>
      <category>vue</category>
    </item>
  </channel>
</rss>
