PHP代码无法识别某些值

时间:2017-03-29 02:40:53

标签: php angularjs

编辑:谢谢大家的快速回答!我已经在这一段时间了,试图找出为什么$ id被识别以及为什么字符串不被识别。我觉得现在看到明显的答案有点傻了,但我很放心让它发挥作用。

如果之前已经回答过,我道歉,我已经找了好几个小时,找不到类似的东西来帮助我解决这个问题。

我正在尝试使用新信息更新设备数据库中的一行。问题是,php文件只识别$data->devID;而没有别的。

如果我有类似的东西 $sql = "UPDATE devices SET devName = 'static test string', description = 'static test string' WHERE devID = $id"; 具有正确ID的条目将在我的数据库表中更新。

如果我试试 $sql = "UPDATE devices SET devName = $name, description = $desc WHERE devID = $id"; 它不起作用。

我哪里错了?

HTML:

<div data-ng-repeat="info in deviceInfo">
    <form class="deviceInfo">
        <h2>Device ID: {{info.devID}}</h2>
        <p>Device Name:</p>
        <input type="text" data-ng-model="info.devName">
        <p>Device Description:</p>
        <textarea data-ng-model="info.description"></textarea>
        <p>Device Available: {{info.isAvailable}}</p>
        <input type="submit" name="Update" value="Update" data-ng-click="updateInfo(info.devID, info.devName, info.description)">
    </form>
</div>

updateDeviceInfo.php:

<?php

$data = json_decode(file_get_contents("php://input"));

include('config.php');

$id = $data->devID; 
$name = $data->devName;
$desc = $data->description;

$sql = "UPDATE devices SET devName = $name, description = $desc WHERE devID = $id";

$qry = $conn->query($sql);

$data = $qry;

$sql = "SELECT * FROM devices";

$qry = $conn->query($sql);

$data = array();

if($qry->num_rows > 0){
    while($row = $qry->fetch_object()){
        $data[] = $row;
    }
}else {
    $data[] = null;
}

$conn->close();

echo json_encode($data);    

controller.js:

$scope.updateInfo = function($paramID, $paramName, $paramDesc){

    console.log($paramID);
    console.log($paramName);
    console.log($paramDesc);

    $scope.dataOneTest = {
            devID: $paramID,
            devName: $paramName,
            description: $paramDesc

        };

    console.log($scope.dataOneTest.devID);

    $http.post('./js/updateDeviceInfo.php', {'devID': $paramID, 'devName': $paramName, 'description': $paramDesc})
        .success(function(data){
            $scope.results = data;
        })
        .error(function(err){
            $log.error(err);
        })
}

3 个答案:

答案 0 :(得分:2)

tl; dr 您几乎可以肯定通过将变量直接插入查询而失败,从而 对您自己执行SQL injection在他们周围使用适当的引号。

您需要使用预准备语句,而不是将变量直接连接到查询中。例如,如果$data->devName包含像NULL --那样邪恶的东西,那就会干掉整个桌子。这是一个非常温和的例子,说明事情会发生多么糟糕。准备好的陈述会使这个例子(以及几乎所有其他例子)变得无害。

短期修复

作为短期修复,请在查询中加上引号并转义数据,如下所示:

$id = your_database_escape_function($data->devID); 
$name = your_database_escape_function($data->devName);
$desc = your_database_escape_function($data->description);

$sql = "UPDATE devices SET devName = '$name', description = '$desc' WHERE devID = $id";

your_database_escape_function()替换数据库的相应转义函数。例如,如果$conn->real_escape_string()$conn对象,请使用MySQLi。请参阅the manual

Real Fix

以下是您真正正确执行此操作的方法,以及您应尽快实施的解决方案。也就是说,如果可能的话,在你再进一步之前这样做。 使用准备好的陈述。

阅读this entire Q&Athis cheat sheet from OWASP(无关联)以获取更多信息。

答案 1 :(得分:1)

更改此描述和应该引用字符串的devName

$ sql =“UPDATE devices SET devName = $ name,description = $ desc WHERE devID = $ id”;

$ sql =“UPDATE devices SET devName ='”。$ name。“',description ='”。$ desc。“'WHERE devID = $ id”;

答案 2 :(得分:1)

试试这个,$ sql =“UPDATE devices SET devName ='$ name',description ='$ desc'WHERE devID = $ id”;

由于标题和描述是字符串,因此需要在双引号内包装单引号。

相关问题