个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范...

news/2024/5/20 5:35:30/文章来源:https://blog.csdn.net/weixin_30614587/article/details/99565336

昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷……其实攻击者进攻的手法很简单,没啥技术含量。只能感叹自己之前竟然完全没防范。

这是数据库里留下的一些记录。最后那人弄了一个无限循环弹出框的脚本,估计这个脚本之后他再想输入也没法了。

类似这种:

<html><body οnlοad='while(true){alert(1)}'></body>
</html>

我立刻认识到这事件严重性,它说明我的博客有严重安全问题。因为xss跨站脚本攻击可能导致用户Cookie甚至服务器Session用户信息被劫持,后果严重。虽然攻击者就用些未必有什么技术含量的脚本即可做到。

第二天花些时间去了解,该怎么防范。顺便也看了sql注入方面。

sql注入是源于sql语句的拼接。所以需要对用户输入参数化。由于我使用的是jpa,不存在sql拼接问题,但还是对一些用户输入做处理比较好。我的博客系统并不复杂,一共四个表,Article,User,Message,Comment。

涉及数据库查询且由用户输入的就只有用户名,密码,文章标题。其它后台产生的如文章日期一类就不用管。

对于这三个字段的校验,可以使用自定义注解方式。

/**
* @ClassName: IsValidString 
* @Description: 自定义注解实现前后台参数校验,判断是否包含非法字符
* @author 无名
* @date 2016-7-25 下午8:22:58  
* @version 1.0*/
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IsValidString.ValidStringChecker.class)
@Documented
public @interface IsValidString 
{String message() default "The string is invalid.";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default{}; class ValidStringChecker implements ConstraintValidator<IsValidString,String> { @Override public void initialize(IsValidString arg0) { } @Override public boolean isValid(String strValue, ConstraintValidatorContext context) { //校验方法添在这里 return true; } } }

定义了自定义注解以后就可以在对应的实体类字段上添上@IsValidString即可。

但由于我还没研究出怎么拦截自定义注解校验返回的异常,就在controller类里做校验吧。

    public static boolean contains_sqlinject_illegal_ch(String str_input) {//"[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"String regEx = "['=<>;\"]";Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(str_input);if (m.find()) {return true; } else { return false; } }

拦截的字符有  ' " [] <> ;

我觉得这几个就够了吧。<>顺便就解决了xxs跨站脚本注入问题。

 

而xxs跨站脚本注入问题还是让我很头疼。因为我的博客系统使用wangEditor web文本编辑器,返回给后台的包含很多合法的html标签,用来表现文章格式。所以不能统一过滤<>这类字符。

例如,将<html><body οnlοad='while(true){alert(1)}'></body></html>这句输入编辑器,提交。后台得到的是:

中间被转意的&lt,&gt是合法的可供页面显示的<>字符。而外面的<p><br>就是文本编辑器生产的用来控制格式的正常的html标签。

问题在于,如果有人点击编辑器“源代码”标识,将文本编辑器生产的正常的html标签,再输入这句<html><body οnlοad='while(true){alert(1)}'></body></html>结果返回后台的就是原封不动的<html><body οnlοad='while(true){alert(1)}'></body></html>  <和>没有变成&lt和&gt。

这让人头痛,我在想这个编辑器为什么提供什么狗屁查看源代码功能,导致不能统一对<>。

在这种情况下,我只能过滤一部分认准是有危害的html标签,而众所周知,这类黑名单校验是不够安全的。(2016-12-30:下面这个函数是肯定不行的,写的很蠢,下文已经把它干掉,用白名单校验,并应用正则表达式的方式来做)

    /** Cross-site scripting (XSS) is a type of computer security vulnerability* typically found in web applications. XSS enables attackers to inject* client-side scripts into web pages viewed by other users. A cross-site* scripting vulnerability may be used by attackers to bypass access* controls such as the same-origin policy. Cross-site scripting carried out* on websites accounted for roughly 84% of all security vulnerabilities* documented by Symantec as of 2007. Their effect may range from a petty* nuisance to a significant security risk, depending on the sensitivity of* the data handled by the vulnerable site and the nature of any security* mitigation implemented by the site's owner.(From en.wikipedia.org)*/public static boolean contains_xss_illegal_str(String str_input) {if (str_input.contains("<html") || str_input.contains("<HTML")|| str_input.contains("<body") || str_input.contains("<BODY")|| str_input.contains("<script")|| str_input.contains("<SCRIPT") || str_input.contains("<link")|| str_input.contains("<LINK") || str_input.contains("%3Cscript") || str_input.contains("%3Chtml") || str_input.contains("%3Cbody") || str_input.contains("%3Clink") || str_input.contains("%3CSCRIPT") || str_input.contains("%3CHTML") || str_input.contains("%3CBODY") || str_input.contains("%3CLINK") || str_input.contains("<META") || str_input.contains("<meta") || str_input.contains("%3Cmeta") || str_input.contains("%3CMETA") || str_input.contains("<style") || str_input.contains("<STYLE") || str_input.contains("%3CSTYLE") || str_input.contains("%3Cstyle") || str_input.contains("<xml") || str_input.contains("<XML") || str_input.contains("%3Cxml") || str_input.contains("%3CXML")) { return true; } else { return false; } }

我在考虑着把这个文本编辑器的查看源代码功能给干掉。

另外,还是要系统学习xss跨站脚本注入防范。开始看一本书《白帽子讲web安全》,觉得这本书不错。

到时候有新见解再在这篇文章补充。

 

2016-12-30日补充:

今天读了那本《白帽子讲web安全》,果然获益不少。其中提到富文本编辑器的情况,由于富文本编辑器本身会使用正常的一些html标签,所以需要做白名单校验。只允许使用一些确定安全的标签,除富文本编辑器使用的标签,其他的都过滤掉。这是白名单方式,是真正合理的。

另外下午研究下正则表达式的写法:<([^(a)(img)(div)(p)(span)(pre)(br)(code)(b)(u)(i)(strike)(font)(blockquote)(ul)(li)(ol)(table)(tr)(td)(/)][^>]*)>(2016-12-30夜-2016-12-31 发现这个正则有误,下面就继续补充)

[^]是非的意思。

上面的正则的意思就是若含有a、img、div……之外的标签则匹配。

    /** Cross-site scripting (XSS) is a type of computer security vulnerability* typically found in web applications. XSS enables attackers to inject* client-side scripts into web pages viewed by other users. A cross-site* scripting vulnerability may be used by attackers to bypass access* controls such as the same-origin policy. Cross-site scripting carried out* on websites accounted for roughly 84% of all security vulnerabilities* documented by Symantec as of 2007. Their effect may range from a petty* nuisance to a significant security risk, depending on the sensitivity of* the data handled by the vulnerable site and the nature of any security* mitigation implemented by the site's owner.(From en.wikipedia.org)*/public static boolean contains_xss_illegal_str(String str_input) {final String REGULAR_EXPRESSION ="<([^(a)(img)(div)(p)(span)(pre)(br)(code)(b)(u)(i)(strike)(font)(blockquote)(ul)(li)(ol)(table)(tr)(td)(/)][^>]*)>";Pattern pattern = Pattern.compile(REGULAR_EXPRESSION);Matcher matcher = pattern.matcher(str_input);if (matcher.find()) {return true; } else { return false; } }

 

2016-12-30夜-2016-12-31 补充:

实验发现前面写的那个正则表达式是无效的。同时发现这个正则是非常难写、很有技术含量的,对于我这个基本正则都不太熟悉的菜鸟来说。

这种‘非’的表达,不能简单的用上面提到的[^]。那种无法匹配字符串的非。例如(a[^bc]d)表示地是ad其中的字符串不能为b或c。

对于字符串的非,应该用这种表达式:^(?!.*helloworld).*$

以此为前提,下面的正则可以表达不为<p>的html标签:  

     <((?!p)[^>])> 后面[^]表示<>中只有一个字符(?!p)且第一个字符非p

     若写成<((?!p)[^>]*)>则表示有n个字符,且第一个字符非p

    @Testpublic void test_Xss_check() {System.out.println("begin");String str_input = "<p>";final String REGULAR_EXPRESSION = "<((?!p)[^>])>";Pattern pattern = Pattern.compile(REGULAR_EXPRESSION); Matcher matcher = pattern.matcher(str_input); if (matcher.find()) { System.out.println("yes"); } }

那么该如何匹配,不为AA且不为BB的html标签呢?

       <((?!p)(?!a)[^>]*)>匹配的就是不以p开头且不以a开头html标签!

我们要求的匹配的是:不为<b>、不为<ul>、不为<li>……且不以<a 开头、不以<img 开头、不以</开头……的html标签。该如何写?

先写一个简单的例子:<(((?!p )(?!a )[^>]*)((?!p)(?!a).))>匹配的是非<p xxxx>且非<a xxxx>且非<p>且非<a>的<html>标签。

例如,字符串<pasd>则匹配,<p asd>则不匹配,<p>则不匹配。然而不精准的一点是,<ppp>或<aaa>也不匹配。其他问题也有,例如非<table>的标签就不知道该怎么表示。

 

总之感觉这个正则很难写,超出了我的能力范围。所以最后决定用正则先筛选html标签,再由java代码做白名单筛选。

用于筛选html标签的正则是<(?!a )(?!p )(?!img )(?!code )(?!spab )(?!pre )(?!font )(?!/)[^>]*>,筛选到的html排除掉<a xxx><p xxx><img xx></>等等,因为那些是默认合法的。筛选得到的<html>标签存进List里,再做白名单校验。

代码如下:

    @Testpublic void test_Xss_check() {String str_input ="<a ss><script>sds<body><a></adsd><d/s><p dsd><pp><a><dsds>dsdas<font ds>" +"<fontdsdsd><font>das<oooioacc><pp sds><script><code ><br><code><ccc><abug>";System.out.println("String inputed:" + str_input);final String REGULAR_EXPRESSION = "<(?!a )(?!p )(?!img )(?!code )(?!spab )(?!pre )(?!font )(?!/)[^>]*>";final Pattern PATTERN = Pattern.compile(REGULAR_EXPRESSION);final Matcher MATCHER = PATTERN.matcher(str_input);List<String> str_lst = new ArrayList<String>();while (MATCHER.find()) {str_lst.add(MATCHER.group());}final String  LEGAL_TAGS = "<a><img><div><p><span><pre><br><code>" +"<b><u><i><strike><font><blockquote><ul><li><ol><table><tr><td>";for (String str:str_lst) {if (!LEGAL_TAGS.contains(str)) {System.out.println(str + " is illegal");}}}

上述代码输出为:

String inputed:<a ss><script>sds<body><a></adsd><d/s><p dsd><pp><a><dsds>dsdas<font ds><fontdsdsd><font>das<oooioacc><pp sds><script><code ><br><code><ccc><abug>
<script> is illegal
<body> is illegal
<d/s> is illegal
<pp> is illegal
<dsds> is illegal
<fontdsdsd> is illegal
<oooioacc> is illegal
<pp sds> is illegal
<script> is illegal
<ccc> is illegal
<abug> is illegal

 

2017年1月1日

新年好,然而,不得不再说下这个xss白名单校验的新进展。昨天,更新了上述校验方法。那个脚本小子又来了,根据上文内容可知,我现在做到的是只限定有限的html标签,但没对标签属性做限制。结果这个脚本小子就拿这个做文章。比如把p标签设为绝对定位,绑定指定位置,设置长宽,一类的……

而且onclick、onload这些东西很多标签都有。

所以上文所述的方法写的也不够。但又感觉去再校验属性对我来说好麻烦。就上网上找找别人怎么做的。最后就找到了jsoup这个开源jar包。

https://jsoup.org/download

引入jar包后,这样写即可:

articleContent = Jsoup.clean(articleContent, Whitelist.basicWithImages());

妈的,能用轮子就尽快用,自己造太难了,浪费我五天。

最后,祝天下所有脚本猴子,2017年倒大霉!!!

 

2017年1月10日

上次加了Jsoup的过滤后,感觉写博客方面有些问题。明显是一些不该被过滤的标签被过滤掉了。

articleContent = Jsoup.clean(articleContent,Whitelist.basicWithImages());

觉得有必要继续处理。

设置断点调试。作为例子,博客中写这样的html代码:

<html><body><audio controls="controls" autoplay="autoplay" height="100" width="100"><source src="<%=basePath %>music/Breath and Life.mp3" type="audio/mp3" /><source src="<%=basePath %>music/Breath and Life.ogg" type="audio/ogg" /><embed height="100" width="100" src="<%=basePath %>music/Breath and Life.mp3" /></audio><script type="text/javascript" src="<%=basePath %>js/global.js"></script><script type="text/javascript" src="<%=basePath %>js/photos.js"></script></body>
</html>

富文本编辑器传到后台的字符串为:

<p>hello,日向blog</p><pre style="max-width:100%;overflow-x:auto;"><code class="html hljs xml"
codemark="1"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">audio</span> <span class="hljs-attr">controls</span>=<span class="hljs-
string">"controls"</span> <span class="hljs-attr">autoplay</span>=<span class="hljs-string">"autoplay"</span> <span class="hljs-
attr">height</span>=<span class="hljs-string">"100"</span> <span class="hljs-attr">width</span>=<span class="hljs-
string">"100"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">src</span>=<span class="hljs-
string">"&lt;%=basePath %&gt;music/Breath and Life.mp3"</span> <span class="hljs-attr">type</span>=<span class="hljs-
string">"audio/mp3"</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">source</span> <span class="hljs-attr">src</span>=<span class="hljs-
string">"&lt;%=basePath %&gt;music/Breath and Life.ogg"</span> <span class="hljs-attr">type</span>=<span class="hljs-
string">"audio/ogg"</span> /&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">embed</span> <span class="hljs-attr">height</span>=<span class="hljs-
string">"100"</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"100"</span> <span class="hljs-attr">src</span>=<span
class="hljs-string">"&lt;%=basePath %&gt;music/Breath and Life.mp3"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">audio</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-
string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"&lt;%=basePath
%&gt;js/global.js"</span>&gt;</span><span class="undefined"></span><span class="hljs-tag">&lt;/<span class="hljs-
name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-
string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"&lt;%=basePath
%&gt;js/photos.js"</span>&gt;</span><span class="undefined"></span><span class="hljs-tag">&lt;/<span class="hljs-
name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></pre>
<p><br></p>


 

经jsoup过滤后的值为:

<p>hello,日向blog</p>
<pre><code><span>&lt;<span>html</span>&gt;</span>
<span>&lt;<span>body</span>&gt;</span>
<span>&lt;<span>audio</span> <span>controls</span>=<span>"controls"</span> <span>autoplay</span>=<span>"autoplay"</span> <span>height</span>=<span>"100"</span> <span>width</span>=<span>"100"</span>&gt;</span>
<span>&lt;<span>source</span> <span>src</span>=<span>"&lt;%=basePath %&gt;music/Breath and Life.mp3"</span> <span>type</span>=<span>"audio/mp3"</span> /&gt;</span>
<span>&lt;<span>source</span> <span>src</span>=<span>"&lt;%=basePath %&gt;music/Breath and Life.ogg"</span> <span>type</span>=<span>"audio/ogg"</span> /&gt;</span>
<span>&lt;<span>embed</span> <span>height</span>=<span>"100"</span> <span>width</span>=<span>"100"</span> <span>src</span>=<span>"&lt;%=basePath %&gt;music/Breath and Life.mp3"</span> /&gt;</span>
<span>&lt;/<span>audio</span>&gt;</span>
<span>&lt;<span>script</span> <span>type</span>=<span>"text/javascript"</span> <span>src</span>=<span>"&lt;%=basePath %&gt;js/global.js"</span>&gt;</span><span></span><span>&lt;/<span>script</span>&gt;</span>
<span>&lt;<span>script</span> <span>type</span>=<span>"text/javascript"</span> <span>src</span>=<span>"&lt;%=basePath %&gt;js/photos.js"</span>&gt;</span><span></span><span>&lt;/<span>script</span>&gt;</span>
<span>&lt;/<span>body</span>&gt;</span>
<span>&lt;/<span>html</span>&gt;</span></code></pre>
<p><br></p>


 

显然pre标签的style、span和code标签的class属性被过滤掉了,而这些属性是无害而必须的。所以,我们需要改动jsoup原有的白名单。

查看代码,了解到Jsoup的过滤是通过传入Whitelist.basicWithImages()这个参数实现的,这是个白名单。

查看其源代码:

    /**<p>This whitelist allows a fuller range of text nodes: <code>a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li,ol, p, pre, q, small, span, strike, strong, sub, sup, u, ul</code>, and appropriate attributes.</p><p>Links (<code>a</code> elements) can point to <code>http, https, ftp, mailto</code>, and have an enforced<code>rel=nofollow</code> attribute.</p><p>Does not allow images.</p>@return whitelist*/public static Whitelist basic() {return new Whitelist().addTags("a", "b", "blockquote", "br", "cite", "code", "dd", "dl", "dt", "em","i", "li", "ol", "p", "pre", "q", "small", "span", "strike", "strong", "sub","sup", "u", "ul").addAttributes("a", "href").addAttributes("blockquote", "cite").addAttributes("q", "cite").addProtocols("a", "href", "ftp", "http", "https", "mailto").addProtocols("blockquote", "cite", "http", "https").addProtocols("cite", "cite", "http", "https").addEnforcedAttribute("a", "rel", "nofollow");}/**This whitelist allows the same text tags as {@link #basic}, and also allows <code>img</code> tags, with appropriateattributes, with <code>src</code> pointing to <code>http</code> or <code>https</code>.@return whitelist*/public static Whitelist basicWithImages() {return basic().addTags("img").addAttributes("img", "align", "alt", "height", "src", "title", "width").addProtocols("img", "src", "http", "https");}

我做了修改后为:

   public static Whitelist basic() {return new Whitelist().addTags("a", "b", "blockquote", "br", "cite", "code", "dd", "dl", "dt", "em","i", "li", "ol", "p", "pre", "q", "small", "span", "strike", "strong", "sub","sup", "u", "ul").addAttributes("a", "href").addAttributes("blockquote", "cite").addAttributes("q", "cite").addAttributes("code", "class").addAttributes("span", "class").addAttributes("pre", "style").addProtocols("a", "href", "ftp", "http", "https", "mailto").addProtocols("blockquote", "cite", "http", "https").addProtocols("cite", "cite", "http", "https").addEnforcedAttribute("a", "rel", "nofollow");}

添加了:

.addAttributes("span", "class")

.addAttributes("pre", "style")

.addAttributes("code", "class")

这三项

 

转载于:https://www.cnblogs.com/rixiang/p/6239464.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_783403.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hybrid容器设计之第三方网站

平台化容器API释放 接上文&#xff1a;&#xff08;阅读本文前&#xff0c;建议阅读前三篇文章先&#xff09; 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 之前设计Hybrid整块交互的时候&#xff0c;受众都是自…

.net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载...

在.net core中所有的请求都会被请求中间件所处理&#xff0c;所以我们可以通过在中间件里边添加对应的功能然后在服务中添加注入来实现对应的功能 文件位置&#xff1a;Startup.cs>Configure方法&#xff0c;请求中间件的代码位置 1.什么是中间件&#xff1a; 中间件是组装…

json 格式化工具/网站

一、在线工具&#xff1a; 优点&#xff0c;快速&#xff0c;识别错误&#xff0c;标识错误位置 缺点&#xff1a;对于编辑不友好&#xff0c;没有快捷键可用 https://www.jsondecode.cc/ http://www.vmfor.com/json.html# 二、离线工具 1、HIjson 优点&#xff1a;功能丰…

作为一名程序员必备的一些网站,看完记得收藏说不定以后用得上!

一个好的网站&#xff0c;就是程序员学编程的基地。虽说新手程序员也许知道一些在线编程网站&#xff0c;但是质量上乘的编程网站又知道几个呢? 下面就来给大家推荐几个质量上乘的编程网站&#xff0c;排名不分先后。 还有什么稀奇的网站请写在评论区&#xff0c;博主看到了就…

linux网站发布操作流程

Linux 添加用户命令&#xff1a; useradd bm -g webTemp http://www.runoob.com/linux/linux-vim.html Linux关于网站发布操作流程 虚拟机地下:192.168.1.175 1.网站发布打包2.去服务器把站点备份下载3.停止 站点4.删除 站点文件5.上传站点文件 并解压6.启动 站点. 一般情况下.…

第四百零四节,python网站第三方登录,social-auth-app-django模块,

第四百零四节&#xff0c;python网站第三方登录&#xff0c;social-auth-app-django模块&#xff0c; social-auth-app-django模块是专门用于Django的第三方登录OAuth2协议模块 目前流行的第三方登录都采用了OAuth2协议 安装 pip install -i https://pypi.douban.com/simple so…

http://www.open-lib.com 一个神奇的网站

向往前端转的同学们 注意了 LZ发现了一个前端JS框架很多的地方 这个就是 http://www.open-lib.com 不多说 上案例 HTML5视频播放框架 html5media[视频插件] html5media是一个JavaScript音频/视频播放器能够让每一个浏览器都能够播放在HTML5多媒体标签中定义的多媒体文件。OI…

免费发布统计调查网站

免费发布统计调查网站 需求: 需要一个调查网站,这个网站与公司主线业务没有直接关联,其主要作用是调查网上客户对产品的需求如何?分析: 因为是一个与公司主线业务关联不大的网站,而且其功能大多与以往调查类网站一样,复杂的操作在于其统计,不想用有限的人力投入到相似问题的开…

大型网站架构系列——分布式消息队列

转载自&#xff1a;https://www.cnblogs.com/itfly8/p/5155983.html 消息队列概述消息队列使用场景1、消息队列概述&#xff1a; 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决 应用耦合&#xff0c;异步消息&#xff0c;流量削锋 等问题。实现高性能&#xff…

沿用Python+Flask+Mysql的web建设技术开发网站

1 系统概要说明 1&#xff0e;1 开发目的 闲暇时光想看看电影&#xff1f;我要看些什么好呢&#xff1f;百度推荐出来的烂片也不在其数&#xff0c;如果有一个真实反映影片的平台该多好&#xff0c;这就是淘智宝的产生&#xff0c;为电影连续剧爱好人群提供一个可以自由言论的平…

推荐10个程序员常去的网站

偶尔有收到一些读者留言和询问&#xff1a;大佬&#xff0c;你知道有哪些适合初级学者的技术论坛或网站吗&#xff1f; 我摸了摸头&#xff0c;若有所思的答道&#xff1a;这个还真有&#xff0c;不知道你喜欢什么风格和适合哪些&#xff1f;.... 我没有见过凌晨4点的洛杉矶&…

Javascript 防扒站,防止镜像网站

自己没日没夜敲出来的站&#xff0c;稍微漂亮一点&#xff0c;被人看上了就难逃一扒&#xff0c;扒站是难免的&#xff0c;但不能让他轻轻松松就扒了&#xff1b; 前些天有个朋友做的官网被某不法网站镜像&#xff0c;严重影响到 SEO&#xff0c;当时的解决方法是通过屏蔽目标 …

服务器网页文件在哪里找,网站web服务器查木马一看就会

原标题&#xff1a;网站web服务器查木马一看就会今天周末到了检查WEB服务器安全状况的时间了。按照惯例子0点开始查。开始之前大家要准备好工具软件&#xff0c;当然如果很有经验的话也可以不用工具&#xff0c;不过效率只能是蚂蚁爬了。按照本文的方式&#xff0c;一般的WEB服…

Bootstrap4中button和dropdown不可见(提交到github个人网站)

项目场景&#xff1a; 一个作业题&#xff0c;要求自行实现一个搜索前端。 问题描述&#xff1a; 如上&#xff0c;实现之后本应由两个button&#xff0c;但是在第一次提交到github个人网站时不能正常显示。尽管功能正常&#xff0c;在预期的位置处可以又正常的功能运作。 …

机器学习实战——使用k邻近算法改进约会网站配对效果

一、资源准备 1、datingTestSet.txt 链接: https://pan.baidu.com/s/1mJ-9P_54PaP4hmiwBHMduw 提取码: wrua 二、实验环境 Anaconda numpy & matplotlib 包的安装 IDE&#xff1a;pycharm 三、实现过程 1、目的&#xff1a;datingTestSet.txt文件内的数据总共四列&…

用 Python 登录主流网站

作者 | CriseLYJ 编译&#xff1a;机器之心&#xff08;almosthuman2014&#xff09;作者收集了一些网站的登陆方式和爬虫程序&#xff0c;有的通过 selenium 登录&#xff0c;有的则通过抓包直接模拟登录。作者希望该项目能帮助初学者学习各大网站的模拟登陆方式&#xff0c;并…

网友发给我一个钓鱼网站,我用 Python 渗透了该网站所有信息

前言&#xff1a;这篇文章不是像评论区的某些大佬所想的那样是来炫技的&#xff0c;更多的是来给大家科普一些实用的渗透工具和方法&#xff0c;我相信不是所有的人都用过文中提到的这些方法。刚才在知乎上看到一篇文章《你的QQ号是这么被偷走的&#xff01;》&#xff0c;但是…

Python Web实战:Flask + Vue 开发一个漂亮的词云网站

作者&#xff1a;snowspace掘金今天就分享一个用Flask做的词云生成网站&#xff0c;非常有意思的小web&#xff0c;适合练手。这是一个前端用 Vue&#xff0c;后端用 Python 的 Web 框架 Flask 开发的词云生成应用&#xff0c;代码已上传到 flask-vue-word-cloud项目地址&#…

只用了20行Python代码就攻破了网站登录

测试靶机为DVWA&#xff0c;适合DVWA暴力破解模块的Low和Medium等级。关键代码解释url指定url地址url "http://192.168.171.2/dvwa/vulnerabilities/brute/"header设置请求头header {User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Fir…

知乎高赞!有没有适合新手练习 Python 的做题类网站?

本文整理自我的知乎回答&#xff0c;地址&#xff1a;https://www.zhihu.com/question/442492817/answer/2333418261。1. LeetCodeLeetCode 是一个刷算法题的网站&#xff0c;里面有多种语言可选 &#xff0c;题目分为简单、中等和困难三个级别&#xff0c;可以根据自己的水平进…