Php 通过将字符串转换为数组防止sql注入
在我的登录表单中,我在执行查询之前对用户名和密码进行哈希运算 。。。类Php 通过将字符串转换为数组防止sql注入,php,sql,sql-injection,Php,Sql,Sql Injection,在我的登录表单中,我在执行查询之前对用户名和密码进行哈希运算 。。。类 private $username; private $password; protected function Login(){ $user = hash('sha256', $this->username); $pass = hash('sha256', $this->password); $this query = "..." ... } 在其他类型的表单(如搜索表单)中,
private $username;
private $password;
protected function Login(){
$user = hash('sha256', $this->username);
$pass = hash('sha256', $this->password);
$this query = "..."
...
}
在其他类型的表单(如搜索表单)中,我将字符串转换为数组,然后执行查询,这样查询将如下所示:
$searchstring = explode(' ', $search);
//.... Some lines of PHP code... and the resulting query is: ...
$this->query = "SELECT... WHERE name LIKE 'DELETE%' OR name LIKE 'FROM%' ";
$this->query.= " OR name LIKE 'USERS%' OR name LIKE 'WHERE%' OR name LIKE '1%'";
这足以防止sql注入吗?谢谢不要相信自己有能力阻止SQL注入!许多比你更聪明的人都爱上了它
使用mysqli或PDO和参数化查询。这样做的另一个好处是允许数据库缓存查询计划。不要相信自己有能力阻止SQL注入!许多比你更聪明的人都爱上了它
使用mysqli或PDO和参数化查询。这样做的另一个好处是允许数据库缓存查询计划。您可以采取一些非常简单的步骤来提高代码的安全性:
$query= mysqli_real_escape_string($database_connection, $user)
这将转义可能对SQL字符串产生不利影响的任何危险字符
$query = mysqli_real_escape_string($database_connection, trim($user))
在这一步中,我们添加了trim函数,该函数去掉了所有空格,这些空格用于发起SQL注入攻击
您可以看到有关此的更多信息您可以采取一些非常简单的步骤来提高代码的安全性:
$query= mysqli_real_escape_string($database_connection, $user)
这将转义可能对SQL字符串产生不利影响的任何危险字符
$query = mysqli_real_escape_string($database_connection, trim($user))
在这一步中,我们添加了trim函数,该函数去掉了所有空格,这些空格用于发起SQL注入攻击
您可以查看有关此的更多信息或者您可以将其转换为二进制:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
。。。如果您不在
mysql
db.上,也可以将其转换为二进制:
function mssql_escape($data) {
if(is_numeric($data))
return $data;
$unpacked = unpack('H*hex', $data);
return '0x' . $unpacked['hex'];
}
。。。如果您不在mysql上,请不要使用addslashes()。如果使用PDO或mysqli,请使用数据绑定功能。如果您使用的是mysql_*函数(您不应该使用),请使用mysql_real_escape_string()。使用或PDO library(我个人更喜欢)@sudowned,我想呕吐。为什么要散列用户名?我本以为那会增加碰撞的风险?此外,您应该与进行检查,但通常的建议是添加一个salt,在对密码进行哈希运算之前,您需要先检索它(基本上是从密码记录中检索)。哈希用户名至少是荒谬的,将所有内容进行哈希运算,然后使用随机salt进行加密,这样您就永远不会知道谁是谁。不要使用addslashes()。如果使用PDO或mysqli,请使用数据绑定功能。如果您使用的是mysql_*函数(您不应该使用),请使用mysql_real_escape_string()。使用或PDO library(我个人更喜欢)@sudowned,我想呕吐。为什么要散列用户名?我本以为那会增加碰撞的风险?此外,您应该检查,但通常的建议是添加一个salt,在对密码进行哈希运算之前,您需要检索它(基本上是从密码记录中检索)。哈希用户名至少是荒谬的,散列所有内容并用随机盐加密,这样你就永远不会知道谁是谁。更多的是一个评论而不是一个答案。有时候你不能说“这是一种安全的方式来做你正在做的非常不安全的事情。”+1:极客们总是试图重新发明方向盘的原因是什么?是的,无论如何我都会恢复我的观点,因为其他答案非常糟糕。这里的重要部分是参数化查询,因为它们很好。更多的是评论而不是回答。有时你不能说“这是一种安全的方式来做你正在做的非常不安全的事情。”+1:极客们总是试图重新发明轮子的原因是什么?是的,我无论如何都会恢复我的观点,因为这些其他答案非常糟糕。这里重要的部分是参数化查询,因为它们很好。