SQL 语句注入

SQL Injection to statements

通过设置一个页面,将"register"个用户放入一个mysql数据库中,并使用以下代码:

$name = $_POST['name'];
$saltedpwd = md5($definedsalt.$_POST['pwd']);
$email = $_POST['email'];

$query = "INSERT INTO `users` ( `name`, `pwd`, `email` ) VALUES ( '$name', '$saltedpwd', '$email' )";
$insert = mysqli_query($database, $query);

它容易受到任何可能的 SQL 注入攻击吗?

关于邮箱激活码,使用此码:

$address = $_GET['email'];

if (isset($_GET['val']) && (strlen($_GET['val']) == 64))
{
$validate = $_GET['val'];
}

if (isset($address) && isset($validate))
{
$query = "UPDATE users SET activated = 'true' WHERE ( email ='$address' AND validate='$val' ) LIMIT 1";
$result_query = mysqli_query($database, $query);

$get_member = ($database, "SELECT name FROM users WHERE email = '$email'");
$query_get = mysqli_fetch_array($get_member);
$validated_name = $query_get['name'];
$insert_validate = "INSERT INTO `member` ( `name` ) VALUES ( '$validated_name' );
$result_insert = mysqli_query($database, $insert_validate);

它是否容易受到任何 SQL 注入的攻击? 我想是的,因为我必须从 $_GET 请求中检索值,所以我猜他们可以放类似这样的东西:

page.php?email=address@address.com'SQL_INJECTION'&val=123456asdfghjkl

我错了吗? 如果它确实存在漏洞,我该如何防止任何注入?

我建议查看准备好的语句。您很容易受到攻击,因为输入未经验证。请参考here

是的,是

如果用户输入以下行作为名称怎么办?

','',''); ANY_SQL_QUERY_HERE --

然后这个

$query = "INSERT INTO `users` ( `name`, `pwd`, `email` ) VALUES ( '$name', '$saltedpwd', '$email' )";

变成

INSERT INTO `users` ( `name`, `pwd`, `email` ) VALUES ( '','',''); ANY_SQL_QUERY_HERE --', '$saltedpwd', '$email' )";

你永远不应该使用字符串的直接连接来查询, 您必须使用准备好的语句

有关准备好的语句的更多信息 - http://php.net/manual/en/pdo.prepared-statements.php

例如,您的查询可以这样完成

$query = "INSERT INTO users (name,pwd,email) VALUES (:name,:pwd,:email)";
$statement = $pdoDatabaseHandle->prepare($query);
$statement->bindValue(':name',$name);
$statement->bindValue(':pwd',$saltedpwd);
$statement->bindValue(':email',$email);
$statement-execute();

总体而言 SQL 注入在维基百科上有很好的解释 - https://en.wikipedia.org/wiki/SQL_injection