所以我有一个网站,用户可以使用他们选择的用户名进行注册,并可以提交大量文本并添加评论.目前,为了避免使用XSS,我在输入数据的数据上使用strip_tags,我只输出正文中的数据,而不是属性.我目前正在对网站进行更改,其中之一是创建一个用户页面,当用户点击用户名(链接)时加载该用户页面.这看起来像:
<a href="example.com/user/<?php echo $username; ?>">...</a>
Run Code Online (Sandbox Code Playgroud)
我担心$ username变量,有人可以插入
<a href="example.com/user/user" onClick="javascript:alert('XSS');">...</a>
Run Code Online (Sandbox Code Playgroud)
我已经阅读了其他一些SO帖子,但没有一个给出了黑白回答.如果我在输出的所有文本上使用以下内容,除了输入上的strip_tags:
echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)
是否足以阻止所有XSS攻击,包括那些使用内联javascript:语法的攻击?
另外,有没有办法删除实际的HTML标签而不删除像"我>你"这样的东西?
谢谢!
我的用户可以在我的数据库中插入任何内容.
因此,使用白名单/黑名单字符不是一种选择.
我并不担心(覆盖它)关于数据库端(SQL注入),而是我的页面中的代码注入.
是否有任何情况htmlspecialchars()不足以阻止代码注入?
我知道还有其他方法只能转义单引号(比如这个答案),但在我看来应该有一种方法可以使用htmlspecialchars().
根据手册,它应该是它们常量的某种组合,但根据它们的解释,我看不到它.
有可能只逃避单引号,只留下双引号htmlspecialchars()吗?
同时使用htmlspecialchars和htmlentities会导致™符号甚至单'引号等项目的空白输出.显然,这绝对是无用的,但是在不使用html字符的情况下输出数据会导致这两个符号都出现.出现这种情况的原因是什么?
这是导致问题的代码:
<p>
<?php
echo nl2br(htmlspecialchars($aboutarray[0]['about_us'], ENT_COMPAT, "UTF-8"));
?>
</p>
Run Code Online (Sandbox Code Playgroud) 我想将一些html特殊字符发送到文本字段,然后使用javascript将其恢复为原始格式:如果我发送"&pi",它将在文本输入上显示"π",当我使用javascript时得到它,我应该得到"&pi",但我只能得到"π",而不是"&pi".请帮忙,我的代码如下:
<script type="text/javascript">
function qpush(a) {
document.getElementById('input').value += a;
}
function show(a) {
alert(document.getElementById('input').value);
}
</script>
<input type="text" id="input" />
<input type="button" onclick="qpush('π');" value="π" />
<input type="button" onclick="show()" value="go" />
Run Code Online (Sandbox Code Playgroud) html javascript escaping special-characters htmlspecialchars
当然,之前已经提出了这个问题并且已经找到了解决方案,所有这些解决方案迄今为止都没有用 我想通过使用htmlentities或更改TM符号和&符号到他们的html equivelents htmlspecialchars:
$TEST = "Kold Locker™ & other stuff";
echo "ORGINIAL: " . $TEST . "<BR/>";
echo "HTML: " . htmlentities($TEST, ENT_COMPAT, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)
这显示:
ORGINIAL: Kold Locker™ & other stuff
HTML:
Run Code Online (Sandbox Code Playgroud)
我也尝试过,htmlspecialchars第二个参数改变了相同的结果.
我错过了其他人声称在其他解决方案中工作的内容?
更新:我尝试只显示utf8_encode($TEST)并显示HTML: Kold Locker™ & other stuff
我有一个php 5.4/ mysql每天5万次点击的网站,有一个Linux服务器上运行nginx和php-fpm.数据库位于单独的服务器上.
我注意到,在高峰时段,我的网络服务器负载最多为15,而四核处理器则为4.我用php xdebug和xhprof描述了我的php应用程序,并看到,90%的CPU工作是由htmlspecialchars()Twig我用来显示数据的模板中的函数完成的.htmlspecialchars()每页有时会有100到1000个电话.我试图减少无法逃避,但仍然无法避免.
有什么方法可以减少htmlspecialchars()功能的CPU使用率吗?也许在PHP中存在某种缓存?还是有另一种方式?
基本上在显示来自MySQL数据库的数据时,我有一个htmlspecialchars()函数,它应该将单引号和双引号转换为它们的安全实体.我遇到的问题是查看源代码,它只在转换< > &时才需要转换单引号和双引号.
//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
Run Code Online (Sandbox Code Playgroud)
然后当我想用我做的时候:
htmlsan($row['comment']);
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么它不会转换单引号和双引号吗?
UPDATE
有什么奇怪的htmlsan()是用在电子邮件中的评论中,当我查看电子邮件的源代码时,它会转换它们,似乎它不会在网页上显示时转换数据库中的单/双引号.我的数据库排序规则也设置为utf8_general_ci,我声明我在数据库连接等上使用utf8.
将文件保存在ISO-8859-1中并使用该命令时
echo "test: ".htmlspecialchars("äöü");
Run Code Online (Sandbox Code Playgroud)
返回将只是"测试:".
这是因为htmlspecialchars的标准字符集在PHP5.4中更改为UTF-8.您需要显式设置charset:
echo "test: ".htmlspecialchars("äöü", ENT_COMPAT | ENT_HTML401, 'ISO-8859-1');
Run Code Online (Sandbox Code Playgroud)
PHP5.4中是否还有其他功能,如果你没有设置charset,它将不再正常工作?
我无法使用C++中的tolower()函数将字符串转换为小写.使用普通字符串时,它会按预期工作,但不会成功转换特殊字符.
我如何使用我的功能:
string NotLowerCase = "Grüßen";
string LowerCase = "";
for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
LowerCase += tolower(NotLowerCase[i]);
}
Run Code Online (Sandbox Code Playgroud)
例如:
你可以看到,3和4没有按预期工作
我该如何解决这个问题?我必须保留特殊字符,但是小写.
htmlspecialchars ×10
php ×8
html ×3
escaping ×2
c++ ×1
cpu-usage ×1
javascript ×1
performance ×1
security ×1
strip-tags ×1
twig ×1
xss ×1