Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL注入的正确修复方法?_Php_Mysql_Sql Injection - Fatal编程技术网

Php SQL注入的正确修复方法?

Php SQL注入的正确修复方法?,php,mysql,sql-injection,Php,Mysql,Sql Injection,我的代码中有sql注入,我用havji检查了它 所以我考虑了一个解决方案,我将值的类型设置为整数或字符串 这样地。这会奏效吗?就像不再打针一样???没什么好担心的? 我的代码在下面, 对不起,我的英语不好 function get_page_by_id($page_id) { settype($page_id, "integer"); global $connection; $query = "SELECT * "; $query .= "FROM pages

我的代码中有sql注入,我用havji检查了它

所以我考虑了一个解决方案,我将值的类型设置为整数或字符串 这样地。这会奏效吗?就像不再打针一样???没什么好担心的? 我的代码在下面, 对不起,我的英语不好

function get_page_by_id($page_id) {
    settype($page_id, "integer");

    global $connection;
    $query = "SELECT * ";
    $query .= "FROM pages ";
    $query .= "WHERE id=" . $page_id ." ";
    $query .= "LIMIT 1";
    $result_set = mysql_query($query, $connection);
    confirm_query($result_set);
    // REMEMBER:
    // if no rows are returned, fetch_array will return false
    if ($page = mysql_fetch_array($result_set)) {
        return $page;
    } else {
        return NULL;
    }
}
先编码后修复

function get_page_by_id($page_id) {

    global $connection;
    $query = "SELECT * ";
    $query .= "FROM pages ";
    $query .= "WHERE id=" . $page_id ." ";
    $query .= "LIMIT 1";
    $result_set = mysql_query($query, $connection);
    confirm_query($result_set);
    // REMEMBER:
    // if no rows are returned, fetch_array will return false
    if ($page = mysql_fetch_array($result_set)) {
        return $page;
    } else {
        return NULL;
    }
}

您通常要做的是使用准备好的语句。对于php,您可以阅读一个选项

下面是该页面中的示例

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

请尝试以下代码:

$page_id = mysql_real_escape_string(stripslashes($page_id));

我将努力了解更多关于准备好的状态!谢谢你的回答。但是现在设置类型是否解决了我的问题?既然我是一个初学者,除了其他人的答案,你可能还想研究一下(我需要改进)。我还是一个初学者:)作为一个初学者,你必须通读答案并明智地选择它们。否则你会有不愉快的结果。就像在这种情况下,由于某种原因,你接受了唯一一个根本不能保护你免受注射的答案。我不敢相信这个答案被接受了。