Чтобы объединить ответ от Alive to Die и комментарии о XSS от hanshenrik;
Использовать массивоподобный синтаксис в атрибуте имени входа:
<form method="POST">
<input type="checkbox" id="product1" name="product[]" value="12">
<input type="checkbox" id="product2" name="product[]" value="13">
<input type="checkbox" id="product3" name="product[]" value="14">
<button type="submit">Subscribe</button>
</form>
Если вы отметите первые два флажка и отправите заявку, вы должны получить:
$POST['product'] == ["12", "13"];
Конечно, любой ввод должен быть проверен и экранирован перед выводом в ответе. Для конкретного случая использования, который вы упомянули, вы получите что-то вроде этого:
$products = [];
if (isset($POST['product'])) {
foreach ($POST['product'] as $product) {
if (!is_numeric($product)) {
die("invalid product value.");
}
$products[] = intval($product);
}
}
if (empty($products)) {
die("no products selected.");
}
header("Location: https://test.com/" . implode(",", $products);
Разъяснение по подтверждению ввода:
Если вы пропустите проверку ввода, можно будет предоставить следующие данные:
product[]="admin.php"
и получите перенаправление на https://test.com/admin.php
. Конечно, это не то, что вы хотели, чтобы этот сценарий делал, поэтому одним только этим принципом вы должны рассмотреть возможность ограничения возможного поведения вашего кода. Но могло быть и хуже:
Если вы решите echo implode(",", $POST['product'])
где-то на вашем сайте, кто-то может отправить:
product[]="<script>alert(\"vuln\");</script>"
, который добавит JavaScript на ваш сайт. Предупреждение не опасно, но этот сценарий может быть чем угодно. От отправки ваших сеансовых куки до запуска криптоминера в вашем браузере. В принципе, если вы можете alert()
, вы можете делать что угодно.
Если вы создаете исходную форму из базы данных, кто-то может вставить вредоносные входные данные в качестве значений в базу данных. Таким образом, эти атаки не обязательно ограничены одним пользователем, играющим со своим инспектором элементов.
Это много «если», и для простого локального веб-сайта или сценария PHP вам не нужно беспокоиться о большинстве этих проблем. Однако, если вы решите сделать любой свой код доступным для Интернета, вы никогда не должны доверять вводу пользователя.