Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 动态产品页面和SQL注入漏洞_Php_Mysql_Sql_Dynamic_Sql Injection - Fatal编程技术网

Php 动态产品页面和SQL注入漏洞

Php 动态产品页面和SQL注入漏洞,php,mysql,sql,dynamic,sql-injection,Php,Mysql,Sql,Dynamic,Sql Injection,这里的新程序员,我昨晚问了一个类似的问题,但我想我应该用更新的属性提出一个新问题 下面的代码基于我一直在修改的旧教程。当我运行mysql连接脚本的测试脚本时,它向我显示它确实连接到数据库,并显示我创建的一个测试表来设置它。表由PHPmyadmin创建,主键为id 文档下部的变量返回为 未定义,我假设是因为它不是验证或插入 我的表中的数据正确吗?我已尝试删除while循环 似乎每次都得到相同的结果。有人有吗 关于这一点还有其他想法吗 第二,我最近刚刚发现了SQL注入,并尝试过 以符合这些卫生协议的

这里的新程序员,我昨晚问了一个类似的问题,但我想我应该用更新的属性提出一个新问题

下面的代码基于我一直在修改的旧教程。当我运行mysql连接脚本的测试脚本时,它向我显示它确实连接到数据库,并显示我创建的一个测试表来设置它。表由PHPmyadmin创建,主键为id

  • 文档下部的变量返回为 未定义,我假设是因为它不是验证或插入 我的表中的数据正确吗?我已尝试删除while循环 似乎每次都得到相同的结果。有人有吗 关于这一点还有其他想法吗
  • 第二,我最近刚刚发现了SQL注入,并尝试过 以符合这些卫生协议的方式修改代码。 有人能告诉我有什么我做得不对的地方吗 为了使代码更安全,我还需要做些什么
  • 
    .jpg“width=“142”height=“188”alt=”“/>





    问题在于:

    SELECT * FROM products WHERE id='?' LIMIT 1
    
    不能将参数占位符放在引号内。应如下所示:

    SELECT * FROM products WHERE id=? LIMIT 1
    
    即使参数的数据类型是字符串,参数占位符也不需要加引号。如果
    内引号是参数占位符,那么如何编写将文字问号作为某些文本一部分的SQL查询?:-)


    获取结果的代码有点混乱。下面是另一种编写方法:

    $query->execute();
    $result = $query->get_result();
    $row = $result->fetch_assoc();
    if ($result->num_rows > 0) {
        $product_name = $row["product_name"];
        $price = $row["price"];
        $details = $row["details"];
        $category = $row["category"];
        $subcategory = $row["subcategory"];
    } else {
        echo "That item does not exist.";
        exit();
    }
    
    您的查询将只返回0或1行,因此您只需要获取一次。无需使用while循环获取更多

    您确实需要为
    num_行
    至少提取一次,以返回0以上,因为在您尝试提取至少一行之前,它不知道是否有任何行可提取。但您不需要为此使用新变量,因为它已在
    num_行
    变量中可用


    除此之外,我还有一个小建议:

    与此相反:

    $id = preg_replace('#[^0-9]#i', '', $_GET['id']); 
    
    使用以下命令:

    $id = (int) $_GET['id'];
    
    这是一种更快的代码,如果有人输入像“123abc789”这样的字符串,它也可以避免错误。您的代码将返回值123789,但这是否正确?使用
    (int)
    进行强制转换将只返回前导数字部分,因此值将为123


    如果你试图解析可能有数千个分隔符的数字,我建议使用

    你真的不需要用preg_替换id,但是如果你想没有人会阻止你。不清楚下面的变量是什么意思,这和你没有告诉我们没有人能帮你的表格布局谢谢,我稍微更新了一下帖子,让我知道还需要什么。从这个开始,lol.SELECT*是糟糕的编程,因为你应该选择你真正需要的列。但我仍然不知道你指的是哪一个变量是$行中的一个?SQL中的引号并不是像“这是我的值”这样的意思但对定义字符串有一定的意义。查询中没有字符串,因此必须没有引号either@npk-它应该从所有列中获取数据,并在下面的html部分中动态呈现产品页面,但我无法让输出中的变量发挥作用。我认为这与将主键转换为php来填充变量有关。
    $id = (int) $_GET['id'];