我在页面上接收的所有参数上使用addslashes()。并且还在mysql查询中围绕这些变量应用单个法院。这是我的代码:
$string = addslashes($_POST['string']);
$queryString = " INSERT INTO general (description) VALUES ('$string')";
$query = mysql_query($queryString);
AND
$queryString = "SELECT description FROM general WHERE description = '".$string."'";
$query = mysql_query($queryString);
此代码中是否有SQL INJECTION的可能性?
答案 0 :(得分:2)
阅读这篇文章:addslashes() Versus mysql_real_escape_string()
摘录:
如果我想针对MySQL数据库尝试SQL注入攻击,使用反斜杠转义单引号是一件好事。但是,如果你正在使用addslashes(),我很幸运。我需要做的就是注入类似0xbf27的东西,并且addslashes()将其修改为0xbf5c27,这是一个有效的多字节字符,后跟单引号。换句话说,尽管你逃脱了,我仍然可以成功地注入一个单一的报价。那是因为0xbf5c被解释为单个字符
注意:
Please, don't use
mysql_*
functions in new code。它们不再被维护and are officially deprecated。请参阅red box?转而了解prepared statements,并使用PDO或MySQLi - this article将帮助您确定哪个。如果您选择PDO here is a good tutorial。
答案 1 :(得分:0)
嘿,mysql_connect函数现已弃用为PHP gaint sign警告。 但是,如果您坚持使用已弃用的,那么您必须清理所有变量 使用mysql_real_escape_string()函数并将其传递给strip_tags()函数
但为什么不通过准备好的声明更好地使用Mysqli或更好地使用我认为最好的PDO。 Mysqli和PDO进行自动数据清理,确保无法进行SQL注入攻击。
如果您准备好使用PDO,那么我可以帮助您一开始。我希望这有帮助
PDO连接
<?php
$db = new PDO (
'mysql:host=localhost;dbname=sectona_db;charset=utf8',
'root', // username
'root99' // password
);
?>
<?php
require("pdo.php");
$username = $_POST['useruname'];
$photo = $_POST['photo'];
$statement = $db->prepare('INSERT INTO users (username,photo)
values
(:username,:photo)');
$statement->execute(array(
':username' => $name,
':photo' => 'profile.png'
));
echo ' data submitted';
?>