在ID-PHP中放置撇号时不显示数据 $ID=$db->real\u escape\u字符串(strip\u标记(stripslashes($\u GET['ID'])); $GetThreadFromID=mysqli\u fetch\u对象(mysqli\u查询($db,“SELECT*FROM-ForumThreads,其中ID=$ID”); $GetThreadStarter=mysqli_fetch_对象(mysqli_查询($db,“SELECT*FROM-FROM-Users,其中ID='$GetThreadFromID->PosterID')); $GetTopicFromThread=mysqli_fetch_对象(mysqli_查询($db,“SELECT*FROM-ForumTopics,其中ID='$GetThreadFromID->ForumID')); $ThreadExist=mysqli_num_行(mysqli_查询($db,“SELECT*FROM-ForumThreads,其中ID='$ID')); $GetAllWatching=mysqli_query($db,“从ForumWatchedThreads中选择*,其中ThreadID='$ID'和UserID='$client->ID'); 如果($ThreadExist==“0”){ 回声“ 错误 您请求的线程不存在。 "; include$\u SERVER[“DOCUMENT\u ROOT”]。“/\u INCLUDES/Footer.php”; 退出(); }

在ID-PHP中放置撇号时不显示数据 $ID=$db->real\u escape\u字符串(strip\u标记(stripslashes($\u GET['ID'])); $GetThreadFromID=mysqli\u fetch\u对象(mysqli\u查询($db,“SELECT*FROM-ForumThreads,其中ID=$ID”); $GetThreadStarter=mysqli_fetch_对象(mysqli_查询($db,“SELECT*FROM-FROM-Users,其中ID='$GetThreadFromID->PosterID')); $GetTopicFromThread=mysqli_fetch_对象(mysqli_查询($db,“SELECT*FROM-ForumTopics,其中ID='$GetThreadFromID->ForumID')); $ThreadExist=mysqli_num_行(mysqli_查询($db,“SELECT*FROM-ForumThreads,其中ID='$ID')); $GetAllWatching=mysqli_query($db,“从ForumWatchedThreads中选择*,其中ThreadID='$ID'和UserID='$client->ID'); 如果($ThreadExist==“0”){ 回声“ 错误 您请求的线程不存在。 "; include$\u SERVER[“DOCUMENT\u ROOT”]。“/\u INCLUDES/Footer.php”; 退出(); },php,mysqli,Php,Mysqli,我有一个手工编码的论坛网站。你可以很好地访问论坛线程。假设线程ID为12,但我在?ID=中的末尾加了一个撇号,那么论坛标题和论坛正文以及其他信息将为空。我怎样才能使它显示带有ID的线程,所以如果我把它放在URL栏:?ID=13//或?ID=13'',它仍然会显示?ID=13而没有任何干扰,甚至会显示一个错误,说论坛线程不存在?你只是假设查询成功。由于您没有检查失败,因此如果查询失败,您的==“0”将成功,因为query()和fetch()返回的布尔值FALSE将测试为等于“0” 永远不要假设db

我有一个手工编码的论坛网站。你可以很好地访问论坛线程。假设线程ID为12,但我在?ID=中的末尾加了一个撇号,那么论坛标题和论坛正文以及其他信息将为空。我怎样才能使它显示带有ID的线程,所以如果我把它放在URL栏:?ID=13//或?ID=13'',它仍然会显示?ID=13而没有任何干扰,甚至会显示一个错误,说论坛线程不存在?

你只是假设查询成功。由于您没有检查失败,因此如果查询失败,您的
==“0”
将成功,因为query()和fetch()返回的布尔值FALSE将测试为等于“0”

永远不要假设db操作成功。即使您的SQL语法是完美的,但无论如何查询失败的原因几乎是无限的

$ID                 = $db->real_escape_string(strip_tags(stripslashes($_GET['ID'])));
            $GetThreadFromID    = mysqli_fetch_object(mysqli_query($db, "SELECT * FROM ForumThreads WHERE ID=$ID"));
            $GetThreadStarter   = mysqli_fetch_object(mysqli_query($db, "SELECT * FROM Users WHERE ID='$GetThreadFromID->PosterID'"));
            $GetTopicFromThread = mysqli_fetch_object(mysqli_query($db, "SELECT * FROM ForumTopics WHERE ID='$GetThreadFromID->ForumID'"));
            $ThreadExist        = mysqli_num_rows(mysqli_query($db, "SELECT * FROM ForumThreads WHERE ID='$ID'"));
            $GetAllWatching     = mysqli_query($db, "SELECT * FROM ForumWatchedThreads WHERE ThreadID='$ID' AND UserID='$client->ID'");

            if ($ThreadExist == "0") {
                                echo "
                                <div class='container'>
                                    <div class='panel panel-danger'>
                                        <div class='panel-heading'>Error</div>
                                        <div class='panel-body'>
                                            The thread you requested does not exist.
                                        </div>
                                    </div>
                                </div>
                                ";
            include $_SERVER["DOCUMENT_ROOT"]."/_INCLUDES/Footer.php";
            exit();
            }
或die()
将处理完全失败的查询,
=
严格相等测试将确保您测试的是实际的整数0,而不是任何其他也测试为0的值,例如在php中,
'==0
是真的


请注意,您的第一个查询仍然容易受到某些形式的攻击,尽管您正在进行所有的剥离和引用。e、 g.
1或1=1
将直接通过,因为没有标记、斜线和要转义的
字符。

阅读此文章,非常感谢您的解释。我如何修复可能易受SQL注入攻击的查询?如果有人想立即进入我的数据库,他们是否真的易受攻击?在第一个查询中,我只做了$id,而不是纯ID,它固定了空白显示。这也修复了SQL注入吗?您正在使用mysqli。使用预先准备好的语句和占位符:这意味着我必须重写我网站上的每个查询,这将非常烦人。我该怎么办?最好快点,否则你以后会吃亏的。我用了一个程序试图用sql注入我的页面,但我还没有进入数据库。为什么呢?
$result = mysqli_query(...) or die(mysqli_error($db));
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^

if (mysqli_num_rows($result) === 0) {
  die("No results");
}