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
通过设置一个页面,将"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