2011-05-11 153 views
4

我已经阅读了很多关于过滤用户输入的文章,但大多数时候答案是,这取决于你在做什么。下面是我在做什么:过滤用户输入

function clean($field, $link) 
{ 
    return mysql_real_escape_string($field, $link); 
} 

通过将显示后面的HTML/PHP页面或在表单提交的数据:

通过,将在MySQL查询使用的形式提交的数据电子邮件:从数据库

function output_html($value) 
{ 
    return stripslashes(htmlspecialchars($value)); 
} 

数据显示:

function output_db($value) 
{ 
    return stripslashes($value); 
} 

这是足以让我ñ电火工品?有什么我不考虑?

谢谢!

+0

你问的应用程序的安全性,即SQL注入? – 2011-05-11 15:42:54

+0

@ robert-harvey SQL注入,并通过JS等将代码添加到我的页面 – NightHawk 2011-05-11 15:47:30

+1

'output_db'表明你做错了。如果您正确地转义了您的内容,并且没有启用superflous magic_quotes,那么在数据库查询之后不需要stripslashes()。 http://php.net/manual/en/security.magicquotes.disabling.php – mario 2011-05-11 16:16:34

回答

5

将字符串插入SQL查询时使用mysql_real_escape_string(),无论输入来自何处。

使用htmlspecialchars()htmlentities()将字符串插入HTML代码时,无论输入来自何处。

将值插入URL的查询字符串时使用urlencode(),无论值来自哪里。

如果这个数据来自用户,那么你应该做这些事情,因为有可能用户试图做坏事。但除了安全性 - 如果你想插入一个合法的字符串到一个SQL查询和字符串恰好有一个单引号字符呢?你仍然必须逃避它。

+0

这可能听起来像一个愚蠢的问题,但只是为了澄清,urlencode()是否适用于由表单自动生成的查询字符串?值被硬编码到表单中,所以我猜没有什么需要做,但我只是想澄清。谢谢

Sarah 2015-02-13 15:49:16

+0

@Sarah好问题。使用“

”提交的值自动由浏览器进行URL编码。例如,在您的表单中,当用户单击提交按钮时,浏览器的“search_content”文本的值将由浏览器进行URL编码。 – Michael 2015-02-15 16:00:04

+0

这是伟大的..谢谢澄清:D – Sarah 2015-02-15 17:43:50

2

如果你刚开始,我会真正考虑使用类似PDO的东西。你最终会希望以这种方式迁移,那么为什么不现在就开始。

PDO将自动清理您的输入,这很好。它也会使用prepare()语句,这样就保证了一个单一的查询,从而防止有人用“DROP TABLE xxx”进行攻击。或者这样。

http://php.net/manual/en/book.pdo.php

1

如果你有能力,我会建议使用,而不是MySQL的库MySQLi,并利用准备好的语句:

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

来源:http://php.net/manual/en/mysqli.prepare.php

这提供了基本的类型检查,确实为你逃跑。我不会对输出DB数据建议stripslashes因为:

  1. DB数据可以有斜线以他们为你反正

  • 数据库反转义至于显示HTML,还有htmlstriptags这可以去掉那些试图用标签和类似东西变得可爱的人。

  • 2

    将数据插入到SQL数据库中时,需要将其转义以防止SQL注入,并且mysql_real_escape_string()在mysql中适用。尽管如此,你必须记住把它用于所有事情,所以它很容易出错。您应该使用类似PDO的东西,它会自动转义每个传入的值。

    从数据库中获取的数据通常不需要任何特殊处理(即避免失败)。我不知道您在那里用stripslashes()做什么。如果是为了移除PHP插入的魔术引号,你应该在那里从GET/POST/etc中提取用户提供的值。 (或者完全禁用魔术引号,如果可以的话,并且没有任何其他依赖它的软件)

    数据传出到html需要被转义以防止XSS。 htmlspecialchars()是正确的功能。再次,我不知道你想用什么stripslashes()。再次,你需要记住逃避每个值,这是容易出错的。您至少应该考虑使用模板引擎或其他能够自动转义所有html值的其他功能。

    +0

    嗨,感谢您的这些信息:)我只是想澄清,是htmlspecialchars()唯一的安全措施,我需要做的变量输出到HTML?当你说错误倾向时,你的意思是它可能无法正常工作,因此不是100%安全的?你知道哪些模板引擎可用?谢谢,sarah – Sarah 2015-02-14 21:36:32

    +0

    @Sarah:这是你内部数据元素唯一需要的东西。 (当然,如果你把任意的用户内容放在一个脚本元素中,你仍然被搞砸了)我的意思是容易出错是因为很容易忘记在任何地方使用它,如果你甚至在一个地方忘记它,你'被拧紧了。如果您需要将用户定义的内容放在属性中(例如.href),则需要做的不仅仅是这些,因为恶意用户可以输入例如。 '的JavaScript:whatever'。例如。对于href,你可能只想列出一些允许的协议,因为浏览器允许“javascript:”的各种变体工作。 – 2015-02-15 06:32:56

    +0

    谢谢你的解释。我可以问你,在href属性方面..是只有在用户定义的情况下?..在我的项目中,我从facebook检索json数据并在php中使用该数据,将此数据插入到href属性和其他元素。但在这种情况下,它全部来自Facebook,没有任何来自用户。我需要在将这些数据插入到我的html之前对这些数据执行安全措施还是安全?谢谢... – Sarah 2015-02-15 15:37:01

    0

    我会推荐你​​使用php 5.2中引入的过滤器,它们很棒,可以节省你大量的数据验证和sanatization。这里检查

    filter_input