我正在尝试将 javascript 源作为文本保存到 mysql 表。我使用 MEDIUM TEXT 作为数据库中的数据类型。测试时,我注意到如果文本包含alert();要保存到数据库的 textarea 中的任何位置,我将无法成功保存文本。我了解 XSS 漏洞,并认为这可能是服务器提供商的内置预防措施,因此我什至尝试将字符串保存为 base64 编码。在尝试保存源文本时,我仍然收到 403 禁止错误。关于 403 Forbidden 错误的描述是: You don't have permission to access / on this server.$string1 = 'console.log("test");';//successfully saves when attempting to insert into database$string2 = 'alert("boo");';//error 403 Forbidden when attempting to insert into database$string3 = 'alert("boo");';$encstr = base64_encode($string3);//error 403 Forbidden when attempting to insert into database任何想法如何修复或规避?这是我正在使用的新服务提供商 (namecheap),在我的 digitalocean VPS 上运行相同的代码时,我没有收到此错误。更新显示来源:<?phprequire("conn.php");if(isset($_POST["savecode"])){ $getuniqueid = uniqid(); $gettime = time(); $getscriptcode = $_POST["scriptcode"]; $sanitizescriptcode = mysqli_real_escape_string($conn, $getscriptcode); //$sanitizescriptcode = htmlspecialchars($sanitizescriptcode); $sanitizescriptcode = base64_encode($sanitizescriptcode); $insertscript = "INSERT INTO scriptcode (`postid`,`content`,`ttime`) VALUES('$getuniqueid','$sanitizescriptcode','$gettime')"; mysqli_query($conn, $insertscript)or die("Fatal error attempting to save JavaScript"); header("Location: ?id=".$getuniqueid); exit();}?><!DOCTYPE html><html><body><div id="hbanner"><form method="post"><button type="submit" name="savecode" id="savecode" class="btn btn-info">SAVE</button></div><textarea id="scriptcode" name="scriptcode" class="codeinput"></textarea></form></body></html>
1 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
NameCheap 使用ModSecurity
,这是一个 Web 应用程序防火墙(或 WAF)。许多过滤器与防止跨站点脚本有关。(注意:他们的支持可以在帐户级别禁用它,也可以为您将某些规则列入白名单,但您必须直接与他们联系。他们还可以拉取日志来告诉您哪些过滤器正在被命中。)
base64 编码版本实际上可能符合不同的规则,因为恶意软件通常使用它来混淆其恶意代码。另一种可能性是它是 POST 请求中脚本的压力,因此您可以在使用 JavaScript 提交之前尝试使用 base64 编码(使用window.btoa(data)
),然后在 PHP 端使用base64_decode
.
您可以通过注释掉所有代码并查看403
在提交表单时是否仍然得到 a 来测试它是否处于 MySQL 级别。
如果它在 SQL 级别,您可以尝试传递一个带有一些不会出现在您的字符串中的已知分隔符的分块字符串,然后在 SQL 中将其替换掉。例如,这样的事情:
$insertscript = "INSERT INTO scriptcode (`postid`,`content`,`ttime`) VALUES('$getuniqueid',REPLACE('" . mysqli_real_escape_string($conn,chunk_split($_POST['scriptcode'],4,"†")) . "','†',""),'$gettime')";
在这个例子中,chunk_split
每 4 个位置插入一个特殊字符,然后 MySQLREPLACE
函数在查询已经发送到数据库服务器后将它们剥离出来。
请记住,这非常笨拙且效率低下——我只是想提供一些不涉及支持的潜在解决方法。
- 1 回答
- 0 关注
- 161 浏览
添加回答
举报
0/150
提交
取消