在PHP中避免SQL注入

时间:2013-03-18 03:27:52

标签: php sql-injection

我已经阅读了关于数据库注入的信息,直到我眼中的红色,论坛搜索,错误命名的搜索搜索......这是一个彻头彻尾的问题。我正在使用jquery / ajax。

var characterReg = /^([0-9a-zA-NP-Z]{27,34})$/;

仅用于基本格式验证。传递给php。在数据库查询中使用结果是否安全?我不是在寻找基本格式的实际比特币地址验证。

<?php
include('myConnect.php');
$expire = time() + 60 * 60 * 24 * 30;
$path   = '/';
if (isset($address)) {
    // Query db if address exsists.
    $data = mysql_query("SELECT * FROM viewers WHERE address = '$address'");
    $info = mysql_fetch_array($data);
    if ($info) {
        // Build cookie data from db row array.
        $bitAdrr = $info['address'];
        $id    = $info['id'];
        $earn  = $info['earnings'];
        $track = $info['tracking'];
        setcookie('user', $bitAdrr . ',' . $id . ',' . $earn . ',' . $track, $expire);
    } else {
        echo 'empty';
    }
}
?>

myConnect.php

<?php
$addr = $_GET['address'];
// Verify address is correct format.
if (strlen($addr) > 26 && strlen($addr) < 35 && !preg_match('/[^A-NP-Za-z0-9]/', $addr)) {
    $server = 'mysql.myHost.com';
    $user   = 'myUserName';
    $pass   = 'myPassWord';
    $db     = 'myDataBase';
    // Connect to Database
    $connection = mysql_connect($server, $user, $pass) or die("Could not connect to server. \n" . mysql_error());
    mysql_select_db($db) or die("Could not connect to database. \n" . mysql_error());
    $address = $addr;
} else {
    exit;
}
?>

可能的注射? mysql_real_escape_string(htmlspecialchars似乎真的很慢。我宁愿没有。

1 个答案:

答案 0 :(得分:0)

最好的答案是使用prepared statements,它允许数据库引擎担心正确的转义。

完整的详细信息在PHP手册中,但摘要是您首先通过提供带有问号占位符的语句的模板来准备变量:

$stmt = $mysqli->prepare("SELECT * FROM viewers WHERE address = ?")

然后,您可以提供要替换的参数:

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

然后最终执行它:

$stmt->execute();

需要注意的另一个方面是,您似乎正在尝试在客户端(在JavaScript中)而不是在服务器端(在PHP中)进行验证。这是不安全的,因为您无法验证所有请求是否来自您页面上运行的代码;由于代码在我的浏览器中运行,我可以简单地选择不运行它并使用我喜欢的任何地址值直接向您的服务器发送请求。始终在服务器端实现数据验证。