2014-09-23 61 views
-1

我正在制作一个网站,它有一个注册表单。在注册表单我注意到,用户可以在HTML像输入:如何阻止用户名拥有html

<div style = 'color:red;font-size:30px;'>Bob</div> 

我知道,我可以使用htmlspecialchars()但是当它被插入到数据库中它保持的HTML的字符串中。所以我的问题是:

我可以检测字符串中是否有任何html,然后,如果有,请他们输入一个新的用户名?

我正在寻找PHP或JavaScript来做到这一点。

+0

你在问如何过滤输入。通常,另一种选择是对输出进行编码(尽管它可能不适用于此)。 Jim Manico(OWASP网络安全忍者)建议输出编码而不是输入过滤。这是因为攻击者经常可以旁路过滤和黑名单。但攻击者无法控制或规避应用于其输入的输出编码。 – jww 2014-09-23 23:22:08

回答

11

使用strip_tags()这将删除所有的HTML标签

因此,如果$_POST['username'] = <div style = 'color:red;font-size:30px;'>Bob</div>strip_tags($_POST['username']) = Bob。如果您还添加trim()它也将删除剩余的空间。

更新

乔Frambach指出,如果你想知道如果用户名包含HTML使用:

if (strip_tags($name) !== $name) { 
    echo 'this contains html'; 
} else { 
    echo 'this does not contain html'; 
} 

所以如果剥离值不等于它包含html的输入值。

+1

他说*我可以检测是否存在是字符串*中的任何html,而不是如何清理字符串 – Yang 2014-09-23 18:10:03

+4

ok,然后'if(strip_tags($ name)!== $ name){它是无效的}' – 2014-09-23 18:10:35

+0

@Joe确切地说,这就是答案。你应该发布它 – Yang 2014-09-23 18:11:14

4

验证字段是字母数字:

if(preg_match('/^[a-zA-Z]+[a-zA-Z0-9._]+$/', $input)){ 
    //Valid 
} 
else{ 
    //invalid 
} 
+1

如果用户用另一种语言输入他的名字会怎么样?那意味着也是无效的?这不是一个解决方案。这是有点跛脚的解决方法 – Yang 2014-09-23 18:07:50

+1

该字段是用户名,而不是实名。 – 2014-09-23 18:08:30

+0

这些限制可以通过简单地使用'\ w'正则表达式转义序列_in php_来解决(JavaScript对'\ w'和'\ d'使用ASCII,而'\ s'使用ASCII) – 2014-09-23 18:13:06