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