first commit
This commit is contained in:
commit
54d6a7573c
143
index.php
Normal file
143
index.php
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
<?php
|
||||||
|
// Set headers to prevent search engines from indexing the page
|
||||||
|
header("X-Robots-Tag: noindex, nofollow", true);
|
||||||
|
|
||||||
|
// Start session for CSRF token
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
// Generate a CSRF token if one isn't set
|
||||||
|
if (empty($_SESSION['csrf_token'])) {
|
||||||
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to process input data
|
||||||
|
function processInput($input) {
|
||||||
|
// Ignore blank lines
|
||||||
|
if (trim($input) === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 1: Remove any non-numeric characters
|
||||||
|
$cleanedInput = preg_replace('/\D+/', '', $input);
|
||||||
|
|
||||||
|
// Step 2: Filter only 17 digits long strings
|
||||||
|
if (preg_match('/^\d{17}$/', $cleanedInput)) {
|
||||||
|
// Step 3: Check if the first four digits are within 2004-2018
|
||||||
|
$firstFourDigits = substr($cleanedInput, 0, 4);
|
||||||
|
if ($firstFourDigits >= 2004 && $firstFourDigits <= 2018) {
|
||||||
|
return ['valid' => $cleanedInput];
|
||||||
|
} else {
|
||||||
|
return ['invalid' => $cleanedInput, 'reason' => 'First four digits are not within 2004-2018'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ['invalid' => $cleanedInput, 'reason' => 'Not 17 digits long'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$validResults = [];
|
||||||
|
$invalidResults = [];
|
||||||
|
$error = null;
|
||||||
|
|
||||||
|
// Validate the request method and CSRF token
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
|
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
|
||||||
|
$error = "Invalid CSRF token.";
|
||||||
|
} else {
|
||||||
|
$inputData = filter_input(INPUT_POST, 'input_data', FILTER_SANITIZE_STRING);
|
||||||
|
$rows = explode("\n", trim($inputData));
|
||||||
|
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$result = processInput($row);
|
||||||
|
if ($result && isset($result['valid'])) {
|
||||||
|
$validResults[] = $result['valid'];
|
||||||
|
} elseif ($result) {
|
||||||
|
$invalidResults[] = $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove duplicate valid results
|
||||||
|
$validResults = array_unique($validResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to create a downloadable file link
|
||||||
|
function createDownloadLink($filename, $data) {
|
||||||
|
$filepath = sys_get_temp_dir() . '/' . $filename;
|
||||||
|
file_put_contents($filepath, implode("\n", $data));
|
||||||
|
return $filepath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the download of valid results
|
||||||
|
if (isset($_POST['download_valid']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
|
||||||
|
$filepath = createDownloadLink('valid_results.txt', $validResults);
|
||||||
|
header('Content-Type: application/octet-stream');
|
||||||
|
header('Content-Disposition: attachment; filename="valid_results.txt"');
|
||||||
|
readfile($filepath);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the download of invalid results
|
||||||
|
if (isset($_POST['download_invalid']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
|
||||||
|
$invalidOutput = array_map(function ($item) {
|
||||||
|
return $item['invalid'] . " - " . $item['reason'];
|
||||||
|
}, $invalidResults);
|
||||||
|
$filepath = createDownloadLink('invalid_results.txt', $invalidOutput);
|
||||||
|
header('Content-Type: application/octet-stream');
|
||||||
|
header('Content-Disposition: attachment; filename="invalid_results.txt"');
|
||||||
|
readfile($filepath);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
<title>Input Validator</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Input Validator</h1>
|
||||||
|
<?php if ($error): ?>
|
||||||
|
<div class="error"><?= htmlspecialchars($error) ?></div>
|
||||||
|
<?php endif; ?>
|
||||||
|
<form method="post">
|
||||||
|
<label for="input_data">Enter your data (one per line):</label><br>
|
||||||
|
<textarea id="input_data" name="input_data" rows="10" cols="50"><?= isset($_POST['input_data']) ? htmlspecialchars($_POST['input_data']) : '' ?></textarea><br><br>
|
||||||
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
||||||
|
<button type="submit" class="btn">Process</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$error): ?>
|
||||||
|
<div class="results">
|
||||||
|
<h2>Results</h2>
|
||||||
|
<p>Input Rows: <strong><?= count($rows) ?></strong></p>
|
||||||
|
<p>Valid Output Rows (Unique): <strong><?= count($validResults) ?></strong></p>
|
||||||
|
<p>Invalid/Discarded Rows: <strong><?= count($invalidResults) ?></strong></p>
|
||||||
|
|
||||||
|
<?php if (count($invalidResults) > 0): ?>
|
||||||
|
<h3 class="error-title">Discarded Inputs:</h3>
|
||||||
|
<ul class="error-list">
|
||||||
|
<?php foreach ($invalidResults as $invalid): ?>
|
||||||
|
<li class="error-item"><?= htmlspecialchars($invalid['invalid']) ?> - <?= htmlspecialchars($invalid['reason']) ?></li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<form method="post" class="download-buttons">
|
||||||
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
||||||
|
<input type="hidden" name="input_data" value="<?= htmlspecialchars($_POST['input_data']) ?>">
|
||||||
|
<?php if (count($validResults) > 0): ?>
|
||||||
|
<button type="submit" name="download_valid" class="btn">Download Valid Results</button>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (count($invalidResults) > 0): ?>
|
||||||
|
<button type="submit" name="download_invalid" class="btn btn-error">Download Invalid Results</button>
|
||||||
|
<?php endif; ?>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
135
index3-old.php
Normal file
135
index3-old.php
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
<?php
|
||||||
|
// Set headers to prevent search engines from indexing the page
|
||||||
|
header("X-Robots-Tag: noindex, nofollow", true);
|
||||||
|
|
||||||
|
// Start session for CSRF token
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
// Generate a CSRF token if one isn't set
|
||||||
|
if (empty($_SESSION['csrf_token'])) {
|
||||||
|
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to process input data
|
||||||
|
function processInput($input) {
|
||||||
|
// Step 1: Remove any non-numeric characters
|
||||||
|
$cleanedInput = preg_replace('/\D+/', '', $input);
|
||||||
|
|
||||||
|
// Step 2: Filter only 17 digits long strings
|
||||||
|
if (preg_match('/^\d{17}$/', $cleanedInput)) {
|
||||||
|
// Step 3: Check if the first four digits are within 2004-2018
|
||||||
|
$firstFourDigits = substr($cleanedInput, 0, 4);
|
||||||
|
if ($firstFourDigits >= 2004 && $firstFourDigits <= 2018) {
|
||||||
|
return ['valid' => $cleanedInput];
|
||||||
|
} else {
|
||||||
|
return ['invalid' => $cleanedInput, 'reason' => 'First four digits are not within 2004-2018'];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return ['invalid' => $cleanedInput, 'reason' => 'Not 17 digits long'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$validResults = [];
|
||||||
|
$invalidResults = [];
|
||||||
|
$error = null;
|
||||||
|
|
||||||
|
// Validate the request method and CSRF token
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
|
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
|
||||||
|
$error = "Invalid CSRF token.";
|
||||||
|
} else {
|
||||||
|
$inputData = filter_input(INPUT_POST, 'input_data', FILTER_SANITIZE_STRING);
|
||||||
|
$rows = explode("\n", trim($inputData));
|
||||||
|
|
||||||
|
foreach ($rows as $row) {
|
||||||
|
$result = processInput($row);
|
||||||
|
if (isset($result['valid'])) {
|
||||||
|
$validResults[] = $result['valid'];
|
||||||
|
} else {
|
||||||
|
$invalidResults[] = $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to create a downloadable file link
|
||||||
|
function createDownloadLink($filename, $data) {
|
||||||
|
$filepath = sys_get_temp_dir() . '/' . $filename;
|
||||||
|
file_put_contents($filepath, implode("\n", $data));
|
||||||
|
return $filepath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the download of valid results
|
||||||
|
if (isset($_POST['download_valid']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
|
||||||
|
$filepath = createDownloadLink('valid_results.txt', $validResults);
|
||||||
|
header('Content-Type: application/octet-stream');
|
||||||
|
header('Content-Disposition: attachment; filename="valid_results.txt"');
|
||||||
|
readfile($filepath);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the download of invalid results
|
||||||
|
if (isset($_POST['download_invalid']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
|
||||||
|
$invalidOutput = array_map(function ($item) {
|
||||||
|
return $item['invalid'] . " - " . $item['reason'];
|
||||||
|
}, $invalidResults);
|
||||||
|
$filepath = createDownloadLink('invalid_results.txt', $invalidOutput);
|
||||||
|
header('Content-Type: application/octet-stream');
|
||||||
|
header('Content-Disposition: attachment; filename="invalid_results.txt"');
|
||||||
|
readfile($filepath);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
<title>Input Validator</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Input Validator</h1>
|
||||||
|
<?php if ($error): ?>
|
||||||
|
<div class="error"><?= htmlspecialchars($error) ?></div>
|
||||||
|
<?php endif; ?>
|
||||||
|
<form method="post">
|
||||||
|
<label for="input_data">Enter your data (one per line):</label><br>
|
||||||
|
<textarea id="input_data" name="input_data" rows="10" cols="50"><?= isset($_POST['input_data']) ? htmlspecialchars($_POST['input_data']) : '' ?></textarea><br><br>
|
||||||
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
||||||
|
<button type="submit" class="btn">Process</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$error): ?>
|
||||||
|
<div class="results">
|
||||||
|
<h2>Results</h2>
|
||||||
|
<p>Input Rows: <strong><?= count($rows) ?></strong></p>
|
||||||
|
<p>Valid Output Rows: <strong><?= count($validResults) ?></strong></p>
|
||||||
|
<p>Invalid/Discarded Rows: <strong><?= count($invalidResults) ?></strong></p>
|
||||||
|
|
||||||
|
<?php if (count($invalidResults) > 0): ?>
|
||||||
|
<h3 class="error-title">Discarded Inputs:</h3>
|
||||||
|
<ul class="error-list">
|
||||||
|
<?php foreach ($invalidResults as $invalid): ?>
|
||||||
|
<li class="error-item"><?= htmlspecialchars($invalid['invalid']) ?> - <?= htmlspecialchars($invalid['reason']) ?></li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<form method="post" class="download-buttons">
|
||||||
|
<input type="hidden" name="csrf_token" value="<?= htmlspecialchars($_SESSION['csrf_token']) ?>">
|
||||||
|
<input type="hidden" name="input_data" value="<?= htmlspecialchars($_POST['input_data']) ?>">
|
||||||
|
<?php if (count($validResults) > 0): ?>
|
||||||
|
<button type="submit" name="download_valid" class="btn">Download Valid Results</button>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (count($invalidResults) > 0): ?>
|
||||||
|
<button type="submit" name="download_invalid" class="btn btn-error">Download Invalid Results</button>
|
||||||
|
<?php endif; ?>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
121
style.css
Normal file
121
style.css
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Arial, sans-serif;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
color: #333;
|
||||||
|
line-height: 1.6;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: auto;
|
||||||
|
background: #fff;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
font-size: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
display: block;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
font-size: 1rem;
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
background-color: #007bff;
|
||||||
|
color: #fff;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn:hover {
|
||||||
|
background-color: #0056b3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-error {
|
||||||
|
background-color: #dc3545;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-error:hover {
|
||||||
|
background-color: #c82333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results h2 {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results p {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-title {
|
||||||
|
color: #dc3545;
|
||||||
|
margin-top: 15px;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-list {
|
||||||
|
list-style: none;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error-item {
|
||||||
|
color: #dc3545;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.download-buttons {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.container {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn, .btn-error {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.results p {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user