所以我知道MySQL注入并在将它放入我的数据库之前总是转义我的所有用户输入.但是我想知道,想象一个用户试图提交一个查询注入,我逃避它.如果我稍后从数据库中获取此值并在查询中使用它,该怎么办?我必须再次逃脱吗?
所以:( sql::escape()包含我的转义功能)
$userinput = "'); DROP `table` --";
mysql_query("INSERT INTO `table`
(`foo`,`bar`)
VALUES
('foobar','".sql::escape($userinput)."')");
// insert php/mysql to fetch `table`.`bar` into $output here
mysql_query("INSERT INTO `table2`
(`foo`,`bar`)
VALUES
('foobar','".$output."')");
Run Code Online (Sandbox Code Playgroud)
MySQL会自动转义它们的输出还是类似的东西,还是应该在第二个查询中转义?
这是一个测试用例,但这在我的程序中以其他方式发生,我想知道这样的情况下安全性有多紧.
编辑
我的逃生功能
static function escape($string){
if(get_magic_quotes_gpc())
$string = stripslashes($string);
return mysql_real_escape_string($string);
}
Run Code Online (Sandbox Code Playgroud) 我是PHP新手,我意识到我的数据库连接,使用php表单(用户和传递文本输入)是完全不安全的:
这很有效,但不安全:
<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$sql=' SELECT * FROM usuarios
WHERE username="'.$_POST['usuario'].'"
AND pass="'.$_POST['usuario'].'"
';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>
Run Code Online (Sandbox Code Playgroud)
所以,我读过mysqli_real_escape_string,并决定尝试一下:
<?php
$link=mysqli_connect('localhost','xx','xx','xx');
$usuario=mysqli_real_escape_string($link, $_POST["usuario"]);
$clave=mysqli_real_escape_string($link, $_POST["clave"]);
$sql=' SELECT * FROM usuarios
WHERE username="'.$usuario.'"
AND pass="'.$clave.'"
';
$rs=mysqli_query($link,$sql);
mysqli_close($link);
?>
Run Code Online (Sandbox Code Playgroud)
它是否正确?这是如何使用mysqli_real_escape_string的一个很好的例子吗?
我有一个php的网站,包括()将内容嵌入到模板中.要加载的页面在get参数中给出,我将".php"添加到参数的末尾并包含该页面.我需要做一些安全检查以避免XSS或其他东西(不是mysql注入,因为我们没有数据库).我想出的是以下内容.
$page = $_GET['page'];
if(!strpos(strtolower($page), 'http') || !strpos($page, '/') ||
!strpos($page, '\\') || !strpos($page, '..')) {
//append ".php" to $page and include the page
Run Code Online (Sandbox Code Playgroud)
我还能做些什么来进一步消毒我的输入吗?
我理解通过使用预准备语句来保护数据库免受SQL注入的正确方法.我想了解准备语句如何保护我的数据库.
首先,准备好的语句与"参数化查询"相同吗?
作为一个例子,我粘贴在我的代码下面,以便在用户表中插入新用户.这样安全吗?PDO如何确保其安全?还有什么需要做的,以保护数据库免受注入?
在'Class_DB.php'中:
class DB {
private $dbHost;
private $dbName;
private $dbUser;
private $dbPassword;
function __construct($dbHost, $dbName, $dbUser, $dbPassword) {
$this->dbHost=$dbHost;
$this->dbName=$dbName;
$this->dbUser=$dbUser;
$this->dbPassword=$dbPassword;
}
function createConnexion() {
return new PDO("mysql:host=$this->dbHost;dbName=$this->dbName", $this->dbUser, $this->dbPassword);
}
}
Run Code Online (Sandbox Code Playgroud)
在'DAO_User.php'中:
require_once('Class_DB.php');
class DAO_User {
private $dbInstance;
function __construct($dbInstance){
$this->dbInstance=$dbInstance;
}
function createUser($user){
$dbConnection=$this->dbInstance->createConnexion();
$query=$dbConnection->prepare("INSERT INTO users (userName, hashedPassword, userEmail) VALUES (?,?,?)");
$query->bindValue(1, $user->userName);
$query->bindValue(2, $user->hashedPassword);
$query->bindValue(3, $user->userEmail);
$query->execute();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
JDelage
我是PDO的新手,想知道我的查询是否可以安全地从SQL注入.如果是这样的话,我会在整个网站上使用这种方法.
// make connection to DB
$db = new PDO('mysql:host='.$dateBaseHost.';dbname='.$dateBaseName, $dateBaseUsername, $dateBasePassword);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//simple query and binding with results
$query = $db->prepare(" SELECT * FROM `profile` WHERE `fullname` = :fullname ");
$search = (isset($_GET['search']) === true) ? $_GET['search'] : '' ; // ? : shorthand for if else
// bind parameters - avoids SQL injection
$query->bindValue(':fullname', $search);
//try... if not catch exception
try {
// run the query
$query->execute();
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
echo '<pre>', print_r($rows, true),'</pre>';
}
catch (PDOException …Run Code Online (Sandbox Code Playgroud) 我一直在发现这句话PHP PDO's prepared statements prevents SQL injection.
- php PDO(PDO准备好的语句)如何阻止sql注入?
- 使用PDO(PDO准备好的声明)的其他优缺点是什么?
- 使用PDO(PDO准备好的声明)会降低效率吗?
我已经读过:PDO准备好的语句是否足以阻止SQL注入? 但那里的数据并不完全清楚.
我正在将一些使用ext/mysql(mysql_*()函数)的代码转换为PDO和预处理语句.以前当我动态构建查询时,我只是通过我的字符串mysql_real_escape_string()直接将它们放入我的查询中,但现在我发现我需要在执行查询时将值作为数组传递,或者在执行之前绑定变量.
如何将旧代码转换为使用新的数据库驱动程序?
是否可以execute($input_parameter)保护sql注入bindParam/bindValue?
如果答案是肯定的,那么bindParam()/bindValue()/execute()对任何sql-inject攻击都是无懈可击的吗?或者我需要采取措施来防止此类攻击?
感谢帮助!.
如果我使用MySQLi准备好的语句如下:
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
Run Code Online (Sandbox Code Playgroud)
我还需要逃避我的变量,例如$Session用mysqli_real_escape_string();象下面这样:
$Session = mysqli_real_escape_string($con1, $_COOKIE['Session']);
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
Run Code Online (Sandbox Code Playgroud) php ×10
pdo ×6
mysql ×4
mysqli ×3
sql ×2
escaping ×1
sanitization ×1
security ×1
user-input ×1