首页 > 解决方案 > 如何从 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>

标签: phphtml

解决方案


所以基本上你不应该相信用户输入。这包括 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;
}

就这样。这应该可以解决您的问题。


推荐阅读