我想问一下是否需要使用html净化器来避免XSS atack:
已经使用的preg_匹配,例如:
$userid = $_POST["userid"]; if(!preg_match("/^[a-zA-Z0-9]{3,15}$/", $userid)){
alerts('INVALID')
alerts是带有开关大小写的功能,可以在URL警报中显示,例如...?alert = invalidid
filter_var($email, FILTER_VALIDATE_EMAIL
我正在使用window.location.href.indexOf('alert') != -1)
,是否需要它以某种方式过滤警报值?
我还与$_GET['alert']
一起使用,以比较URL中实际存在的警报以回显引导程序div class="alert-danger"
。
我需要使用HTML净化器吗?感谢您的回答。在第3种情况下,我不知道该怎么做。
答案 0 :(得分:0)
使用preg_match
这样的验证是一项很好的安全措施,但是您之前的$userid = $_POST["userid"]
行本身就很容易受到攻击。始终确保检查该值是否已设置且未设置null
:
$userid = isset($_POST["userid"] && $POST_["userid"] !== null)
关于您的“ 警报功能,带有切换大小写的功能,可以在URL警报中显示,例如...?alert = invalidid ”,这完全取决于您“显示”的含义,但请注意,用户输入回用户的信息是XSS的主要载体。如果要以HTML内容,HTML属性或JavaScript数据值“显示”它,这是不安全的,那么您只需对以下内容进行编码:
& --> &
< --> <
> --> >
" --> "
' --> ' ' not recommended because its not in the HTML spec (See: section 24.4.1) ' is in the XML and XHTML specs.
/ --> / forward slash is included as it helps end an HTML entity
这取决于您使用的PHP版本。假设您已经高于PHP 5.2.1(肯定已经支持,因为不再受支持),FILTER_VALIDATE_EMAIL
是对电子邮件地址的很好验证。如果您使用的是PHP 5.2.1或更低版本,则为vulnerable。
我不确定为什么。 alert
绝对不是XSS的唯一JavaScript方法。采取,
例如console.log
。
$_GET['alert']
在回显到页面时很容易受到XSS的攻击,但是通过上面列出的六种转换,将不再可能。
使用类似HTML Purifier的方法总是一个好主意。即使您已经完全针对XSS进行了加固,也可以防止自己遭受潜在的未来 XSS漏洞。
我还建议您阅读有关防止XSS的official OWASP guide。
答案 1 :(得分:0)
在尝试将这些值提交到表之前,我会为每个验证设置一个标志〜我假设您要提交这些值:) 使用php激活的弹出窗口,并允许用户使用jquery js关闭弹出窗口。如果有人禁用js并试图弄乱它,只是不会插入或更新,但是告诉他们做错了什么的窗口仍然存在,那么他们将无法关闭它。
<?php
$userid = "";
if (isset($_POST['userid'])) {
$userid = $_POST["userid"];
if (!preg_match("/^[a-zA-Z0-9]{3,15}$/", $userid)) {
$flag = "user id error";
echo "
<div id='user-id-alert'>$flag
<input type='button' value='X' onclick='closePopup()' class='button-close' />
</div>
";
}
}
echo "
<script>
function closePopup() {
var elem = document.getElementById('#user-id-alert');
$('#user-id-alert').hide(200);
return false;
}
</script>
";
?>
我在警报窗口中添加了一个ID,在关闭按钮中添加了一个类,但是没有提供CSS,因为它超出了您的请求范围。