我是脆弱的sql注入和跨站点脚本(和其他…)?该怎么做


Am I vulnerable to sql injection and cross site scripting (and others...)? What to do?

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

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

谁能告诉我:考虑到我正在尝试做的事情,我需要使用哪种保护策略?

如果它有帮助,这里是我到目前为止的代码。我尝试使用Ajax,所以我有以下组件:

。HTML:呈现文本框和按钮,用于将输入写入csv文件(一个写入同一行,一个写入新行)。

<input id="input" type="text"><br>
<input type="button" onClick="javascript:writeToFile(0, document.getElementById('input').value)" value="write on same line"><br>
<input type="button" onClick="javascript:writeToFile(1,document.getElementById('input').value)" value="write on new line"><br>

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

function createRequestObject()
{
var ro;
var browser = navigator.appName;
if(browser == "Microsoft Internet Explorer")
{
ro = new ActiveXObject("Microsoft.XMLHTTP");
}
else
{
ro = new XMLHttpRequest();
}
return ro;
}
function writeToFile(newline, content)
{
var ajaxRO = createRequestObject();
content+=", "
var params="newline=" + newline + "&content=" + content
ajaxRO.open("POST", "writer2.php", true);
ajaxRO.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajaxRO.send(params);
}

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

<?php
$myFile = "results.csv";
$fh = fopen($myFile, 'a') or die("can't open file");
$toWrite = $_POST['content'];
$newLine = $_POST['newline'];
if($newLine==1)
{
fwrite($fh, "'n");
fwrite($fh, $toWrite);
fclose($fh);
}
else
{
fwrite($fh, $toWrite);
fclose($fh);
}
?>

非常感谢您提供的任何信息!

我不知道为什么你张贴HTML/JavaScript那不是真正的问题所在。XSS和SQL注入是服务器端的问题,如果你需要帮助,你应该发布PHP代码。(把基于DOM的XSS放在一边,因为它太不常见了)。

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

跨站点脚本防御要复杂得多。您不能在打印出的每个变量中都使用htmlspeicalchars($var,ENT_QUOTES),并期望是安全的。这是一个很好的做法,但也应该确保TEST EVERYTHING。我建议使用Sitewatch这样的免费服务,它可以测试xss、sql注入等等。或者你可以使用Acunetix的免费xss扫描仪。

在CSV文件方面,这只是缓慢和繁琐。为此,您应该使用数据库。如果需要提供csv文件,可以选择需要的内容并用PHP打印出来。

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

收集输入后,如果将收集到的数据作为输出显示在页面中,则应该对其进行HTML编码。

这只是冰山一角。安全从来都不是一个可以解决的问题,你只是提高了潜在攻击者的门槛。

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

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

$_SESSION['token'] = md5(rand());if($_SESSION['token'] != $_POST['token']){echo '无效请求!';}其他{//有效的请求!}