Php 我应该采取哪些步骤来防止SQL注入?
作为对一个消息的响应,有一个响应是我正在打开我的数据库以进行SQL注入。代码如下:Php 我应该采取哪些步骤来防止SQL注入?,php,sql-injection,Php,Sql Injection,作为对一个消息的响应,有一个响应是我正在打开我的数据库以进行SQL注入。代码如下: <?php $firstname = stripslashes(strip_tags($_POST['firstname'])); $lastname = stripslashes(strip_tags($_POST['lastname'])); $email = stripslashes(strip_tags($_POST['email']))
<?php
$firstname = stripslashes(strip_tags($_POST['firstname']));
$lastname = stripslashes(strip_tags($_POST['lastname']));
$email = stripslashes(strip_tags($_POST['email']));
$title = stripslashes(strip_tags($_POST['title']));
$organization = stripslashes(strip_tags($_POST['organization']));
$pdbHost = "localhost";
$pdbUserName = "******";
$pdbPassword = "******";
$pdbName = "db1080824_emails";
// Connect to mySQL
$conlink = mysql_connect($pdbHost, $pdbUserName, $pdbPassword);
if(!$conlink) {die('Unable to connect to '.$pdbHost);}
if (!mysql_select_db($pdbName, $conlink)){die('Cannot find database '.$pdbName);}
//SQL query
$SQL2="INSERT INTO `db1080824_emails`.`emails` (`record_id` ,`firstname`,`lastname`,`email`,`title`,`organization`)VALUES (NULL , '".$firstname."', '".$lastname."', '".$email."', '".$title."', '".$organization."')";
mysql_query($SQL2);
// Connect to Closing the connection
mysql_close($conlink);
?>
使用准备好的语句。认真地一种简单的方法是使用PHP的数据库包装器
使用事先准备好的陈述。认真地一种简单的方法是使用PHP的数据库包装器
用于防止SQL注入。只有这个功能就足够了
而且,正如@knittl所说,使用预先准备好的语句也是一种很好的预防方法。但是普通的mysql库不支持这一点。你需要一个像PDO或MySQLi这样的图书馆。我建议您切换到PDO或MySQLi,因为在更高的PHP版本中,mysql库将被弃用
改进代码的其他一些技巧:
- 不要使用
die()
。如果你犯了一个错误,你不会死,那为什么要用电脑呢?最好妥善处理错误,并把它们放在你想要的地方
- 不需要使用mysql\u close()
。PHP在执行结束时关闭每个连接
我要回答关于这个答案的评论。您应该仅对字符串使用mysql\u real\u escape\ustrong>string。如果您使用的是
mysql\u real\u escape\u string()
请确保在查询中的字符串周围加上引号(”
):
$query = "SELECT foo FROM bar WHERE name = '".mysql_real_escape_string($_POST['name'])."'";
如果使用整数或任何其他数字,则应使用而不是转义函数:
$query = "SELECT foo FROM bar WHERE id = ".(int) $_POST['id'];
用于防止SQL注入。只有这个功能就足够了
而且,正如@knittl所说,使用预先准备好的语句也是一种很好的预防方法。但是普通的mysql库不支持这一点。你需要一个像PDO或MySQLi这样的图书馆。我建议您切换到PDO或MySQLi,因为在更高的PHP版本中,mysql库将被弃用
改进代码的其他一些技巧:
- 不要使用
。如果你犯了一个错误,你不会死,那为什么要用电脑呢?最好妥善处理错误,并把它们放在你想要的地方die()
- 不需要使用mysql\u close()。PHP在执行结束时关闭每个连接
- 对查询使用错误处理,如果查询返回false,则会出现问题。还要检查查询是否执行了某些操作
我要回答关于这个答案的评论。您应该仅对字符串使用mysql\u real\u escape\ustrong>string。如果您使用的是
mysql\u real\u escape\u string()
请确保在查询中的字符串周围加上引号(”
):
$query = "SELECT foo FROM bar WHERE name = '".mysql_real_escape_string($_POST['name'])."'";
如果使用整数或任何其他数字,则应使用而不是转义函数:
$query = "SELECT foo FROM bar WHERE id = ".(int) $_POST['id'];
我一直在使用PDO,我相信这可以防止注射:
$db_user = "****";
$db_pass= "****";
$dsn = "mysql:dbname=yourdatabasename; host=localhost";
$dbh = new PDO($dsn, $db_user, $db_pass);
$sql = 'INSERT INTO
emails(firstname, lastname, email, title, organization)
VALUES(:firstname,:lastname,:email,:title,:organization)';
$data = array(':firstname'=>$firstname,
':lastname'=>$lastname,
':email'=>$email,
':title'=>$title,
':organization'=>$organization);
$sth = $dbh->prepare($sql);
$sth->execute($data);
我一直在使用PDO,我相信这可以防止注射:
$db_user = "****";
$db_pass= "****";
$dsn = "mysql:dbname=yourdatabasename; host=localhost";
$dbh = new PDO($dsn, $db_user, $db_pass);
$sql = 'INSERT INTO
emails(firstname, lastname, email, title, organization)
VALUES(:firstname,:lastname,:email,:title,:organization)';
$data = array(':firstname'=>$firstname,
':lastname'=>$lastname,
':email'=>$email,
':title'=>$title,
':organization'=>$organization);
$sth = $dbh->prepare($sql);
$sth->execute($data);
-阅读更多关于如何操作以及如何“撤销”仅使用事先准备好的语句的信息。第一步:停止使用mysql_查询,使用PDO或mysqli等现代API。这两种方法都支持预处理语句——如果使用得当,这将大大有助于防止SQL注入。但是,当信息来自表单时,如何使用预处理语句呢?与以前完全相同——阅读更多关于如何执行预处理语句以及如何“撤消”仅使用预处理语句的内容。第一步:停止使用mysql_查询,使用PDO或mysqli等现代API。这两种方法都支持预处理语句——如果使用得当,可以大大防止SQL注入。但是,当信息来自表单时,如何使用预处理语句呢?与以前完全相同,您可以使用mysql\u real\u escape\u string,但前提是您知道自己在做什么。i、 e.仅将其用于引号中的值(但对于每一个这样的值),在客户端(PHP)和服务器/连接端(mysql)上设置正确的编码。有太多的地方你可能错过一件小事,然后再次被拧上。这个功能不是为了防止任何注射。我已经用一些信息更新了我的答案@为什么这个函数不是为了防止SQL注入?从php.net:
如果此函数不用于转义数据,则查询容易受到SQL注入攻击。
您可以使用mysql\u real\u escape\u string,但前提是您知道自己在做什么。i、 e.仅将其用于引号中的值(但对于每一个这样的值),在客户端(PHP)和服务器/连接端(mysql)上设置正确的编码。有太多的地方你可能错过一件小事,然后再次被拧上。这个功能不是为了防止任何注射。我已经用一些信息更新了我的答案@为什么这个函数不是为了防止SQL注入?从php.net:如果此函数不用于转义数据,则查询容易受到SQL注入攻击。