Close Menu
    DevStackTipsDevStackTips
    • Home
    • News & Updates
      1. Tech & Work
      2. View All

      How To Prevent WordPress SQL Injection Attacks

      June 13, 2025

      Java never goes out of style: Celebrating 30 years of the language

      June 12, 2025

      OpenAI o3-pro available in the API, BrowserStack adds Playwright support for real iOS devices, and more – Daily News Digest

      June 12, 2025

      Creating The “Moving Highlight” Navigation Bar With JavaScript And CSS

      June 11, 2025

      Microsoft Copilot’s own default configuration exposed users to the first-ever “zero-click” AI attack, but there was no data breach

      June 13, 2025

      Sam Altman says “OpenAI was forced to do a lot of unnatural things” to meet the Ghibli memes demand surge

      June 13, 2025

      5 things we didn’t get from the Xbox Games Showcase, because Xbox obviously hates me personally

      June 13, 2025

      Minecraft Vibrant Visuals finally has a release date and it’s dropping with the Happy Ghasts

      June 13, 2025
    • Development
      1. Algorithms & Data Structures
      2. Artificial Intelligence
      3. Back-End Development
      4. Databases
      5. Front-End Development
      6. Libraries & Frameworks
      7. Machine Learning
      8. Security
      9. Software Engineering
      10. Tools & IDEs
      11. Web Design
      12. Web Development
      13. Web Security
      14. Programming Languages
        • PHP
        • JavaScript
      Featured

      QAQ-QQ-AI-QUEST

      June 13, 2025
      Recent

      QAQ-QQ-AI-QUEST

      June 13, 2025

      JS Dark Arts: Abusing prototypes and the Result type

      June 13, 2025

      Helpful Git Aliases To Maximize Developer Productivity

      June 13, 2025
    • Operating Systems
      1. Windows
      2. Linux
      3. macOS
      Featured

      Microsoft Copilot’s own default configuration exposed users to the first-ever “zero-click” AI attack, but there was no data breach

      June 13, 2025
      Recent

      Microsoft Copilot’s own default configuration exposed users to the first-ever “zero-click” AI attack, but there was no data breach

      June 13, 2025

      Sam Altman says “OpenAI was forced to do a lot of unnatural things” to meet the Ghibli memes demand surge

      June 13, 2025

      5 things we didn’t get from the Xbox Games Showcase, because Xbox obviously hates me personally

      June 13, 2025
    • Learning Resources
      • Books
      • Cheatsheets
      • Tutorials & Guides
    Home»News & Updates»CodeSOD: Gridding My Teeth

    CodeSOD: Gridding My Teeth

    June 12, 2025

    Dan‘s co-workers like passing around TDWTF stories, mostly because seeing code worse than what they’re writing makes them feel less bad about how often they end up hacking things together.

    One day, a co-worker told Dan: “Hey, I think I found something for that website with the bad code stories!”

    Dan’s heart sank. He didn’t really want to shame any of his co-workers. Fortunately, the source-control history put the blame squarely on someone who didn’t work there any more, so he felt better about submitting it.

    This is another ASP .Net page, and this one made heavy use of GridView elements. GridView controls applied the logic of UI controls to generating a table. They had a page which contained six of these controls, defined like this:

    <asp:GridView ID="gvTaskMonth1" runat="server" CssClass="leadsGridView" AutoGenerateColumns="False" OnRowDataBound="gvTaskMonth1_RowDataBound"> ... </asp:GridView>
    
    <asp:GridView ID="gvTaskMonth2" runat="server" CssClass="leadsGridView" AutoGenerateColumns="False" OnRowDataBound="gvTaskMonth1_RowDataBound"> ... </asp:GridView>
    
    <asp:GridView ID="gvTaskMonth3" runat="server" CssClass="leadsGridView" AutoGenerateColumns="False" OnRowDataBound="gvTaskMonth1_RowDataBound"> ... </asp:GridView>
    

    The purpose of this screen was to display a roadmap of coming tasks, broken up by how many months in the future they were. The first thing that leaps out to me is that they all use the same event handler for binding data to the table, which isn’t in-and-of-itself a problem, but the naming of it is certainly a recipe for confusion.

    Now, to bind these controls to the data, there needed to be some code in the code-behind of this view which handled that. That’s where the WTF lurks:

    /// <summary>
    /// Create a roadmap for the selected client
    /// </summary>
    
    private void CreateRoadmap()
    {
    	for (int i = 1; i < 7; i++)
    	{
    		switch (i)
    		{
    			case 1:
    				if (gvTaskMonth1.Rows.Count > 0)
    				{
    					InsertTasks(gvTaskMonth1, DateTime.Parse(txtDatePeriod1.Text), "1");
    				}
    				break;
    			case 2:
    				if (gvTaskMonth2.Rows.Count > 0)
    				{
    					InsertTasks(gvTaskMonth2, DateTime.Parse(txtDatePeriod2.Text), "2");
    				}
    				break;
    			case 3:
    				if (gvTaskMonth3.Rows.Count > 0)
    				{
    					InsertTasks(gvTaskMonth3, DateTime.Parse(txtDatePeriod3.Text), "3");
    				}
    				break;
    			case 4:
    				if (gvTaskMonth4.Rows.Count > 0)
    				{
    					InsertTasks(gvTaskMonth4, DateTime.Parse(txtDatePeriod4.Text), "4");
    				}
    				break;
    			case 5:
    				if (gvTaskMonth5.Rows.Count > 0)
    				{
    					InsertTasks(gvTaskMonth5, DateTime.Parse(txtDatePeriod5.Text), "5");
    				}
    				break;
    			case 6:
    				if (gvTaskMonth6.Rows.Count > 0)
    				{
    					InsertTasks(gvTaskMonth6, DateTime.Parse(txtDatePeriod6.Text), "6");
    				}
    				break;
    		}
    	}
    }
    

    Ah, the good old fashioned loop-switch sequence anti-pattern. I understand the motivation: “I want to do the same thing for six different controls, so I should use a loop to not repeat myself,” but then couldn’t quite figure out how to do that, so they just repeated themselves, but inside of a loop.

    The “fix” was to replace all of this with something more compact:

    	private void CreateRoadmap()
    	{
    		InsertTasks(gvTaskMonth1, DateTime.Parse(txtDatePeriod1.Text), "1");
    		InsertTasks(gvTaskMonth2, DateTime.Parse(txtDatePeriod2.Text), "2");
    		InsertTasks(gvTaskMonth3, DateTime.Parse(txtDatePeriod3.Text), "3");
    		InsertTasks(gvTaskMonth4, DateTime.Parse(txtDatePeriod4.Text), "4");
    		InsertTasks(gvTaskMonth5, DateTime.Parse(txtDatePeriod5.Text), "5");
    		InsertTasks(gvTaskMonth6, DateTime.Parse(txtDatePeriod6.Text), "6"); 
    	}
    

    That said, I’d recommend not trying to parse date times inside of a text box inside of this method, but that’s just me. Bubbling up the inevitable FormatException that this will generate is going to be a giant nuisance. It’s likely that they’ve got a validator somewhere, so it’s probably fine- I just don’t like it.

    [Advertisement]
    Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. Learn more.

    Source: Read More 

    Facebook Twitter Reddit Email Copy Link
    Previous ArticleFlaws in Weidmueller IE-SR-2TX Routers Allow Remote Root Access!
    Next Article Schemes – create syntax highlighting schemes

    Related Posts

    News & Updates

    Microsoft Copilot’s own default configuration exposed users to the first-ever “zero-click” AI attack, but there was no data breach

    June 13, 2025
    News & Updates

    Sam Altman says “OpenAI was forced to do a lot of unnatural things” to meet the Ghibli memes demand surge

    June 13, 2025
    Leave A Reply Cancel Reply

    For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.

    Continue Reading

    Microsoft “.library-ms” File / NTLM Information Disclosure (Resurrected 2025)

    Security

    A Guide To Evaluating Your Organizational Product Portfolio

    Web Development
    Found means fixed: Reduce security debt at scale with GitHub security campaigns

    Found means fixed: Reduce security debt at scale with GitHub security campaigns

    News & Updates

    Domain Setup and Mail Flow Configuration in Microsoft 365

    Development

    Highlights

    News & Updates

    Cyberpunk 2077 sequel enters pre-production as Phantom Liberty crosses 10 million copies sold

    May 30, 2025

    Cyberpunk 2077’s sequel has entered the pre-production stage of development, while Phantom Liberty has reached…

    CVE-2025-5440 – Linksys RE6500/RE6250/RE6300/RE6350/RE7000/RE9000 NTP Os Command Injection Vulnerability

    June 2, 2025

    Optimizing Website Design Widths for a Multi-Device World

    May 19, 2025

    Windows 11’s Mail & Calendar stops syncing with Outlook, Hotmail accounts

    April 29, 2025
    © DevStackTips 2025. All rights reserved.
    • Contact
    • Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.