【问题标题】:SQL with HTTP/1.1 GetSQL 与 HTTP/1.1 获取
【发布时间】:2015-04-21 20:12:26
【问题描述】:

这是从dba.stackexchange 转发的。

很抱歉提出这样一个业余问题,但我不知道为什么这不起作用。 我有一个“add.php”来连接 MySQL 服务器。

/add.php

<?php
    include("connect.php");

    $link=Connection();

    $ID1=$_POST["ID1"];
    $ID2=$_POST["ID2"];
    $ID3=$_POST["ID3"];
    $ID4=$_POST["ID4"];
    $ID5=$_POST["ID5"];

    $query = "INSERT INTO Battery (ID01, ID02, ID03, ID04, ID05) 
        VALUES ('".$ID1."','".$ID2.",'".$ID3.",'".$ID4."','".$ID5."')"; 

    mysql_query($query,$link);
    mysql_close($link);

    header("Location: index.php");
?>

connect.php

<?php

    function Connection(){
        $server="mysql.randomserver.com";
        $user="random";
        $pass="1234";
        $db="random_1234";

        $connection = mysql_connect($server, $user, $pass);

        if (!$connection) {
            die('MySQL ERROR: ' . mysql_error());
        }

        mysql_select_db($db) or die( 'MySQL ERROR: '. mysql_error() );

        return $connection;
    }
?>

我使用简单的 HTTP 1.1 协议:

GET /add.php?ID1=1int&ID2=2char&ID3=3char&ID4=4int&ID5=2015-04-13 01:00:00 HTTP/1.1\r\nmyhost\r\n内容类型: 应用程序/x-www-form-urlencoded\r\n连接:关闭\r\n\r\n\r\n

其中 ID1,ID4 是整数; ID2、ID3 字符; ID5 日期时间 (SQL)

主机抛出这个错误:

+IPD,168:<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>hosting</center>
</body>
</html>

如果有人有任何想法让我尝试一下,我将不胜感激!我真是一头雾水……

固定: (moskito-x) '".$ID3.",'".$ID3."',

更新:2015.04.22 13:56

好的,我试过了,它可以在我的主页上运行:Index.php(只需将整个 /add.php 代码复制到 /index.php 中)

$query= "INSERT INTO  Battery (ID01,ID02,ID03,ID04,ID05) 
        VALUES ('1int','2char','3char','4int','2015-04-22 17:20:28')";
$result = mysqli_query($link, $query)

但是如果我把它替换到 add.php 中,就不会插入任何行。

我按照其他人的建议更改了 add.php:

add.php

<?php
    $link=Connection();
        $server="mysql.myhost.com";
        $user="randomUser";
        $pass="randomPwd";
        $db="radomdb";

    $link=mysqli_connect($server, $user, $pass, $db);


    $query = "INSERT INTO  Battery (ID01,ID02,ID03,ID04,ID05)
        VALUES ('1int','2char','3char','4int','2015-04-22 17:20:28')";
    mysqli_query($link, $query)
             mysqli_close($link);
    header("Location: index.php");
?>

【问题讨论】:

  • 请注意,mysql_ 功能现在不再只是不鼓励(就像过去几年一样),而是正式的 deprecated。你真的应该使用MySQLiPDO,因为这段代码很快就会停止工作。
  • 请勿使用 msql_query() 并从网页附加值,这称为 SQL 注入,这就是您的站点/数据库/服务器被黑客入侵的方式。您必须改用 PDO 来使用参数化查询。
  • @NhanLe 请参阅Why shouldn't I use mysql_* functions in PHP? 了解更多信息。
  • @NhanLe 另一件事是您正在访问 POST 变量,但您通过 GET GET /add.php?ID1=1int&amp;ID2=2char&amp;ID3=3char&amp;ID4=4int&amp;ID5=2015-04-13 01:00:00 发送数据您可以将 $_POST['var'] 更改为 $_GET['var']。
  • 嗨,@NhanLe 邮政!因此,您需要更改测试 add.php 的方式

标签: php http-1.1


【解决方案1】:

重要部分$link=Connection();

  • 我们看不到Connection();的代码
  • 您的查询有误
  • 在 cmets 中提到 -> 你使用 http GET 所以 $ID1=$_POST["ID1"]; 是错误的。

'".$ID1."','".$ID2.",'".$ID3.",'".$ID4."','".$ID5."')";
//                  |         |
//                  |_________|____ here forget ' 

$query = "INSERT INTO Battery (ID01, ID02, ID03, ID04, ID05) 
    VALUES ('".$ID1."','".$ID2."','".$ID3."','".$ID4."','".$ID5."')"; 

编辑

现在我们可以在您编辑的问题中看到

其中 ID1,ID4 是整数; ID2、ID3 字符; ID5时间戳

查询应该是(假设 TimeStamp ="20150421225300")字符串格式。

$query = "INSERT INTO Battery (ID01, ID02, ID03, ID04, ID05) 
    VALUES (".$ID1.",'".$ID2."','".$ID3."',".$ID4.",'".$ID5."')"; 

【讨论】:

  • @NhanLe 请求也很糟糕。
  • @NhanLe 也将 $_POST['var'] 更改为 $_GET['var']。因为您通过 HTTP GET 发送数据。
  • 嗨 Moskito,我在某处读到,如果我添加“Content-Type: application/x-www-form-urlencoded”,$_POST 也可以,所以,它不正确?
  • 我们已经说过很多次了。如果你使用的是“http get”,那么你需要在接收程序中使用一个$_GET。如果您有
    标签,则可以使用&lt;form action ="add.php" method = "post "&gt; 发送“http post”。 我强烈建议至少阅读这篇文章。 http Get and POST
  • @NhanLe,可以使用 POST 请求,但是您必须在 POST BODY 中发送数据,而不是在 GET 参数中 i> 在 $_POST 中得到一些东西。并且,请永远不要以这种方式在查询中添加数据,这是不安全的(普通 SQL 注入)并且根本不可靠,各种失败方式。顺便说一句,我无法支持包含直接参数连接的查询的答案,这是通往地狱的正确方式。
【解决方案2】:

您在帖子中显示的 http 请求(_ 代表空行):

GET /add.php?ID1=1int&ID2=2char&ID3=3char&ID4=4int&ID5=2015-04-13 01:00:00 HTTP/1.1
myhost
Content-Type: application/x-www-form-urlencoded
Connection:close
_
_
_

它确实是 bad request,因为 (a) 您在 URI 中有未转义的空白字符,并且 (b) 当您可能指的是 Host: myhost 时,第二行仅读取 myhost (c) 您还有额外的 @987654326 @(虽然不太可能引起麻烦),所以这样的事情:

POST /add.php?ID1=1int&ID2=2char&ID3=3char&ID4=4int&ID5=2015-04-13+01:00:00 HTTP/1.1
Host: myhost
Content-Type: application/x-www-form-urlencoded
Connection:close
_
_

当然还有其他关于 SQL 注入的说法。

【讨论】:

  • 嘿,谢谢你的回答,我还没有让 PHP 正确插入到 SQL 表中。请看看我的更新,你有什么建议吗?
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多