2012-07-25 58 views
1

可能重复:
Best way to prevent SQL Injection in PHP何时使用mysqli_real_escape_string?

我想知道有关SQL注入,想知道何时使用mysqli_real_escape_string。

每次我在查询中有WHERE子句时,是否需要使用它?

+0

你需要转义特殊待遇SQL查询中可能包含有害字符的所有参数。用户输入尤其如此。 – nickb 2012-07-25 15:23:58

+0

你应该几乎总是使用绑定参数,而不是mysqli_real_escape_string – Quentin 2012-07-25 15:24:18

回答

2

对于来自用户或不能被信任的任何数据,您应该使用mysqli_real_escape_string。

0

如果在查询 中包含$ _REQUEST“vars”,则必须使用它。

$query = "UPDATE foo set bar = '{$_GET['var']}' ..." 

$query = "INSERT INTO foo ('{$_POST['var']}',) ..." 

$query = "SELECT bla from foo WHERE bar = '{$_COOKIE['var']}'" 

每本querys必须mysqli_real_escape_string提供打针......

+0

你的意思是我必须使用mysqli_real_escape_string,即使在更新语句的值如下:'$ query =“UPDATE foo set bar = mysqli_real_escape_string($ _ GET ['var']) ...“,也在WHERE子句中,例如:'$ query =”从foo中选择bla WHERE bar = mysqli_real_escape_string($ _ COOKIE ['var'])“'? – jaypabs 2012-07-26 01:27:03

0

您使用mysqli_real_escape_string或它的任何变化,以确保数据形成任何用户输入字段正确转义。

例如,您的表单只有几个输入。您点击提交,数据将作为请求发送到您的PHP脚本。在脚本中,您可以将用户发布的值插入到数据库中。

如果用户键入以下内容输入域用户登录,例如:

' WHERE `username` = {x} AND password > 1; 

有潜力让该人都从你正在使用的表中的数据。使用:

mysqli_real_escape_string($input) 

将产生上述为:

\' WHERE `username` = {x} AND password > 1; 

上的逃逸字符串'将停止工作可能的SQL注入攻击。

也就是说,没有理由应该使用mysqli_real_escape_string()作为PDO和绑定参数在偏转大量不同的SQL攻击/注入方法方面要优越得多。学习并使用它!

编辑,由于评价

%_也需要超越mysqli_real_escape_string()

function escape_extra_chars ($string) 
{ 
    $string = preg_replace("/\%/", "\%", $string); 
    $string = preg_replace("/\_/", "\_", $string); 

    return $string; 
} 

除了反正那些线(即FUNC是未经测试)

+0

嗨,我实际上使用我的另一个脚本准备好的声明,但因为我已经将大部分脚本从mysql移植到mysqli我有很多使用传统编程的sql语句。所以不是使用准备好的语句,而是决定使用mysqli_query而不是修改我的所有代码来使用准备好的语句。所以在此期间使用如下代码是安全的:'mysqli_real_escape_string($ _ POST ['username'])'? – jaypabs 2012-07-26 01:20:30

+0

@jaypabs是的,你可以像这样使用它,它将提供一个安全级别,但它不会转义包含特殊字符的字符串:在LIKE子句中使用'%'和'_'。由于它们通常包含在查询中的双引号内,所以它们仍然是风险的。 (请参阅我的答案中的推荐信息) – 2012-07-26 08:35:24

+0

这是否意味着我们确实需要使用准备好的语句?发生了什么'mysqli_query'? 'mysqli_query'已经没用了吗? – jaypabs 2012-07-26 08:38:11

相关问题