SQL注入证明SELECT与LIKE和通配符到关联数组

时间:2016-08-01 06:17:15

标签: php mysql mysqli pdo

计划是创建面向公众的互联网服务,可以自动填充数据库中的单词。我使用常规的mysql查询成功地工作但我很担心,因为我将把这个连接包含到wordpress插件中,这将使我的服务器容易受到攻击。

我在MYSQL中创建了一个新用户,只对该表有选择权限,因此我并不担心在脚本中泄露密码,因为我认为无论如何它都有助于调试。我为调试目的放了各种回声等。最终,它的输出将进入Json文件并由Jquery UI自动完成检索。

基本上我遇到的问题是我无法让查询起作用。我尝试逐行添加代码,但连接不起作用。随意测试mysql workbench上的凭据IP地址是46.101.8.220。使调试更加困难的是,当从Web浏览器查看时,代码中的某个人阻止出现在页面输出上的任何内容。任何帮助将不胜感激,因为我花了很多时间尝试Mysqli,PDO,面向对象和程序试图让这个工作。

$term = isset($_GET['term']) ? $_GET['term'] . '%': 'test%';
echo $term;

$conn = new mysqli('localhost', 'search-words','','admin_soup');
print ($conn ? 'connected' : 'cant con');
$query = 'SELECT id as value, word as label FROM word where word LIKE ?;';
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $term)
    if ($stmt->execute()){
        $result = $stmt->get_result();
        while($row = $result->fetch_array(MYSQLI_ASSOC)){
            $row_set[] = $row;
        }
    }
echo json_encode($row_set);//format the array into json data
$stmt->close();
$conn->close();
print_r($row_set);

在第一个建议代码更改为并正常工作之后。谢谢!

$term = isset($_GET['term']) ? $_GET['term'] . '%': 'test%';
echo $term;
$conn = new mysqli('localhost', 'search-words','','admin_soup');
print ($conn ? 'connected' : 'cant con');
$query = 'SELECT id as value, word as label FROM word where word LIKE ?;';
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $term);
    if ($stmt->execute()){
        $stmt->bind_result($value,$label);
        while($row = $stmt->fetch()){
            $row_set[] = array('value'=>$value, 'label'=>$label);
        }
    }

echo json_encode($row_set);//format the array into json data
$stmt->close();
$conn->close();

代码仍然没有返回任何内容。仔细检查用户信息。我在测试sql语句时唯一需要改变的是我需要在' test%'周围添加quoations。但我认为bind_param不需要引号。如果我删除$ query downwars中的所有代码,如果我再次在下面添加,它将在屏幕上显示连接的消息。屏幕没有显示任何内容。

是否可能需要在我的服务器上更新某些内容?

1 个答案:

答案 0 :(得分:0)

$stmt->bind_param("s", $term)

缺少“;”

$result = $stmt->get_result();

get_result()方法并非始终可用。检查php.net:http://php.net/manual/en/mysqli-stmt.get-result.php

  

仅适用于mysqlnd。

这就是为什么pdo更方便的原因之一......

但我想你可以使用bind_result()然后使用fetch()数据http://php.net/manual/en/mysqli-stmt.fetch.php

if ($stmt->execute()){
    $stmt->bind_result($value, $label);
    while($row = $stmt->fetch()){
        $row_set[] = array('value' => $value, 'label' => $label);
    }
}

通过使用PDO,代码可能如下所示:

$stmt = $dbh->prepare('SELECT id as value, word as label FROM word where word LIKE ?');
$stmt->execute(array($term));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);