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

时间:2011-04-13 18:52:30

标签: php sql security xss

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

现在我正在开发一个页面,它将接受用户输入(最终将在猜谜游戏中猜测)并将其存储在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);
}

℃。 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);
}
?>

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

3 个答案:

答案 0 :(得分:2)

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

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

Cross-Site Scripting防守要复杂得多。您不能只在您打印的每个变量上抛出htmlspeicalchars($var,ENT_QUOTES)并期望安全。这是一个很好的做法,但也应该确保测试一切。我建议使用免费服务,如Sitewatch,它将测试xss,sql注入等等。或者您可以使用Acunetix's free xss scanner

就CSV文件而言,这只是缓慢而繁琐的。您应该使用数据库。如果需要提供csv文件,可以选择所需内容并使用PHP进行打印。

答案 1 :(得分:1)

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

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

但这只是冰山一角。安全永远不是一个解决问题,你只是为潜在的攻击者提高了标准。

答案 2 :(得分:0)

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

但请注意另一个名为Cross Site Request Forgery的漏洞。您必须在表单中添加标记值:

$_SESSION['token'] = md5(rand());

if($_SESSION['token'] != $_POST['token']){
    echo 'Invalid Request!';
}
else{
    //valid request!
}