关于php:如何防止XSS和SQL注入

How to prevent against XSS and SQL injection

本问题已经有最佳答案,请猛点这里访问。

我想检查用户的数据以进行XSS和SQL注入,这就是我尝试的方式

1
2
3
4
5
6
if (isset($_GET['membernumber']))
{
    $mem = htmlentities($_GET['membernumber']);
    $memberparamter = cleanData($mem);

}

但哪种方法是检查的最佳/正确方法?

方法1

1
2
3
4
5
6
7
8
9
function cleanData($data)
    {
        $data=mysql_real_escape_string($data);
        $data=trim($data);
        $data=stripcslashes($data);
        $data=htmlspecialchars($data);
        $data=strip_tags($data);
        return $data;
    }

方法2

1
2
3
4
5
6
7
function cleanData($data)
    {
        $data=mysql_real_escape_string($data);
        $data=trim($data);
        $data=strip_tags($data);
        return $data;
    }

方法3


如前所述,准备好的语句是防止SQL注入的最佳方法之一。即,您不应将参数添加为最终查询字符串的一部分。您应该使用参数占位符,并通过键/值数组添加参数。

如果您正在使用PDO,请查看此页面,其中更详细地描述了预准备语句:

http://php.net/manual/en/pdo.prepared-statements.php

可以在此处找到有关PHP输入过滤器的详尽解释(以及关于清理的好文章):

http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/

在这里查看PHP自己的过滤器/清理功能:

http://www.php.net/manual/en/filter.filters.php

您可能对filter_var和filter_input函数感兴趣:

  • http://www.php.net/manual/en/function.filter-var.php
  • http://www.php.net/manual/en/function.filter-input.php

此外,这个问题有一些很好的指示:
用PHP清理用户输入的最佳方法是什么?

这个问题也有很好的指示:
什么是最好的PHP输入清理功能?


如果要防止SQL注入攻击,请使用预处理语句。当你做类似的事情

1
SELECT * FROM TABLE WHERE id = $_GET['x']

此查询的问题是该变量被视为SQL语句的一部分。这意味着DBMS将解析/编译和执行变量以及查询的其余部分。如此有效,我可以提供类似的东西

1
$x ="1); DROP TABLE users;"

并且由于它是语句的一部分,服务器将执行该命令。

引入预准备语句时,变量作用域将限制在参数范围内,即使未进行转义,也不会影响查询的其余部分。这是因为数据库对SQL语句进行了解析/优化/编译等操作,您只需绑定参数即可。 sql语句是一个模板。

1
SELECT * FROM TABLE WHERE id = ?

使用预准备语句的附加优势是速度。由于模板已经被解析/编译等,因此数据库不需要重复该过程,因此可以重复使用,您只需要替换参数即可。

在PHP中,PDO和mysqli_ *函数都支持预处理语句。

对于mysqli,请参阅http://php.net/manual/en/mysqli.prepare.php
对于PDO,请参阅http://php.net/manual/en/pdo.prepare.php

对于XSS攻击,您可以采取一些方法。第一种是在打印到页面时简单地转义任何用户输入。如此危险的角色如:

1
 <>"" // and so on

将替换为他们的html实体等效。所以在的情况下,它将被转换为<script>

您还可以设置白名单方法,只允许X标记用于用户输入。这对于面向内容的站点尤其有用,在这些站点中,用户可能需要访问某些html标签,例如div,p标签等,而不是脚本标签。任何不在白名单中的标签都将被过滤掉。这很难完全覆盖,因为有很多方法可以做,但它可以提供额外的安全性。有关更多信息,请参见http://php.net/manual/en/function.filter-var.php。

第三种方法是用自定义标签替换html标签(比如SO)。因此,一个单词前面的明星可能代表 html标签,依此类推。

请注意,如果您确实占用了后两者,那么您仍然应该逃避数据。所有用户输入数据都应该被认为是有潜在危险的,即使是经过筛选也是如此,因为正如他们所说的那样,总是有不止一种方法可以对猫进


它们都不够有效。

你应该像你一样寻找消毒并使用准备好的陈述。


XSS
$数据=用htmlspecialchars($数据);
sql注入
$数据= stripcslashes($数据);

如果数据将存储到数据库然后显示在网页上,那么你应该同时使用它们。