2012-08-15 64 views
1

在我的登录表单1散列用户名和密码之前,我执行查询防止SQL注入通过转换字符串数组

... ...类

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注入?谢谢

+7

请勿使用addslashes()。如果您使用PDO或mysqli使用数据绑定功能。如果你正在使用mysql_ *函数(你不应该)使用mysql_real_escape_string()。 – bobwienholt 2012-08-15 21:31:24

+0

使用[mysql函数来转义字符串](http://ua2.php.net/manual/en/mysqli.real-escape-string.php)或PDO库(我个人比较喜欢) – pinepain 2012-08-15 21:33:24

+0

@sudowned我觉得呕吐。 – 2012-08-15 21:41:08

回答

5

不要相信你自己的能力来防止SQL注入!比你的头更好的头已经落到了它的头上。

使用mysqli或PDO和参数化查询。这也有利于您的数据库缓存查询计划。

+0

更多评论比回答恕我直言。 – hakre 2012-08-15 21:34:43

+1

有时你不能说“这是一种安全的方式来做这件令人难以置信的不安全的事情。” – 2012-08-15 21:35:54

+5

+1:他们总是试图重新发明轮子的极客们是什么? – MatBailie 2012-08-15 21:36:21

0

有一些可以采取使代码更安全非常简单的步骤:

$query= mysqli_real_escape_string($database_connection, $user) 

这个逃逸的任何危险字符会反过来在这个步骤中,我们增加SQL字符串

$query = mysqli_real_escape_string($database_connection, trim($user)) 

影响修剪功能取出任何白色空格 - 用于启动SQL注入攻击

您可以看到更多关于此的信息here

0

另外,您可以将其转换为二进制:

function mssql_escape($data) { 
    if(is_numeric($data)) 
     return $data; 
    $unpacked = unpack('H*hex', $data); 
    return '0x' . $unpacked['hex']; 
} 

...如果万一你不在mysql分贝。