通过PHP输入安全

时间:2011-10-08 15:31:07

标签: php security input

我不确定,我怎么能用字符串真正做出安全的输入。

例如我得到了:

$id = intval($_POST['id']);
$name = $_POST['name'];
$sql->query("UPDATE customers SET name = " . $sql->escape_string($name) . " WHERE id = {$id}");

我确信$name不够安全。如何保护它,防止XSS漏洞?

亲切的问候, 气旋。

5 个答案:

答案 0 :(得分:5)

XSS保护应该在输出端完成,而不是在存储介质(数据库)上完成。数据库不知道数据的显示位置。如果要存储的数据是文本(在本例中为$name),则应将其存储为文本而不是HTML。

如果您真的想要删除可能的HTML标记,请使用$name = strip_tags($_POST['name']),但正确的方法是阻止XSS漏洞使用htmlspecialchars(或htmlentities在输出端转义它)。

如果您想使用PHP过滤器函数,这是一个删除HTML标记的示例:

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);

PHP文档:

答案 1 :(得分:1)

XSS与您的数据库无关,主要是。

  

跨站点脚本(XSS)是一种计算机安全性   通常在启用的Web应用程序中发现的漏洞   攻击者将客户端脚本注入其他人查看的网页中   用户。

也许您指的是SQL注入?您已经转义了输入,您可以通过将变量转换为适当的类型来进一步清理它。

答案 2 :(得分:0)

在安全方面,我一直认为尽可能严格,但没有更严格的意义。如果在将名称插入数据库之前可以确定名称无效,那么为什么不拒绝呢?

是否有人在其中包含带有HTML标记的名称?可能不是。但撇号或连字符怎么样?当然。

考虑到这一点,让我们看看有效名称是什么样的:

  • 字母
  • 空间
  • 撇号
  • 连字符
  • 期间(姓名缩写)

现在您已确定了有效名称的样子,请拒绝所有不符合此条件的名称:

/* If the input contains any character that is not a capital letter, 
   a lowercase letter, whitespace, a hyphen, a period, or an apostrophe, 
   then preg_match with return true. */
if (preg_match('/[^A-Za-z\s\-\.\']/', $_POST['Name']))
{
    // Invalid name
}
else
{
    // Valid name
}

答案 3 :(得分:0)

您提供的代码旨在再次保护SQL注入攻击,而不是XSS攻击,这是完全不同的事情。

SQL注入是攻击者使用SQL代码以您不想要的方式将数据输入或输出数据库的地方。正如你正在做的那样正确地转义SQL字符串将减轻这一点。 (也就是说,我从你的代码中不知道$sql对象是什么类,因此我不能告诉你$sql->escape_string()是否是一个足够的保护;我认为它是,但是需要要了解更多关于对象的信息)

XSS(“跨站点脚本”)攻击是攻击者设法将HTML,CSS或Javascript代码放入您的页面的地方,导致后续页面加载显示不需要的内容。

攻击者可以通过多种方式实现这一点,但通常应确保应对用户输入的任何数据进行过滤,以防止其包含HTML,CSS或JS代码。如果是这样,您应该完全剥离代码或使用HTML转义(PHP的htmlentities()函数和类似的)以确保以安全的方式显示它。

您目前在我们向您展示的代码中没有采取任何措施来防止这种情况,但同样来自您向我们展示的代码,我们无法判断这些数据是否需要针对XSS攻击进行保护。这将取决于何时以及如何使用。

答案 4 :(得分:0)

为了在将条目放入sql之前清理条目,我总是这样做:

trim($string) // Cuts off spacing and newlines in the beginning or end

mysql_real_escape_string($string) // prevents SQL injections

注意:sql查询字符串的任何部分都可以是mysql_real_escape_string'd。整个字符串不一定是;只要有部分转义,查询就会安全无法注入。