Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我是否容易受到sql注入和跨站点脚本(以及其他…)的攻击?怎么办?_Php_Sql_Security_Xss - Fatal编程技术网

Php 我是否容易受到sql注入和跨站点脚本(以及其他…)的攻击?怎么办?

Php 我是否容易受到sql注入和跨站点脚本(以及其他…)的攻击?怎么办?,php,sql,security,xss,Php,Sql,Security,Xss,首先,请原谅我的无知,我不是一名程序员,而是一名学生研究助理,碰巧需要编写一些程序 现在我正在开发一个页面,它将接收用户输入(最终将是猜谜游戏中的猜测),并将其存储在csv文件中。这里的技术人员警告我sql注入和跨站点脚本的危险,所以我搜索了它们以及保护策略。但看起来有很多策略,我很难理解我需要使用哪些策略。例如,如果我不使用sql,我甚至需要担心sql注入吗?我在使用sql,但我不知道吗?使用javascript从输入中删除所有非字母字符是否足够(我真的不需要它们) 有人能告诉我:考虑到我的努

首先,请原谅我的无知,我不是一名程序员,而是一名学生研究助理,碰巧需要编写一些程序

现在我正在开发一个页面,它将接收用户输入(最终将是猜谜游戏中的猜测),并将其存储在csv文件中。这里的技术人员警告我sql注入和跨站点脚本的危险,所以我搜索了它们以及保护策略。但看起来有很多策略,我很难理解我需要使用哪些策略。例如,如果我不使用sql,我甚至需要担心sql注入吗?我在使用sql,但我不知道吗?使用javascript从输入中删除所有非字母字符是否足够(我真的不需要它们)

有人能告诉我:考虑到我的努力,我需要使用哪些保护策略

如果有帮助的话,这里是我目前的代码。我正在尝试使用Ajax,因此我有以下组件:

HTML:显示文本框和按钮,将输入写入csv文件(一个写入同一行,一个写入新行)






B.Javascript:创建一个XMLHttpRequest对象,用post打开它并指定php脚本,然后将其与用户输入的字符串一起发送(我在这里没有包含回调函数,因为我没有更改响应的html页面,但是如果需要,请告诉我)

函数createRequestObject()
{
var ro;
var browser=navigator.appName;
如果(浏览器==“Microsoft Internet Explorer”)
{
ro=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
否则
{
ro=新的XMLHttpRequest();
}
返回ro;
}
函数writeToFile(换行符、内容)
{
var ajaxRO=createRequestObject();
内容+=”,“
var params=“newline=“+newline+”&content=“+content
打开(“POST”,“writer2.php”,true);
ajaxRO.setRequestHeader(“内容类型”、“应用程序/x-www-form-urlencoded”);
ajaxRO.send(参数);
}

PHP:从Post中检索变量(第一个告诉它是否需要新行,第二个告诉它要写什么)


我不知道你为什么发布HTML/JavaScript,这并不是问题所在。XSS和SQL注入是服务器端的问题,如果需要帮助,您应该发布PHP代码(将基于DOM的XSS放在一边,因为它非常少见)

对于SQL注入,您应该始终使用参数化的quire。PDO和ADOB都是很好的库

防守要复杂得多。您不能在打印出的每个变量上抛出
htmlspeicalchars($var,entu QUOTES)
,并期望安全。这是一个很好的做法,但也应确保测试所有内容。我建议使用一个免费的服务,比如测试xss、sql注入等等。或者你可以用

就CSV文件而言,这既慢又麻烦。您应该为此使用数据库。如果需要提供csv文件,可以选择所需内容并使用PHP打印

您应该在服务器中验证您的输入。由于您正在写入CSV文件,因此PHP代码应该查找逗号和新行,并可能将它们替换为空格或向用户返回错误消息。另外,考虑您可以接受作为输入的最大长度

收集输入后,如果将收集的数据显示为页面中的输出,则应将其显示出来


不过,这只是冰山一角。安全问题永远不会得到解决,您只是提高了潜在攻击者的门槛。

您的代码不易受到跨站点脚本攻击,并且您没有使用SQL,只使用纯文本

但是,请注意另一个称为跨站点请求伪造的漏洞。您必须以以下形式添加令牌值:

$_SESSION['token'] = md5(rand()); if($_SESSION['token'] != $_POST['token']){ echo 'Invalid Request!'; } else{ //valid request! } $\会话['token']=md5(rand()); 如果($\u会话['token']!=$\u POST['token']){ 回显“无效请求!”; } 否则{ //请求有效! }rand()很弱,md5()不会使它更随机
uniqid(mt_rand(),true)
是在php中生成令牌的一种很好的方法。您可以使用md5来隐藏它是如何生成的,uniqueid包含一个时间戳。