昨晚斗鱼苞米没有直播,无聊的我只能打开csdn good good study daydayup了。看到一篇将安全的博文,今天试试自己小站的安全性如何(应该是一点都不安全。。)
此前开发就用过一个密码加密,对于sql注入和xss攻击,倒是没做过什么对应措施
危害:
sql注入:会窃取数据库的内容
xss攻击:可以窃取前端的cookie内容
(等等,学会了这个我是不是可以?哦?!踩缝纫机了?!!呜呜呜,后半生有着落了)
一.xss攻击:在页面中夹杂js代码来获取网络信息
比如在在输入框输入<script>alert(1)</script>会弹出框,相当于你的页面的js用户可以diy了
上面是参考文章里的up的使用例子。我这边在我的小站试试
诶?怎么没什么用?说明什么?说明我理解的不够到位。。
我这边查询了看看。发现span有个什么data-v-巴拉巴拉属性,由vue.js生成,解析html的时候会忽略script标签,
然后我原生重写了一个简单的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XSS 示例</title>
</head>
<body>
<!-- 假设这里是一个用户输入的地方 -->
<form>
<label for="comment">输入您的评论:</label><br>
<textarea id="comment" name="comment"></textarea><br>
<button type="button" onclick="postComment()">提交评论</button>
</form>
<!-- 显示用户的评论 -->
<div id="comments"></div>
<script>
function postComment() {
var comment = document.getElementById("comment").value;
var commentElement = document.createElement("div");
commentElement.innerHTML = "用户评论:" + comment;
document.getElementById("comments").appendChild(commentElement);
}
</script>
</body>
</html>
但发现还是没有效果,发现是当前浏览器会自动过滤一些简单的XSS攻击情况。
在篇尾的文章中有提到用xss包修改配置来实现防止xss的攻击
二.sql注入
以前也没怎么接触过,我直接将我的代码丢进gtp让他帮我看看我的code有没有sql注入的风险。
exports.addArticleCates = (req, res) => {
// 定义查询 分类名称 与 分类别名 是否被占用的 SQL 语句
const sql = `select * from ev_article_cate where name=? or alias=?`
// 执行查重操作
db.query(sql, [req.body.name, req.body.alias], (err, results) => {
这段代码存在 SQL 注入的潜在风险。虽然在查询数据库时使用了参数化查询,即在 SQL 语句中使用了占位符 ?,并将用户输入的值通过参数传递给 db.query 函数,但在执行新增文章分类的 SQL 语句时,却直接将 req.body 对象作为参数传递给了 db.query 函数,而没有进行充分的验证和转义。
由于 req.body 是用户提交的数据,恶意用户可以在其中插入 SQL 语句,导致 SQL 注入攻击。例如,如果恶意用户在 req.body 中添加了恶意的 SQL 语句片段,那么这些语句片段将被直接拼接到 SQL 查询语句中,从而执行恶意操作,比如删除数据库中的数据或者获取敏感信息。
要解决这个问题,应该对用户输入的数据进行严格的验证和转义,或者使用 ORM(对象关系映射)工具,如 Sequelize 或 TypeORM,来构建安全的 SQL 查询语句。这样可以避免直接拼接用户输入到 SQL 查询语句中的风险。
我理解了一下,就是比如我的sql语句为select * from ev_article_cate where name=? or alias=?
我的这个?正常是个name,但是输入有可能被人恶意改为
{ "cate_name": "name'; DROP TABLE article_categories;", "cate_alias": "science" }
那么sql语句就变成了select * from ev_article_cate where name='Science'; DROP TABLE article_categories;'OR alias='science'
那我又问了个问题,也就是我的表名正常情况是不可能有人知道的,所以应该是安全的吧
您提出了一个重要的观点。在典型的 SQL 注入攻击中,攻击者通常不会知道表的确切名称,因此他们无法直接执行诸如 DROP TABLE 这样的破坏性操作。
在真实的应用程序中,表名和数据库结构通常是保密的,攻击者无法轻易获取这些信息。因此,即使在注入了恶意代码的情况下,通常也很难直接针对数据库执行破坏性操作。
然而,攻击者可能会试图利用注入漏洞来窃取敏感数据、绕过身份验证或执行其他不良行为。因此,即使攻击者无法直接删除表,SQL 注入仍然可能会对应用程序的安全性造成严重影响。
综上所述,尽管攻击者可能无法直接执行 DROP TABLE 这样的操作,但仍然应该严格防范 SQL 注入攻击,以保护应用程序和数据的安全性。
但是这样看这样的sql方式与代码肯定是有问题的了。
然后问了ai一大堆,发现他的理解有错误,
const sql = `SELECT * FROM article_categories WHERE name='${name}' OR alias='${alias}'`;
db.query(sql, (err, results) => {
当代码为这种例子的时候才会出现上述说的问题,我的那部分代码是进行转义的,
它们被作为参数传递给了查询语句 checkSql
中的占位符 ?
。这样,即使用户输入了恶意代码,例如 "Science'; DROP TABLE article_categories;"
,它也会被当作普通的字符串处理,而不会被解释为 SQL 代码的一部分。
参考文章:【Node.js实战】一文带你开发博客项目之安全(sql注入、xss攻击、md5加密算法)
标签:语句,xss,name,sql,SQL,注入 From: https://blog.csdn.net/qq_52368602/article/details/139315710