php - 如何从 url 获取变量以在查询中工作?PHP
问题描述
URL 的格式为http://alexhillshs.ipto.com.au/11%20Digital%20Solutions/trout/Movie.php?movie=1938。但是我能够从 URL(在本例中为 1938)获取电影 ID 以在下面的 SQL 查询($query)中工作,即使电影 ID 变量在网页的其余部分中正常工作。
<div class="card">
<h2>Write a Review</h2>
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" target="hiddenFrame" id="myForm">
<label><b>Rating Out of 10</b></label>
<input type="float" name="val1" placeholder="Enter Rating Out of 10">
<label><b>Review</b></label>
<textarea rows="10" type="text" name="val2" placeholder="Enter" class="RevForm"></textarea>
<iframe name="hiddenFrame" class="hide"></iframe>
<input type="submit" name="submit" value="Submit Review" class="registerbtn">
</form>
<?php
$movieid = $_GET["movie"];
print $movieid;
$conn = new mysqli("localhost","<username>","<password>","<database>") or die(mysqli_error($conn));
if (isset($_POST["submit"])) {
$val1 = $_POST["val1"];
$val2 = $_POST["val2"];
$user1 = $_SESSION["id"];
$idmov = $_SERVER['QUERY_STRING'];
$query = mysqli_query($conn, "INSERT INTO Mem_Reviews (Rating, Review, Mem_ID, Movie_ID) VALUES ('$val1', '$val2', '$user1', '$movieid')") or die(mysqli_error($conn));
}
?>
</div>
解决方案
所以基本上你不应该相信用户输入。这包括 url 参数。您的代码同时在多个地方对安全性至关重要。
首先你应该看看你的表格。正如在评论中提到的,您永远不会在表单中提交电影 ID。这就是提交表单后您可以在 php 代码中访问它的原因。
所以基本上你应该在输出表单之前测试 url 参数中是否有电影 id。
<?php
// parameters you need for the form before the html form
$movieID = isset($_GET['movie']) ? intval($_GET['movie']) : 0;
?>
这行代码检查是否存在名称为movie的 GET 参数,并将其验证为整数值。如果没有名称为电影的GET 参数,则电影 ID 将为 0。
之后将您的表单输出为html。
<form id="myForm" method="post" action="<?= $_SERVER['PHP_SELF'] ?>" target="iframe">
<label>
rating out of 10
<input type="number" step=".1" min="0" max="10" name="val1" placeholder="enter rating out of 10">
</label>
<label>
review
<textarea rows="10" type="text" name="val2" placeholder="enter your review"></textarea>
</label>
<iframe name="iframe" class="hide"></iframe>
<input type="hidden" name="movie" value="<?= htmlentities($movieID) ?>">
<input type="submit" name="submit" value="submit review">
</form>
之后,您的电影 ID 将与每个表单提交一起显示为$_POST['movie']
.
提交表单时,让我们看看您的 PHP 代码。您的 sql 查询易受攻击,并且对 sql 注入开放。可以轻松读出或删除您的数据库。当您处理用户生成的内容时,请使用准备好的语句。
<?php
// establish a mysqli database connection
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
// initialize a prepared statement for your query
if (!($stmt = $mysqli->prepare("INSERT INTO Mem_Reviews (Rating, Review, Mem_ID, Movie_ID) VALUES (?, ?, ?, ?)"))) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
// bind your parameters to your mysqli statement
if (!$stmt->bind_param("dssi", $_POST['val1'], $_POST['val2'], $_SESSION['id'], $_POST['movie']) {
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
// a prepare is always followed by an execute
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
就这样。这应该可以解决您的问题。
推荐阅读
- python - 为什么我不能在这张单张图片上运行我的 tensorflow CNN 模型?
- javascript - 无法在输入更改时为每个附加的 div 添加正确的索引
- scala - 如何实现比火花集群中的核心数更高的并行化?
- powerbi - 一张Dimension表和一张Fact表之间的多重关系
- html - Bootstrap Modal 在没有淡入淡出类的情况下不显示
- spring-boot - 方法 apis(java.util.function.Predicate
) 类型中的 ApiSelectorBuilder 不适用 - c# - 如果行以条件 C# 开头,则替换特定位置的字符
- javascript - 如何在打字稿中定义 Ramda 中占位符的类型?
- gem5 - 如何在给定的滴答声中获取检查点,然后使用 gem5 Python API 恢复?
- loops - Pentaho:循环开始日期到结束日期