1

所以,我试图在防止注射的同时使用 get 方法。我正在尝试从数据库中获取数据并将其回显到页面。我认为我正在尝试使用下面的代码做什么很明显,但我需要帮助才能使用正确的语法。

有人可以告诉我准备语句的正确语法,以便使用 mysqli 从数据库中获取数据,该数据库可以防止注入?

我在这个网站上看过似乎找不到我要找的东西,而 PHP 网站我找不到最新的方法。感谢所有的帮助。

<?php
$mysqli = new mysqli("", "", "", "");
if ($mysqli->connect_error) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_error . ") " . $mysqli->connect_error;
}

$stmt = $mysqli->stmt_init();

if($stmt->prepare("SELECT 'name,name' FROM 'table' WHERE 'name, name' = ?,?")) {
}

if (!$stmt->bind_param('si', $_GET['name'], $_GET['name'])); {
    echo "Binding parameters failed: (" . $stmt->error . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->error . ") " . $stmt->error;
}

if (!$stmt->fetch()); {
    echo "Binding parameters failed: (" . $stmt->error . ") " . $stmt->error;
}

$stmt->close();
?>
4

3 回答 3

0

如果您想保护所有 GET 输入,这是更好的解决方案:

function GET($name=NULL, $value=false)
{
    $content=(!empty($_GET[$name]) ? trim($_GET[$name]) : (!empty($value) && !is_array($value) ? trim($value) : false));
    if(is_numeric($content))
        return preg_replace("@([^0-9])@Ui", "", $content);
    else if(is_bool($content))
        return ($content?true:false);
    else if(is_float($content))
        return preg_replace("@([^0-9\,\.\+\-])@Ui", "", $content);
    else if(is_string($content))
    {
        if(filter_var ($content, FILTER_VALIDATE_URL))
            return $content;
        else if(filter_var ($content, FILTER_VALIDATE_EMAIL))
            return $content;
        else if(filter_var ($content, FILTER_VALIDATE_IP))
            return $content;
        else if(filter_var ($content, FILTER_VALIDATE_FLOAT))
            return $content;
        else
            return preg_replace("@([^a-zA-Z0-9\+\-\_\*\@\$\!\;\.\?\#\:\=\%\/\ ]+)@Ui", "", $content);
    }
    else false;
}

只是 $_GET['something'] 您使用 GET('something') 并且如果 GET 值不存在,您可以选择放置默认值。在 MySQL 查询中,您可以使用转义字符串或准备好的状态来完全保护您的查询。

于 2014-10-10T13:16:45.087 回答
0

为了防止 sql 注入,你应该首先连接到你的 mysql 数据库,然后你应该用 mysql_real_escape_string() 包围你的 $_GET,如下所示:

mysql_real_escape_string($_GET['name'])

或使用较新的功能

mysqli_real_escape_string($_GET['name'])
于 2013-04-22T18:10:08.643 回答
0

你的sql是错误的:

if($stmt->prepare("SELECT 'name,name' FROM 'table' WHERE 'name, name' = ?,?")) {

一定是

if($stmt->prepare("SELECT name, name FROM table WHERE name=? AND name=? ")) {

双倍的表现力name,我只是因为这个问题才使用的。

以下更清楚:

if($stmt->prepare("SELECT astring, ainteger FROM table WHERE astring=? AND ainteger=? ")) 
{
if (!$stmt->bind_param('si', $_GET['astring'], $_GET['ainteger'])) {

花点时间仔细写下问题。如果使用了两个变量,则指定不同,其他一切都只是混淆。

更新 :

  • 使用前bind_param()
  • 您必须测试所有 $_GET["xx"]。

if (isset($_GET['name']))

  • 当您调用函数时,;例如以以下方式终止:

if (!$stmt->bind_param('si', $_GET['name'], $_GET['name'])); {

那么花括号是没用的,无论是ifgetstrue还是false

后面的代码if (!$stmt->bind_param(...));总是会被执行,因为命令,已经完成了。

if (!$stmt->bind_param('si', $_GET['name'], $_GET['name'])); {
    echo "Binding parameters failed: (" . $stmt->error . ") " . $stmt->error;
}

我花了很长时间才发现这个错误。它很容易被忽视。

这就是为什么您总是会收到自己的错误消息。

于 2013-04-22T19:25:48.637 回答