开-形考-10235PHP动态网站设计
1、如果A表有三列字段,B表有两列字段,它们之间是不能进行联合的。
2、MySQL可以建立个用户,但每个用户的权限一样,仅是名称不一样而已。
3、mysql 中 auto_increment自动增长列的,初始值只能从 1 开始。
4、?php include("conn.php"); mysql_query("set names gb2312"); mysql_select_db("test"); $sqlstr="delete from sanguo"; $result=mysql_query($sqlstr,$conn); ?> 阅读以上代码,请问该代码的功能是
5、在PDO中连接指定的数据库服务器后,可以建立新的数据库,但不可以建立数据表。
6、PDO对象的exec方法可执行非查询的SQL命令,包括插入、删除、修改命令。
7、MySQL安装时,默认的字符集是gb2312。
8、mysql中的limit 关键字可以限制结果集中记录的个数。
9、关于mysql_select_db的作用描述正确的是_____。
10、php哪个函数用于向mysql数据库发送指令?
11、mysql_free_result($result);本行代码的含义是
12、mysql int数据类型当中所占用字节数最小的为
13、为了使用PDO访问MySQL数据库,下列选项中不是必须执行的步骤是_____。
14、如果想取得最近一条查询的信息,应该使用哪个函数_____。
15、使用get和post传递表单值没有什么区别,可以随便选择一种使用。
16、,默认的method使用get进行值传递。
17、session与cookie只是名称不同,实质上没有什么区别,均可用于实现用户登录等功能。
18、PHP如果要实现网站常见的翻页功能,mysql中的哪个子句是必不可少的?
19、以下哪些是PHP的会话控制技术?
20、在PHP中,客户端浏览器的数据可以使用GET方式提交到服务器,使用GET方式上传的数据,用户是不可能在浏览器地址栏中看到的。
21、PHP中的Session用于在客户端保存用户的"会话”状态。一个用户从访问网站的第一个网页开始到离开网站,称为一个会话。
22、表单数据中包括隐藏表单,PHP也会接收不到隐藏表单中的数据。
23、html表单发送数据,默认按 post 方式进行发送。
24、cookies_____属性表明cookie 由哪个网站产生或读取。
25、读取post方法传递的表单元素值的方法是:
26、php 内置数组_____接受表单Post方式提交的数据
27、下述说法不正确的是_____。
28、php 的_____集合可取得客户端以个get 方式递交的数据。
29、CSV文件指文件中的数据用分隔符分隔,可以使用fgetcsv()函数读取CSV文件并解析数据。
30、PHP的文件操作函数rewind() 用于把文件位置指针设为文件流的结尾。
31、php中可以使用method=post的方式进行文件上传。
32、PHP对文件进行操作是,先用哪个函数对操作文件进行是否存在的判断?
33、PHP提供了一些常用文件属性函数,能够根据给定的文件名得到文件的相关属性,这些函数的参数都是文件$file类型。
34、file函数一定要使用fopen函数打开文件,才能将读出文件的全部内容放入一个数组,文件每行数据为一个数组元素值。
35、文件读写都在文件指针位置进行,读出或写入n个字节时,文件指针向前移动n个字节。
36、fgetc()函数用于从打开的文件中读入一行数据。
37、使用函数_____来检查此文件是否是上传文件。
38、php中哪个函数用于读取整个文件?
39、PHP对目录进行操作时,先用哪个函数对操作目录进行是否存在的判断?
40、PHP的文件上传功能,需要在php.ini配置当中,开启哪项功能?
41、使用关键字 final 修饰的类,可以被继承。
42、PHP的析构函数是必须要有的。
43、PHP中的类访问修饰符,默认为public 。
44、PHP中的类支持多继承。
45、PHP的构造函数为 __destruct() ;。
46、implements 用于实现PHP中类的继承。
47、self 是指向父类的指针,主要用于调用父类的构造函数。
48、类test的定义如下,$x是类test的对象,则4个选项中,正确的是____________。class test { private $a; public $b; }
49、PHP中 最终类应该用哪个关键字进行修饰?
50、哪个方法可以实现 PHP中类的自动加载功能?
51、判断某个类是否存在的函数为
52、函数内部的局部变量在函数调用时被创建,函数调用结束后变量则被释放。
53、php中,函数默认按值传递参数。
54、PHP中 类的属性含义正确的是
55、下列说法不正确的是____________。
56、函数test定义如下,错误调用函数的语句是_____。function test($a,$b=-1){ Return $a+$b; }
57、在下面的代码中,第2个test()输出结果为_____。?php function test(){ static $n=5; $n++; echo $n; } $n=10; test(); test();
58、自定义函数中,返回函数值的关键字是_____。
59、Function keep_track() { STATIC $count=5; echo $count++." "; } Keep_track(); Keep_track(); Keep_track(); 这段代码输出的值为( )
60、在同一个PHP文件中,函数的调用和函数定义出现的先后顺序应该是函数定义在前,函数调用在后,否则会出错。
对于其他几种语言来说, PHP 在 web 建站方面有更大的优势,即使是新手,也能很容易搭建一个网站出来。但这种优势也容易带来一些负面影响,因为很多的 PHP 教程没有涉及到安全方面的知识。
此帖子分为几部分,每部分会涵盖不同的安全威胁和应对策略。但是,这并不是说你做到这几点以后,就一定能避免你的网站出现任何问题。如果你想提高你的网站安全性的话,你应该继续通过阅读书籍或者文章,来研究如何提高你的网站安全性
出于演示需要,代码可能不是很完美。日常开发过程中,很多代码都包含在了框架跟各种库里面。作为一个后台开发,你不仅要熟练基本的CURD,更要知道如何保护你的数据。
1. SQL 注入
我赌一包辣条,你肯定会看到这里。 SQL 注入是对您网站最大的威胁之一,如果您的数据库受到别人的 SQL 注入的攻击的话,别人可以转出你的数据库,也许还会产生更严重的后果。
网站要从数据库中获取动态数据,就必须执行 SQL 语句,举例如下:
<?php $username=$_GET['username']; $query="SELECT * FROM users WHERE username='$username'";
攻击者控制通过 GET 和 POST 发送的查询(或者例如 UA 的一些其他查询)。一般情况下,你希望查询户名为「 peter 」的用户产生的 SQL 语句如下:
SELECT * FROM users WHERE username='peter'
但是,攻击者发送了特定的用户名参数,例如:' OR '1'='1
这就会导致 SQL 语句变成这样:
SELECT * FROM users WHERE username='peter' OR '1'='1'
这样,他就能在不需要密码的情况下导出你的整个用户表的数据了。
那么,我们如何防止这类事故的发生呢?主流的解决方法有两种。转义用户输入的数据或者使用封装好的语句。转义的方法是封装好一个函数,用来对用户提交的数据进行过滤,去掉有害的标签。但是,我不太推荐使用这个方法,因为比较容易忘记在每个地方都做此处理。
下面,我来介绍如何使用 PDO 执行封装好的语句( mysqi 也一样):
$username=$_GET['username']; $query=$pdo->prepare('SELECT * FROM users WHERE username=:username'); $query->execute(['username'=> $username]); $data=$query->fetch();
动态数据的每个部分都以:做前缀。然后将所有参数作为数组传递给执行函数,看起来就像 PDO 为你转义了有害数据一样。
几乎所有的数据库驱动程序都支持封装好的语句,没有理由不使用它们!养成使用他们的习惯,以后就不会忘记了。
你也可以参考 phpdelusions 中的一篇关于动态构建 SQL 查询时处理安全问题的文章。链接: https://phpdelusions.net/pdo/... 。
2. XSS
XSS 又叫 CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往 Web 页面里插入恶意 html 代码,当用户浏览该页之时,嵌入其中 Web 里面的 html 代码会被执行,从而达到恶意攻击用户的特殊目的。
下面以一个搜索页面为例子:
<body> <?php $searchQuery=$_GET['q']; /* some search magic here */ ?> <h1>You searched for: <?php echo $searchQuery; ?></h1> <p>We found: Absolutely nothing because this is a demo</p> </body>
因为我们把用户的内容直接打印出来,不经过任何过滤,非法用户可以拼接 URL:
search.php?q=%3Cscript%3Ealert(1)%3B%3C%2Fscript%3E
PHP 渲染出来的内容如下,可以看到 Javascript 代码会被直接执行:
<body> <h1>You searched for: <script>alert(1);</script></h1> <p>We found: Absolutely nothing because this is a demo</p> </body>
问:JS 代码被执行有什么大不了的?
Javascript 可以:
问:如何防范此问题呢?
好消息是比较先进的浏览器现在已经具备了一些基础的 XSS 防范功能,不过请不要依赖与此。
正确的做法是坚决不要相信用户的任何输入,并过滤掉输入中的所有特殊字符。这样就能消灭绝大部分的 XSS 攻击:
<?php $searchQuery=htmlentities($searchQuery, ENT_QUOTES);
或者你可以使用模板引擎 Twig ,一般的模板引擎都会默认为输出加上 htmlentities 防范。
如果你保持了用户的输入内容,在输出时也要特别注意,在以下的例子中,我们允许用户填写自己的博客链接:
<body> <a href="<?php echo $homepageUrl; ?>">Visit Users homepage</a> </body>
以上代码可能第一眼看不出来有问题,但是假设用户填入以下内容:
#" onclick="alert(1)
会被渲染为:
<body> <a href="#" onclick="alert(1)">Visit Users homepage</a> </body>
永远永远不要相信用户输入的数据,或者,永远都假设用户的内容是有攻击性的,态度端正了,然后小心地处理好每一次的用户输入和输出。
另一个控制 XSS 攻击的方法是提供一个 CSP Meta 标签,或者标头信息,更多详情请见:https://www.html5rocks.com/en...
另外种 Cookie 时,如果无需 JS 读取的话,请必须设置为 "HTTP ONLY"。这个设置可以令 JavaScript 无法读取 PHP 端种的 Cookie。
3. XSRF/CSRF
CSRF 是跨站请求伪造的缩写,它是攻击者通过一些技术手段欺骗用户去访问曾经认证过的网站并运行一些操作。
虽然此处展示的例子是 GET 请求,但只是相较于 POST 更容易理解,并非防护手段,两者都不是私密的 Cookies 或者多步表单。
假如你有一个允许用户删除账户的页面,如下所示:
<?php //delete-account.php $confirm=$_GET['confirm']; if($confirm==='yes') { //goodbye }
攻击者可以在他的站点上构建一个触发这个 URL 的表单(同样适用于 POST 的表单),或者将 URL 加载为图片诱惑用户点击:
<img src="https://example.com/delete-account.php?confirm=yes" />
用户一旦触发,就会执行删除账户的指令,眨眼你的账户就消失了。
防御这样的攻击比防御 XSS 与 SQL 注入更复杂一些。
最常用的防御方法是生成一个 CSRF 令牌加密安全字符串,一般称其为 Token,并将 Token 存储于 Cookie 或者 Session 中。
每次你在网页构造表单时,将 Token 令牌放在表单中的隐藏字段,表单请求服务器以后会根据用户的 Cookie 或者 Session 里的 Token 令牌比对,校验成功才给予通过。
由于攻击者无法知道 Token 令牌的内容(每个表单的 Token 令牌都是随机的),因此无法冒充用户。
<?php /* 你嵌入表单的页面 */ ?> <form action="/delete-account.php" method="post"> <input type="hidden" name="csrf" value="<?php echo $_SESSION['csrf']; ?>"> <input type="hidden" name="confirm" value="yes" /> <input type="submit" value="Delete my account" /> </form> ## <?php //delete-account.php $confirm=$_POST['confirm']; $csrf=$_POST['csrf']; $knownGoodToken=$_SESSION['csrf']; if($csrf !==$knownGoodToken) { die('Invalid request'); } if($confirm==='yes') { //goodbye }
请注意,这是个非常简单的示例,你可以加入更多的代码。如果你使用的是像 Symfony 这样的 PHP 框架,那么自带了 CSRF 令牌的功能。
你还可以查看关于 OWASP 更详细的问题和更多防御机制的文章: https://github.com/OWASP/CheatS....
4. LFI
LFI (本地文件包含) 是一个用户未经验证从磁盘读取文件的漏洞。
我经常遇到编程不规范的路由代码示例,它们不验证过滤用户的输入。我们用以下文件为例,将它要渲染的模板文件用 GET 请求加载。
<body> <?php $page=$_GET['page']; if(!$page) { $page='main.php'; } include($page); ?> </body>
由于 Include 可以加载任何文件,不仅仅是PHP,攻击者可以将系统上的任何文件作为包含目标传递。
index.php?page=../../etc/passwd
这将导致 /etc/passwd 文件被读取并展示在浏览器上。
要防御此类攻击,你必须仔细考虑允许用户输入的类型,并删除可能有害的字符,如输入字符中的“.” “/” “”。
如果你真的想使用像这样的路由系统(我不建议以任何方式),你可以自动附加 PHP 扩展,删除任何非 [a-zA-Z0-9-_] 的字符,并指定从专用的模板文件夹中加载,以免被包含任何非模板文件。
我在不同的开发文档中,多次看到造成此类漏洞的 PHP 代码。从一开始就要有清晰的设计思路,允许所需要包含的文件类型,并删除掉多余的内容。你还可以构造要读取文件的绝对路径,并验证文件是否存在来作为保护,而不是任何位置都给予读取。
5. 不充分的密码哈希
大部分的 Web 应用需要保存用户的认证信息。如果密码哈希做的足够好,在你的网站被攻破时,即可保护用户的密码不被非法读取。
首先,最不应该做的事情,就是把用户密码明文储存起来。大部分的用户会在多个网站上使用同一个密码,这是不可改变的事实。当你的网站被攻破,意味着用户的其他网站的账号也被攻破了。
其次,你不应该使用简单的哈希算法,事实上所有没有专门为密码哈希优化的算法都不应使用。哈希算法如 MD5 或者 SHA 设计初衷就是执行起来非常快。这不是你需要的,密码哈希的终极目标就是让黑客花费无穷尽的时间和精力都无法破解出来密码。
另外一个比较重要的点是你应该为密码哈希加盐(Salt),加盐处理避免了两个同样的密码会产生同样哈希的问题。
以下使用 MD5 来做例子,所以请千万不要使用 MD5 来哈希你的密码, MD5 是不安全的。
假如我们的用户 user1 和 user315 都有相同的密码 ilovecats123,这个密码虽然看起来是强密码,有字母有数字,但是在数据库里,两个用户的密码哈希数据将会是相同的:5e2b4d823db9d044ecd5e084b6d33ea5 。
如果一个如果黑客拿下了你的网站,获取到了这些哈希数据,他将不需要去暴力破解用户 user315 的密码。我们要尽量让他花大精力来破解你的密码,所以我们对数据进行加盐处理:
<?php //warning: !!这是一个很不安全的密码哈希例子,请不要使用!! $password='cat123'; $salt=random_bytes(20); $hash=md5($password . $salt);
最后在保存你的唯一密码哈希数据时,请不要忘记连 $salt 也已经保存,否则你将无法验证用户。
在当下,最好的密码哈希选项是 bcrypt,这是专门为哈希密码而设计的哈希算法,同时这套哈希算法里还允许你配置一些参数来加大破解的难度。
新版的 PHP 中也自带了安全的密码哈希函数 password_hash ,此函数已经包含了加盐处理。对应的密码验证函数为 password_verify 用来检测密码是否正确。password_verify 还可有效防止 时序攻击.
以下是使用的例子:
<?php //user signup $password=$_POST['password']; $hashedPassword=password_hash($password, PASSWORD_DEFAULT); //login $password=$_POST['password']; $hash='1234'; //load this value from your db if(password_verify($password, $hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; }
需要澄清的一点是:密码哈希并不是密码加密。哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。显然他们之间最大的区别是可逆性,在储存密码时,我们要的就是哈希这种不可逆的属性。
6. 中间人攻击
MITM (中间人) 攻击不是针对服务器直接攻击,而是针对用户进行,攻击者作为中间人欺骗服务器他是用户,欺骗用户他是服务器,从而来拦截用户与网站的流量,并从中注入恶意内容或者读取私密信息,通常发生在公共 WiFi 网络中,也有可能发生在其他流量通过的地方,例如ISP运营商。
对此的唯一防御是使用 HTTPS,使用 HTTPS 可以将你的连接加密,并且无法读取或者篡改流量。你可以从 Let's Encrypt 获取免费的 SSL 证书,或从其他供应商处购买,这里不详细介绍如何正确配置 WEB 服务器,因为这与应用程序安全性无关,且在很大程度上取决于你的设置。
你还可以采取一些措施使 HTTPS 更安全,在 WEB 服务器配置加上 Strict-Transport-Security 标示头,此头部信息告诉浏览器,你的网站始终通过 HTTPS 访问,如果未通过 HTTPS 将返回错误报告提示浏览器不应显示该页面。
然而,这里有个明显的问题,如果浏览器之前从未访问过你的网站,则无法知道你使用此标示头,这时候就需要用到 Hstspreload。
可以在此注册你的网站: https://hstspreload.org/
你在此处提交的所有网站都将被标记为仅 HTTPS,并硬编码到 Google Chrome、FireFox、Opera、Safari、IE11 和 Edge 的源代码中。
你还可以在 DNS 配置中添加 Certification Authority Authorization (CAA) record ,可以仅允许一个证书颁发机构(例如: Let's encrypt)发布你的域名证书,这进一步提高了用户的安全性。
7. 命令注入
这可能是服务器遇到的最严重的攻击,命令注入的目标是欺骗服务器执行任意 Shell 命令
你如果使用 shell_exec 或是 exec 函数。让我们做一个小例子,允许用户简单的从服务器 Ping 不同的主机。
<?php $targetIp=$_GET['ip']; $output=shell_exec("ping -c 5 $targetIp");
输出将包括对目标主机 Ping 5次。除非采用 sh 命令执行 Shell 脚本,否则攻击者可以执行想要的任何操作。
ping.php?ip=8.8.8.8;ls -l /etc
Shell 将执行 Ping 和由攻击者拼接的第二个命令,这显然是非常危险的。
感谢 PHP 提供了一个函数来转义 Shell 参数。
escapeshellarg 转义用户的输入并将其封装成单引号。
<?php $targetIp=escapeshellarg($_GET['ip']); $output=shell_exec("ping -c 5 $targetIp");
现在你的命令应该是相当安全的,就个人而言,我仍然避免使用 PHP 调用外部命令,但这完全取决于你自己的喜好。
另外,我建议进一步验证用户输入是否符合你期望的形式。
8. XXE
XXE (XML 外部实体) 是一种应用程序使用配置不正确的 XML 解析器解析外部 XML 时,导致的本地文件包含攻击,甚至可以远程代码执行。
XML 有一个鲜为人知的特性,它允许文档作者将远程和本地文件作为实体包含在其 XML 文件中。
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY passwd SYSTEM "file:///etc/passwd" >]> <foo>&passwd;</foo>
就像这样, /etc/passwd 文件内容被转储到 XML 文件中。
如果你使用 libxml 可以调用 libxml_disable_entity_loader 来保护自己免受此类攻击。使用前请仔细检查 XML 库的默认配置,以确保配置成功。
9. 在生产环境中不正确的错误报告暴露敏感数据
[](https://secure.php.net/manual...,可能会在生产环境中因为不正确的错误报告泄露了敏感信息,例如:文件夹结构、数据库结构、连接信息与用户信息。
你是不希望用户看到这个的吧?
一般根据你使用的框架或者 CMS ,配置方法会有不同的变化。通常框架具有允许你将站点更改为某种生产环境的设置。这样会将所有用户可见的错误消息重定向到日志文件中,并向用户显示非描述性的 500 错误,同时允许你根据错误代码检查。
但是你应该根据你的 PHP 环境设置: error_reporting 与 display_errors.
10. 登录限制
像登录这样的敏感表单应该有一个严格的速率限制,以防止暴力攻击。保存每个用户在过去几分钟内失败的登录尝试次数,如果该速率超过你定义的阈值,则拒绝进一步登录尝试,直到冷却期结束。还可通过电子邮件通知用户登录失败,以便他们知道自己的账户被成为目标。
一些其他补充
小贴士
我不是一个安全专家,恐无法做到事无巨细。尽管编写安全软件是一个非常痛苦的过程,但还是可以通过遵循一些基本规则,编写合理安全的应用程序。其实,很多框架在这方面也帮我们做了很多工作。
在问题发生之前,安全性问题并不像语法错误等可以在开发阶段追踪到。因此,在编写代码的过程中,应该时刻有规避安全风险的意识。如果你迫于业务需求的压力而不得不暂时忽略一些安全防范的工作,我想你有必要事先告知大家这样做的潜在风险。
如果你从这篇文章有所收益,也请把它分享给你的朋友们把,让我们共建安全网站。
天下数据是国内屈指可数的拥有多处海外自建机房的新型IDC服务商,被业界公认为“中国IDC行业首选品牌”。
天下数据与全球近120多个国家顶级机房直接合作,提供包括香港、美国、韩国、日本、台湾、新加坡、荷兰、法国、英国、德国、埃及、南非、巴西、印度、越南等国家和地区的服务器、云服务器的租用服务.
除提供传统的IDC产品外,天下数据的主要职责是为大中型企业提供更精细、安全、满足个性需求的定制化服务器解决方案,特别是在直销、金融、视频、流媒体、游戏、电子商务、区块链、快消、物联网、大数据等诸多行业,为广大客户解决服务器租用中遇到的各种问题。
JavaScript中,有时您需要访问HTML元素。querySelector方法是一个Web API,它选择与传入的指定CSS选择器匹配的第一个元素。
但是,更详细地说,这是如何工作的呢?在本文中,我们将看一些如何使用querySelector方法以及querySelectorAll方法的示例。
(本文内容参考:java567.com)
*请认真填写需求信息,我们会在24小时内与您取得联系。