浅谈php安全性需要注意的几点事项
这段时间一直在写一个整站,前几天才基本完成了,所以抽个时间写了一篇对于php安全的总结。技术含量不高,过不了也没关系,希望能一些准备写网站的朋友一点引导
在放假之初,我抽时间看了《白帽子讲web安全》,吴翰清基本上把web安全中所有能够遇到的问题、解决思路归纳总结得很清晰,也是我这一次整体代码安全性的基石。
我希望能分如下几个方面来分享自己的经验
把握整站的结构,避免泄露站点敏感目录
在写代码之初,我也是像很多老源码一样,在根目录下放上index.php、register.php、login.php,用户点击注册页面,就跳转到。并没有太多的结构的思想,像这样的代码结构,最大的问题倒不是安全性问题,而是代码扩展与移植问题。
在写代码的过程中,我们常要对代码进行修改,这时候如果代码没有统一的一个入口点,我们可能要改很多地方。后来我读了一点emlog的代码,发现网站真正的前端代码都在模板目录里,而根目录下就只有入口点文件和配置文件。这才顿悟,对整个网站的结构进行了修改。
网站根目录下放上一个入口点文件,让它来对整个网站所有页面进行管理,这个时候注册页面变成了,任何页面只是act的一个参数,在得到这个参数后,再用一个switch来选择要包含的文件内容。在这个入口点文件中,还可以包含一些常量的定义,比如网站的绝对路径、网站的地址、数据库用户密码。以后我们在脚本的编写中,尽量使用绝对路径而不要使用相对路径(否则脚本如果改变位置,代码也要变),而这个绝对路径就来自入口点文件中的定义。
当然,在安全性上,一个入口点文件也能隐藏后台地址。像这样的地址不会暴露后台绝对路径,甚至可以经常更改,不用改变太多代码。一个入口点文件也可以验证访问者的身份,比如一个网站后台,不是管理员就不允许查看任何页面。在入口点文件中就可以验证身份,如果没有登录,就输出404页面。
有了入口点文件,我就把所有非入口点文件前面加上了这句话:
WWW_ROOT是我在入口点中定义的一个常量,如果用户是通过这个页面的绝对路径访问(),我就输出404错误;只有通过入口点访问(),才能执行后面的代码。
使用预编译语句,避免sql注入
注入是早前很大的一个问题,不过近些年因为大家比较重视这个问题,所以慢慢变得好了很多。
吴翰清在web白帽子里说的很好,其实很多漏洞,像sql注入或xss,都是将“数据”和“代码”没有区分开。“代码”是程序员写的内容,“数据”是用户可以改变的内容。如果我们写一个sql语句select * from admin where username='admin' password='xxxxx', admin和xxxxx就是数据,是用户输入的用户名和密码,但如果没有任何处理,用户输入的就可能是“代码”,比如'or ''=',这样就造成了漏洞。“代码”是绝对不能让用户接触的。
在php中,,对于mysql数据库有两个模块,mysql和mysqli,mysqli的意思就是mysql improve。mysql的改进版,这个模块中就含有“预编译”这个概念。像上面那个sql语句,改一改:select * from admin where username='?' password='?',它就不是一个sql语句了,但是可以通过mysqli的预编译功能先把他编译成stmt对象,在后期用户输入账号密码后,用stmt->bind_param将用户输入的“数据”绑定到这两个问号的位置。这样,用户输入的内容就只能是“数据”,而不可能变成“代码”。
这两个问号限定了“数据”的位置,以及sql语句的结构。我们可以把我们所有的数据库操作都封装到一个类中,所有sql语句的执行都进行预编译。这样就完全避免了sql注入,这也是吴翰清最推荐的解决方案。
下面是使用mysqli的一些代码部分(所有的判断函数运行成功或失败的代码我都省略了,但不代表不重要):
mysqli->set_charset("utf8"); //创建一个使用通配符的sql语句 $sql = 'SELECT user_id FROM admin WHERE username=? AND password=?;'; //编译该语句,得到一个stmt对象. $stmt = $conn->prepare($sql); /********************之后的内容就能重复利用,不用再次编译*************************/ //用bind_param方法绑定数据 //大家可以看出来,因为我留了两个?,也就是要向其中绑定两个数据,所以第一个参数是绑定的数据的类型(s=string,i=integer),第二个以后的参数是要绑定的数据 $stmt->bind_param('ss', $name, $pass); //调用bind_param方法绑定结果(如果只是检查该用户与密码是否存在,或只是一个DML语句的时候,不用绑定结果) //这个结果就是我select到的字段,有几个就要绑定几个 $stmt->bind_result($user_id); //执行该语句 $stmt->execute(); //得到结果 if($stmt->fetch()){ echo '登陆成功'; //一定要注意释放结果资源,否则后面会出错 $stmt->free_result(); return $user_id; //返回刚才select到的内容 }else{echo '登录失败';} ?>
预防XSS代码,如果不需要使用cookie就不使用
在我的网站中并没有使用cookie,更因为我对权限限制的很死,所以对于xss来说危险性比较小。
对于xss的防御,也是一个道理,处理好“代码”和“数据”的关系。当然,这里的代码指的就是javascript代码或html代码。用户能控制的内容,我们一定要使用htmlspecialchars等函数来处理用户输入的数据,并且在javascript中要谨慎把内容输出到页面中。
限制用户权限,预防CSRF
现在脚本漏洞比较火的就是越权行为,很多重要操作使用GET方式执行,或使用POST方式执行而没有核实执行者是否知情。
CSRF很多同学可能比较陌生,其实举一个小例子就行了:
A、B都是某论坛用户,该论坛允许用户“赞”某篇文章,用户点“赞”其实是访问了这个页面:。这个时候,B如果把这个URL发送给A,A在不知情的情况下打开了它,等于说给articleid=12的文章赞了一次。
所以该论坛换了种方式,通过POST方式来赞某篇文章。
可以看到一个隐藏的input框里含有该文章的ID,这样就不能通过一个URL让A点击了。但是B可以做一个“极具诱惑力”的页面,其中某个按钮就写成这样一个表单,来诱惑A点击。A一点击,依旧还是赞了这篇文章。
最后,该论坛只好把表单中增加了一个验证码。只有A输入验证码才能点赞。这样,彻底死了B的心。
但是,你见过哪个论坛点“赞”也要输入验证码?
所以吴翰清在白帽子里也推荐了最好的方式,就是在表单中加入一个随机字符串token(由php生成,并保存在SESSION中),如果用户提交的这个随机字符串和SESSION中保存的字符串一致,才能赞。
在B不知道A的随机字符串时,就不能越权操作了。
我在网站中也多次使用了TOKEN,不管是GET方式还是POST方式,通常就能抵御99%的CSRF估计了。
严格控制上传文件类型
上传漏洞是很致命的漏洞,只要存在任意文件上传漏洞,就能执行任意代码,拿到webshell。
我在上传这部分,写了一个php类,通过白名单验证,来控制用户上传恶意文件。在客户端,我通过javascript先验证了用户选择的文件的类型,但这只是善意地提醒用户,最终验证部分,还是在服务端。
白名单是必要的,你如果只允许上传图片,就设置成array('jpg','gif','png','bmp'),当用户上传来文件后,取它的文件名的后缀,用in_array验证是否在白名单中。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 웹 애플리케이션 개발에 널리 사용되는 서버 측 스크립팅 언어입니다. 여러 버전으로 개발되었으며, 이 기사에서는 주로 PHP5와 PHP8의 비교에 대해 논의할 것이며 특히 성능 및 보안 향상에 중점을 둘 것입니다. 먼저 PHP5의 몇 가지 기능을 살펴보겠습니다. PHP5는 2004년에 출시되었으며 객체 지향 프로그래밍(OOP), 예외 처리, 네임스페이스 등과 같은 많은 새로운 기능과 기능을 도입했습니다. 이러한 기능은 PHP5를 더욱 강력하고 유연하게 만들어 개발자가 다음을 수행할 수 있게 해줍니다.

Golang 개발의 보안 과제: 바이러스 생성에 악용되는 것을 방지하는 방법은 무엇입니까? 프로그래밍 분야에서 Golang이 광범위하게 적용됨에 따라 점점 더 많은 개발자가 Golang을 사용하여 다양한 유형의 응용 프로그램을 개발하는 것을 선택하고 있습니다. 그러나 다른 프로그래밍 언어와 마찬가지로 Golang 개발에는 보안 문제가 있습니다. 특히 Golang의 강력함과 유연성 덕분에 Golang은 잠재적인 바이러스 생성 도구로도 활용될 수 있습니다. 이 기사에서는 Golang 개발의 보안 문제를 조사하고 G를 방지하는 몇 가지 방법을 제공합니다.

MySQL에서 .ibd 파일의 역할 및 관련 주의사항에 대한 자세한 설명 MySQL은 널리 사용되는 관계형 데이터베이스 관리 시스템이며 데이터베이스의 데이터는 서로 다른 파일에 저장됩니다. 그 중 .ibd 파일은 InnoDB 스토리지 엔진의 데이터 파일로, 테이블에 데이터와 인덱스를 저장하는 데 사용됩니다. 이 기사에서는 MySQL에서 .ibd 파일의 역할에 대한 자세한 분석을 제공하고 관련 코드 예제를 제공하여 독자의 이해를 돕습니다. 1. .ibd 파일의 역할: 데이터 저장: .ibd 파일은 InnoDB 저장소입니다.

C# 개발에서 도메인 간 요청 및 보안 문제를 처리하는 방법 최신 네트워크 애플리케이션 개발에서 도메인 간 요청 및 보안 문제는 개발자가 자주 직면하는 문제입니다. 더 나은 사용자 경험과 기능을 제공하기 위해 애플리케이션은 종종 다른 도메인이나 서버와 상호 작용해야 합니다. 그러나 브라우저의 동일 출처 정책으로 인해 이러한 도메인 간 요청이 차단되므로 도메인 간 요청을 처리하기 위해 몇 가지 조치를 취해야 합니다. 동시에 데이터 보안을 보장하기 위해 개발자는 몇 가지 보안 문제도 고려해야 합니다. 이 문서에서는 C# 개발에서 도메인 간 요청을 처리하는 방법에 대해 설명합니다.

Java의 메모리 관리에는 가비지 수집 및 참조 계산을 사용하여 메모리를 할당, 사용 및 회수하는 자동 메모리 관리가 포함됩니다. 효과적인 메모리 관리는 버퍼 오버플로, 와일드 포인터 및 메모리 누수를 방지하여 프로그램의 안전성을 향상시키므로 보안에 매우 중요합니다. 예를 들어 더 이상 필요하지 않은 개체를 적절하게 해제하면 메모리 누수를 방지할 수 있으므로 프로그램 성능이 향상되고 충돌이 방지됩니다.

WebSocket 프로토콜의 보안 및 암호화된 전송 구현 인터넷이 발전함에 따라 네트워크 통신 프로토콜이 점차 발전하여 기존 HTTP 프로토콜은 때때로 실시간 통신 요구 사항을 충족할 수 없습니다. 새롭게 떠오르는 통신 프로토콜인 WebSocket 프로토콜은 강력한 실시간 성능, 양방향 통신 및 낮은 대기 시간이라는 장점을 가지고 있으며 온라인 채팅, 실시간 푸시, 게임 등의 분야에서 널리 사용됩니다. 그러나 WebSocket 프로토콜의 특성으로 인해 통신 과정에서 일부 보안 문제가 발생할 수 있습니다. 따라서 WebSo의 경우

Win11에는 바이러스 백신 소프트웨어가 함께 제공됩니다. 일반적으로 바이러스 백신 효과는 매우 좋으며 설치할 필요가 없습니다. 그러나 유일한 단점은 바이러스가 필요한지 미리 알려주지 않고 먼저 제거된다는 것입니다. . 동의하면 다른 바이러스 백신 소프트웨어를 다운로드할 필요가 없습니다. win11에는 바이러스 백신 소프트웨어를 설치해야 합니까? 답변: 아니요. 일반적으로 win11에는 바이러스 백신 소프트웨어가 함께 제공되므로 추가 설치가 필요하지 않습니다. win11 시스템과 함께 제공되는 바이러스 백신 소프트웨어의 처리 방식이 마음에 들지 않으면 다시 설치할 수 있습니다. win11과 함께 제공되는 바이러스 백신 소프트웨어를 끄는 방법: 1. 먼저 설정을 입력하고 "개인 정보 보호 및 보안"을 클릭합니다. 2. 그런 다음 "창 보안 센터"를 클릭하십시오. 3. 그런 다음 "바이러스 및 위협 방지"를 선택합니다. 4. 마지막으로 끌 수 있습니다

CAD를 원활하게 사용하려면 어떤 구성이 필요합니까? CAD 소프트웨어를 원활하게 사용하려면 다음 구성 요구 사항을 충족해야 합니다. 프로세서 요구 사항: "Word Play Flowers"를 원활하게 실행하려면 Intel Corei5 또는 AMD Ryzen5 이상 프로세서. 물론 고성능 프로세서를 선택하면 더 빠른 처리 속도와 더 나은 성능을 얻을 수 있습니다. 메모리는 컴퓨터에서 매우 중요한 구성 요소이며 컴퓨터의 성능과 사용자 경험에 직접적인 영향을 미칩니다. 일반적으로 대부분의 일상적인 사용 요구 사항을 충족할 수 있는 최소 8GB의 메모리를 권장합니다. 하지만 더 나은 성능과 원활한 사용 경험을 위해서는 16GB 이상의 메모리 구성을 선택하는 것이 좋습니다. 이는 다음을 보장합니다.
