在PHP中避免SQL注入

在PHP中避免SQL注入

问题描述:

我已经阅读了有关db注入的内容,直到我眼睛发红,论坛搜索,错过搜索搜索....所以一个彻头彻尾的问题。我正在使用jquery/ajax。在PHP中避免SQL注入

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似乎是很慢的。我宁愿不要。

+0

停止尝试摆脱做正确的事是**使用参数化查询**。这就像你在说:“嘿,我可以在没有戴上安全带的情况下驾驶这条路线吗?”当答案只是放在你的安全带上。你为什么要担心与数据库交谈的运行时间会使其变得“矮”,文本转换代码是多么“慢”? – 2013-03-18 03:39:03

+0

不,谢谢。当我在我的机器上运行它时,它滞后。你能注入吗?对不起,快速回复的数量让我有点不知所措。谢谢。 – user2180814 2013-03-18 03:52:53

+1

我向你保证,无论你遇到什么样的速度问题,都不是通过调用mysql_real_escape_string引起的。使用像XDebug这样的代码配置文件工具来查找真正的问题。 – 2013-03-18 05:36:33

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

全部细节都在PHP手动的,但是细节上,你首先通过提供问号占位符声明的变量的模板准备:

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

您可以提供的参数来代替:

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

然后终于执行:

$stmt->execute(); 

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

+0

“看起来你试图在客户端做你的验证”为ajax职位。不是PHP。 – user2180814 2013-03-18 03:55:11

+0

服务器不知道我对此字符串的期望。对不起,你很好,但你看到一个可以在代码中被黑客攻击的问题吗? – user2180814 2013-03-18 04:20:35

+1

如果你所要求的是“请对这段代码进行安全审查”,那么这对StackOverflow来说太过本地化了。预计这里的问题通常适用于广泛的读者,我会给出的一般建议是“通过使用准备好的语句来应用PHP手册中建议的最佳实践”。在我花费两分钟的时间看着你的代码,我没有看到问题,但我不明白为什么你会坚持这样一个有风险的策略,当一个更强大的解决方案可用,需要更少的代码写你。 – 2013-03-18 04:28:28