我不确定,我怎么能用字符串真正做出安全的输入。
例如我得到了:
$id = intval($_POST['id']);
$name = $_POST['name'];
$sql->query("UPDATE customers SET name = " . $sql->escape_string($name) . " WHERE id = {$id}");
我确信$name
不够安全。如何保护它,防止XSS漏洞?
亲切的问候, 气旋。
答案 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。整个字符串不一定是;只要有部分转义,查询就会安全无法注入。