-2

我已经阅读了关于 db 注入的信息,直到我眼睛红了,论坛搜索,未命名的搜索搜索......所以一个彻头彻尾的问题。我正在使用 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';
    }
}
?>

我的连接.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 似乎真的很慢。我宁愿不要。

4

1 回答 1

0

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

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

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

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

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

然后最后执行它:

$stmt->execute();

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

于 2013-03-18T03:32:32.377 回答