<?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>DEV Community: Jaswanth. M</title>
    <description>The latest articles on DEV Community by Jaswanth. M (@jaswanth_mk).</description>
    <link>https://dev.to/jaswanth_mk</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4001414%2F47562f08-10b6-4ef3-82d0-81bf32247e40.png</url>
      <title>DEV Community: Jaswanth. M</title>
      <link>https://dev.to/jaswanth_mk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaswanth_mk"/>
    <language>en</language>
    <item>
      <title>The Error Message That Hands Attackers a Map of Your Database</title>
      <dc:creator>Jaswanth. M</dc:creator>
      <pubDate>Tue, 30 Jun 2026 01:12:54 +0000</pubDate>
      <link>https://dev.to/jaswanth_mk/the-error-message-that-hands-attackers-a-map-of-your-database-2ef1</link>
      <guid>https://dev.to/jaswanth_mk/the-error-message-that-hands-attackers-a-map-of-your-database-2ef1</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu0yk3c8478ylnse5syn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuu0yk3c8478ylnse5syn.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A QA tip about why a "harmless" crash on a long number is bigger than it looks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's a QA tip that has uncovered more serious problems than it has any right to.&lt;/p&gt;

&lt;p&gt;Take any field that expects user input. A search box. A sort parameter. An ID field. Anywhere a value travels from the user into the database. Now feed it something it was never designed for: an unusually long number, far bigger than anything a normal user would ever type.&lt;/p&gt;

&lt;p&gt;Most of the time the application handles it gracefully.&lt;br&gt;
And sometimes, instead of a clean "invalid input," it throws a raw database error straight onto the screen.&lt;/p&gt;

&lt;p&gt;That second outcome is the one worth paying attention to.&lt;br&gt;
A crash is the symptom. The leak is the story.&lt;br&gt;
When most people see an error on screen, they log it as "app breaks on long input" and move on. That is the bug. But it is not the interesting part.&lt;/p&gt;

&lt;p&gt;A raw database error leaking to the user can reveal what is sitting underneath the application. Table names. Column names. The type of database running in the background. Sometimes a fragment of the actual query that failed.&lt;/p&gt;

&lt;p&gt;Think about what that means for a second. A random oversized number, typed into an ordinary field, just convinced the application to describe its own internals to a complete stranger.&lt;br&gt;
That is no longer a cosmetic bug. That is the system handing out a partial map of itself.&lt;/p&gt;

&lt;p&gt;Why testers should care more than anyone&lt;br&gt;
Here is the deeper signal. An application that spills a raw database error is almost always an application that is not properly validating and sanitising input before it reaches the database.&lt;/p&gt;

&lt;p&gt;And that exact gap, unvalidated input flowing straight into database queries, is the root of some of the most serious and most exploited security problems on the internet.&lt;/p&gt;

&lt;p&gt;So when a long number produces a database error, the number did not really "break" anything new. It exposed something that was already true: the layer between user input and the database needs a much closer look.&lt;br&gt;
The crash was loud. The real problem was quiet, and it was there the whole time.&lt;/p&gt;

&lt;p&gt;The defensive checklist&lt;br&gt;
The good news is that fixing this is well understood work. None of it is exotic. It just has to actually be done, on every field, including the boring ones nobody thinks about.&lt;/p&gt;

&lt;p&gt;Validate input before it reaches the database. Decide what each field should accept, and reject everything else.&lt;/p&gt;

&lt;p&gt;Set sensible limits. A field that expects a small number should not silently try to hand a 16-digit value to the database.&lt;/p&gt;

&lt;p&gt;Sanitise everything. Treat all user input as untrusted by default. Always.&lt;br&gt;
Never let raw database errors reach the user. Catch them, log them privately where your team can see them, and show the user a clean, generic message instead.&lt;/p&gt;

&lt;p&gt;That last point matters twice over. It protects your users from a confusing experience, and it stops your application from quietly narrating its own structure to anyone curious enough to type a weird value.&lt;br&gt;
The mindset behind the tip&lt;/p&gt;

&lt;p&gt;This is the part that outlives the specific trick.&lt;br&gt;
Good QA is not only about asking "did it work?" It is about asking "what did breaking it reveal?" A crash is rarely just a crash. It is the system telling you something about what is happening beneath the surface, but only if you are paying attention to what comes back, not just whether it failed.&lt;/p&gt;

&lt;p&gt;So the next time a field falls over on a strange input, do not stop at "throws an error." Ask what that error is exposing. Read it the way a curious outsider would. The bug is the symptom. What it reveals is the actual story, and usually the more important one.&lt;/p&gt;

&lt;p&gt;If your application accepts user input, and every application does, it is worth checking how it behaves when someone hands it something it never expected. Far better that you are the one who finds it first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Part of an ongoing series of honest notes from the testing trenches. If your "simple" input field has a story like this one, I would like to hear it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>1,000 Errors, One Google Sheet, and Five Hours I Will Never Get Back</title>
      <dc:creator>Jaswanth. M</dc:creator>
      <pubDate>Thu, 25 Jun 2026 02:30:54 +0000</pubDate>
      <link>https://dev.to/jaswanth_mk/1000-errors-one-google-sheet-and-five-hours-i-will-never-get-back-4okl</link>
      <guid>https://dev.to/jaswanth_mk/1000-errors-one-google-sheet-and-five-hours-i-will-never-get-back-4okl</guid>
      <description>&lt;p&gt;Every bug has an origin story. This one started, like most disasters do, with the words: "&lt;em&gt;&lt;strong&gt;It works fine on my machine&lt;/strong&gt;&lt;/em&gt;."&lt;/p&gt;

&lt;p&gt;We were testing the data import feature for a lead generation company. You know the type of feature. There is a friendly little button that says Import, you hand it a spreadsheet full of contacts, and it politely loads them into the system. Simple. Boring. The kind of thing everyone assumes works because, well, why wouldn't it.&lt;/p&gt;

&lt;p&gt;That assumption is exactly the kind of thing testers get paid to ruin.&lt;br&gt;
The** happy path** is a beautiful liar&lt;/p&gt;

&lt;p&gt;Here is the first rule of testing that nobody tells junior testers loudly enough: the happy path will lie to your face and smile while doing it.&lt;br&gt;
We started the way the developers expected us to. We took a clean Microsoft Excel file, a nice tidy list of valid records, and clicked Import. It worked. Flawlessly. The data slid in like it was coming home. Everyone in the room relaxed a little.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;upload(clean_excel)   -&amp;gt;   Import: Pass   -&amp;gt;   everyone goes to lunch&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If we had stopped there, we would have written "Import: Pass" and gone home. The feature would have shipped. And a few days later, a real customer would have found what we were about to find, except they would have found it angry, in production, on a Monday.&lt;br&gt;
So we did the thing testers are supposed to do. We stopped being nice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enter the villain: a Google Sheet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real users do not live inside clean Excel files. Real users live in Google Sheets. They build their entire messy lives in Google Sheets and then expect every system on earth to accept that chaos without complaint.&lt;br&gt;
So we exported the same data as a Google Sheet, fed it to the same innocent little Import button, and clicked.&lt;/p&gt;

&lt;p&gt;The system did not just fail. It &lt;strong&gt;detonated&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;upload(same_data_as_google_sheet)   -&amp;gt;   1,000+ errors   -&amp;gt;   total meltdown&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over a thousand errors. One thousand. The screen filled up like the application was trying to set a world record for self destruction. It was almost impressive. If errors were applause, this feature just got a standing ovation.&lt;/p&gt;

&lt;p&gt;Same data. Same button. Different source format. Total collapse.&lt;br&gt;
Here is the part that matters: the developers were not wrong, exactly. They built the import for Excel, tested it with Excel, and it worked with Excel. But "it works with the file format we personally used" is not the same as "it works." Users do not read your mind about which spreadsheet brand you prefer. They just upload whatever they have and expect it to behave.&lt;/p&gt;

&lt;p&gt;The sneakier monster nobody invited&lt;br&gt;
We could have stopped at the Google Sheets explosion and called it a great day. But by now we had our troublemaker hats on, and troublemakers do not stop at the first fire.&lt;/p&gt;

&lt;p&gt;So back to Excel we went, but this time we got mean about the data itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;all_valid_rows           -&amp;gt;   imports fine&lt;br&gt;
a_few_invalid_rows       -&amp;gt;   imports fine (skips the bad ones)&lt;br&gt;
bulk_data_mostly_invalid -&amp;gt;   breaks completely&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All valid rows? Imported fine. A few invalid rows mixed in? Still imported fine. The system shrugged, skipped the bad ones, and moved on like a calm professional.&lt;/p&gt;

&lt;p&gt;And then we did the thing real data actually looks like. We threw in a bulk file, hundreds of rows, mostly garbage, a few good records hiding in the mess. The kind of file a real sales team actually owns, because real sales data is 80 percent chaos and 20 percent gold.&lt;br&gt;
It broke. Again.&lt;/p&gt;

&lt;p&gt;Not "skipped a few rows" broke. Properly broke. The validation logic was perfectly happy handling a little bit of bad data, but pile on a mountain of invalid records with only a handful of valid ones, and the whole thing fell over like it had been waiting all day for an excuse.&lt;br&gt;
This is the cruel little secret of import features everywhere. They are tested with small, clean, polite samples. They are used with enormous, filthy, real world files. The gap between those two is where customers lose their data and you lose their trust.&lt;/p&gt;

&lt;p&gt;The five hours (a tragedy in one act)&lt;/p&gt;

&lt;p&gt;I would love to tell you we found the root cause in ten minutes like geniuses. We did not.&lt;/p&gt;

&lt;p&gt;We spent about five hours on this. Five hours of staring, re-running, blaming the file, then blaming the browser, then blaming the data, then briefly blaming each other, then making more coffee, then quietly blaming the coffee. The usual stages of debugging grief.&lt;/p&gt;

&lt;p&gt;But here is the thing. Those five hours were the cheapest five hours that project will ever spend. Because the alternative was a customer uploading their real lead list, watching a thousand errors eat their afternoon, and never trusting that import button again. Some bugs you pay for with a few hours in testing. The same bug, found in production, you pay for with a customer.&lt;/p&gt;

&lt;p&gt;We will take the five hours. Every single time.&lt;/p&gt;

&lt;p&gt;The actual lesson: think like a troublemaker&lt;br&gt;
If there is one thing I want you to steal from this story, it is the mindset, not the bug.&lt;/p&gt;

&lt;p&gt;A good tester does not ask "does this work?" A good tester asks "how do I break this?" Those are completely different questions, and only the second one finds the bugs that matter.&lt;/p&gt;

&lt;p&gt;You have to stop thinking like the developer who built it and start thinking like:&lt;/p&gt;

&lt;p&gt;The lazy user who uploads the wrong file format because it was the first one they saw.&lt;/p&gt;

&lt;p&gt;The chaos user whose spreadsheet has merged cells, empty rows, and a column titled "do not delete."&lt;/p&gt;

&lt;p&gt;The bulk user who does not have 10 clean records, they have 4,000 dirty ones.&lt;/p&gt;

&lt;p&gt;The troublemaker, the one who actively wants to see what happens if they do the thing they were obviously not supposed to do.&lt;/p&gt;

&lt;p&gt;Software does not break on the inputs you expected. It breaks on the inputs you did not. So your job is to become a connoisseur of the unexpected. Feed it the wrong format. Feed it too much. Feed it almost-right data, because almost-right is far more dangerous than obviously wrong. Poke the thing that everyone swears is fine, especially the thing everyone swears is fine.&lt;/p&gt;

&lt;p&gt;The features nobody tests properly are always the "simple" ones. The import button. The search box. The little form at the bottom. They look harmless. They are never harmless.&lt;br&gt;
The takeaway&lt;/p&gt;

&lt;p&gt;That import feature looked like the most boring thing on the project. One button, one file, what could possibly go wrong. The answer, it turned out, was about a thousand things, plus a Google Sheet with a grudge.&lt;br&gt;
Quality is not about proving software works. Anyone can do that. Quality is about hunting for the moment it stops working, before a real person stumbles into it first.&lt;/p&gt;

&lt;p&gt;So the next time something passes on the happy path and everyone wants to move on, be the annoying one in the room who says, "okay, but what if I upload the worst file imaginable?"&lt;/p&gt;

&lt;p&gt;Then go do exactly that.&lt;br&gt;
Your future self, and a customer you will never meet, will quietly thank you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you have a "simple" feature you are absolutely sure works fine, I have some bad news and a Google Sheet for you. Drop your worst "it worked on my machine" story in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
