防止$ _GET方法的注入和正确语法

时间:2013-04-22 18:00:49

标签: php phpmyadmin

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

有人能告诉我使用mysqli从数据库获取数据的prepare语句的正确语法吗?

我看过这个网站似乎无法找到我正在寻找的东西和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();
?>

3 个答案:

答案 0 :(得分:0)

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

mysql_real_escape_string($_GET['name'])

或使用更新的功能

mysqli_real_escape_string($_GET['name'])

答案 1 :(得分: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'])); {

无论if获得true还是false,花括号都是无用的!

if (!$stmt->bind_param(...));之后的以下代码将始终执行,因为命令已完成。

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

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

这就是您总是收到自己的错误消息的原因。

答案 2 :(得分: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查询中,您可以使用转义字符串或准备好的状态来完全保护您的查询。