I believe you are on track; add a parameter to the URL that you can test on page-load.
You could create a GUID and add a table to the database where you store the email address and the GUID; this will make guessing parameters almost impossible. You could also add a timestamp to the table in the database, which you can use to see if the link should still be valid.
Table cells: email, GUID, timestamp
Related Posts:
- Are Nonces Useless?
- How do WordPress Nonces Work?
- Handling nonces for actions from guests to logged-in users
- Is there value in using a wp_nonce for POST requests?
- Is it safe to use a global wp nonce per user instead of a nonce per action?
- Does this code indicate an exploit?
- How to add a nonce check correctly to this specific code?
- SSL Error: unable to get local issuer certificate
- When you use ‘badidea’ or ‘thisisunsafe’ to bypass a Chrome certificate/HSTS error, does it only apply for the current site? [closed]
- When you use ‘badidea’ or ‘thisisunsafe’ to bypass a Chrome certificate/HSTS error, does it only apply for the current site? [closed]
- Why does the URL http://a/%%30%30 crash Google Chrome?
- When you use ‘badidea’ or ‘thisisunsafe’ to bypass a Chrome certificate/HSTS error, does it only apply for the current site?
- Can an attacker use inspect element harmfully?
- Where does Internet Explorer store saved passwords?
- Infected Files – what to do [closed]
- WordPress 4.7.1 REST API still exposing users
- Should I escape wordpress functions like the_title, the_excerpt, the_content
- Why does WordPress need my private ssh key to update?
- When to use esc_html and when to use sanitize_text_field?
- Will there be security updates for 3.1 once 3.2 is released?
- Nonces can be reused multiple times? Bug / Security issue?
- WordPress it’s cleaning a custom query_var to avoid sql injections?
- Can someone explain the use cases of esc_html?
- Tips for finding SPAM links injected into the_content
- Close a wordpress blog – keep site as it is but prevent hacks
- Is WordPress vulnerable to the httpoxy?
- Prevent setup-config.php page from appearing when host blocks database
- wp.getUsersBlogs XMLRPC Brute Force Attack/Vulnerability
- WordPress and Security
- Is there a security risk giving someone temporary access to my blog’s code?
- Is /wp-login.php?redirect_to[] exploitable?
- How to properly sanitize/secure a WP Query coming from the front end
- What should I do about hacked server?
- How do I authenticate WP users from a chrome extension?
- Website is being flooded [closed]
- Nonces, AJAX, script variables & security in WordPress
- When must I use and verify nonce?
- Is there any point setting the keys and salts in wp-config.php?
- Auth cookie value security risk?
- Where to store OAuth 2.0 client id and secret?
- Security – Shortcode injection attack
- Registration Plugin – Recaptcha integration
- How can I safely use $_SERVER[‘REQUEST_URI’] to avoid XSS?
- How to combat flooding admin-ajax.php?
- Dangers to allowing Access-Control-Allow-Origin: * for Feeds only?
- Moving away from MD5: Where to declare the custom global $wp_hasher?
- wp_create_nonce function doesn’t work inside a plugin?
- Would it be dangerous to send all the wp_options to javascript file?
- Changing Table Prefixes – once done, am I good to go going forward?
- Should I disable directory listing for wp-includes?
- Nonce failing on form submission
- Safety side of storing emoji into database
- How can I display nickname instead username in links
- My WordPress Websites are always under attack
- How to hide easy access to my website temporarily?
- Are un-sanitized theme options more vulnerable to malicious scripts than the theme editor?
- Changing the default header name
- how much information can we hide when using wordpress cms?
- Wordfence detects change in wp-admin/includes/upgrade.php
- Basic password protection without using users and roles
- System setting changed by system user
- Does meta-data need to be sanitized?
- Will there be security updates for WordPress 4.9.9
- Any known bugs that could cause disappearance of the wp_users table?
- 404/500 error on content images if Referer header is from another domain [closed]
- Are SVG image files safe to upload? Why WP defines them as a security risk? [duplicate]
- Switching between security plugins is a risk?
- How to obfuscate wp-config.php or code
- Are major WordPress updates mandatory for security?
- i moved wp-config.php outside of public html and this broke my website
- Is it safe to use the basic administration with reduced rights for private member space
- WordPress Database Re-installed (Hacked)
- Verifying that I have fully removed a WordPress hack?
- whether a nonce is required for get type and get_query_var?
- WordPress Security tools
- How can I stop other plugins from using my class’ sensitive methods?
- CSRF attack to create USER
- wordpress security (only one part of the site)
- What are WordPress Current Security Issues in 2017?
- wp-config.php moved above root results in no plugin updates
- Password-protect feed and make it usable in major aggregators
- Folder Permissions + Security Concerns
- Malware/Permission bug removal?
- Could a user account with a stolen password compromised entire WP site?
- how to find the way they hacked my WP site
- Run a security scan on WordPress site that has .htaccess password [closed]
- nginx + wordpress: Best practices for configuring it to be secure, reliable, and fast? [closed]
- How to get real password (before encrypt) when register a user?
- Directory to store secure file
- checking the form submit in right order
- How can I give someone server access to only duplicate and modify a site?
- Our security auditor is an idiot. How do I give him the information he wants?
- I am under DDoS. What can I do?
- How can I implement ansible with per-host passwords, securely?
- How do I protect my company from my IT guy? [closed]
- Does changing default port number actually increase security? [closed]
- Can you alter the default wordpress strong password requirements?
- WordPress – tracking options
- how to sanitizing $_POST with the correct way?
- How to stop a nonce from being cached in an inline script, or alternatives to regenerate it if expired?